智能儀器中數(shù)據(jù)高速傳輸?shù)腢SB實(shí)現(xiàn)
關(guān)鍵詞:PDIUSBD12;DS87C520;雙數(shù)據(jù)指針
引言
在高速的數(shù)據(jù)采集系統(tǒng)中,需要PC和現(xiàn)場(chǎng)智能儀器之間進(jìn)行大量的數(shù)據(jù)交換,這就要求PC機(jī)和現(xiàn)場(chǎng)之間必須擁有高速的數(shù)據(jù)傳輸通訊接口,才能保證系統(tǒng)的實(shí)時(shí)性和可靠性。新一代通用串行總線(xiàn)接口USB的優(yōu)良特性給我們提供了極佳的解決方案。在高速數(shù)據(jù)傳輸過(guò)程中,由于采樣頻率較高,尤其頻率在1MHz以上的應(yīng)用,普通單片機(jī)是無(wú)法勝任的。Maxim公司的DS87C520就能夠達(dá)到高速數(shù)據(jù)傳輸?shù)囊蟆?/P>
PDIUSBD12簡(jiǎn)介
Philips公司提供的PDIUSBD12芯片是一款性?xún)r(jià)比很高的USB器件,它通常用作微機(jī)控制器進(jìn)行通訊的高速通用并行接口,PDIUSBD12完全符合USB1.1版的規(guī)范,也符合大多數(shù)器件的分類(lèi)規(guī)格。PDIUSBD12所具有的低掛起功耗連同LazyClock輸出可以滿(mǎn)足使用ACPI、OnNOW和USB電源管理的要求。低的操作功耗可以應(yīng)用于使用總線(xiàn)供電的外設(shè)。此外,它還集成了許多特性,包括SoftConnet、GoodLink、可編程時(shí)鐘輸出、低頻晶振和終止寄存器集合,支持本地的DMA傳輸。D12芯片給我們提供了3個(gè)端點(diǎn),每個(gè)端點(diǎn)都有輸入和輸出端點(diǎn)各一個(gè),同時(shí)端點(diǎn)2還提供了4種方式的數(shù)據(jù)傳輸方法,本系統(tǒng)采用的是非同步模式,USB的端點(diǎn)結(jié)構(gòu)見(jiàn)表1。
PDIUSBD12的端點(diǎn)1進(jìn)行命令的傳輸和應(yīng)答,而端點(diǎn)2進(jìn)行數(shù)據(jù)的高速傳輸和海量傳輸。端點(diǎn)1每次接收計(jì)算機(jī)發(fā)送過(guò)來(lái)的2個(gè)字節(jié)指令,每接收2組后為一個(gè)完整的命令。通過(guò)一個(gè)校驗(yàn)位來(lái)判斷命令字是否正確,如果命令字正確,則通過(guò)端點(diǎn)2發(fā)送或接收數(shù)據(jù)。而USB的傳輸速率可以達(dá)到12Mbps,比RS-232的傳輸速率提高了100倍,這樣,USB以12Mbps與采樣系統(tǒng)進(jìn)行數(shù)據(jù)交換,需要1000K/12000K=0.08s的傳輸時(shí)間,因此,PC機(jī)可以實(shí)現(xiàn)和智能儀器的高速數(shù)據(jù)交換。
表1 非同步模式圖
圖1 硬件原理圖
圖2 軟件流程圖
DS87C520簡(jiǎn)介
DS87C520是Maxim公司生產(chǎn)的一種新型高速全靜態(tài)CMOS單片機(jī),它與8051單片機(jī)的管腳和指令集完全兼容。DS87C520的處理器核心經(jīng)過(guò)重新設(shè)計(jì),一個(gè)機(jī)器周期只占4個(gè)時(shí)鐘周期。實(shí)際應(yīng)用表明,若晶振頻率相同,執(zhí)行相同指令的速度是8051的1.5到3倍。DS87C520最高時(shí)鐘頻率為33MHz,執(zhí)行一個(gè)單字節(jié)指令的速度最快可達(dá)到121ns。除此之外,還具有兩個(gè)新型全雙工串行口,13個(gè)中斷,雙數(shù)據(jù)指針,電源電壓下降自動(dòng)復(fù)位,可編程看門(mén)狗定時(shí)器,電源電壓下降中斷功能等。雙數(shù)據(jù)指針使數(shù)據(jù)塊傳送速度得到提高。DPTR0(82h,83h)和8051的DPTR用法相同,用于訪問(wèn)片外RAM或外設(shè)。DPTR1(84h,85h)是新增的數(shù)據(jù)指針。DPTR選擇位(DPS)通過(guò)設(shè)置SFR的寄存器86h的低位實(shí)現(xiàn),通過(guò)使用INC指令,就可以切換DPTR的選擇。所有與DPTR有關(guān)的指令都使用當(dāng)前選擇的DPTR。因此,只需要用一條指令就可從源地址切換到目的地址。DS87C520與8051單片機(jī)最突出的區(qū)別就是速度的提高,這樣,在高速的數(shù)據(jù)傳輸過(guò)程中就可以解決智能儀器采樣頻率低的問(wèn)題了。
系統(tǒng)的工作原理
根據(jù)USB協(xié)議,任何傳輸都是由主機(jī)(host)開(kāi)始的,單片機(jī)DS87C520的前臺(tái)工作就是等待工作。主機(jī)PC首先要發(fā)送令牌包給USB, PDIUSBD12接收到令牌包就給單片機(jī)發(fā)中斷,單片機(jī)DS87C520進(jìn)入中斷服務(wù)程序。首先讀PDIUSBD12的中斷寄存器,判斷USB令牌包的類(lèi)型,然后執(zhí)行相應(yīng)的操作。因此,USB單片機(jī)程序主要就是中斷服務(wù)程序的編寫(xiě)。在USB單片機(jī)程序中要完成對(duì)各種令牌包的響應(yīng),主要是對(duì)端口的編程。
硬件部分的設(shè)計(jì)
本系統(tǒng)的硬件結(jié)構(gòu)框圖如圖1所示。PDIUSBD12的DATA0-DATA7與DS87C520的P0-P7實(shí)現(xiàn)上位機(jī)和智能儀器之間數(shù)據(jù)的雙向通訊。ALE為地址鎖存使能。本系統(tǒng)ALE接為低電平,表示一個(gè)獨(dú)立的地址和數(shù)據(jù)總線(xiàn)配置。PDIUSBD12的A0腳可與DS87C520的任意一個(gè)I/O口相連,該端口控制PDIUSBD12的命令和數(shù)據(jù)狀態(tài)。DS87C520頻率的輸入可由PDIUSBD12的CLKOUT提供。GL_N技術(shù)提供良好的USB連接指示。在枚舉中,LED指示根據(jù)通信的狀況間歇閃爍,當(dāng)PDIUSBD12成功地枚舉和配置后,LED指示燈一直點(diǎn)亮。隨后與PDIUSBD12之間的成功傳輸將關(guān)閉LED。PDIUSBD12的晶振是6MHz。VOUT3.3是3.3V的調(diào)整輸出,要使器件工作在3.3V,需要對(duì)VCC和VOUT3.3腳都提供3.3V電壓。而DMREQ、DMACK_N是用作DMA請(qǐng)求的,由于本系統(tǒng)未采用DMA,所以這兩腳是懸空的。PDIUSBD12的傳輸速率是12Mbps,DS87C520的最高晶振頻率為33MHz,一個(gè)指令周期最快可達(dá)到121ns,這樣使得PC和現(xiàn)場(chǎng)的智能儀器之間可以進(jìn)行高速和實(shí)時(shí)的數(shù)據(jù)傳輸。
軟件部分的設(shè)計(jì)
單片機(jī)和PDIUSBD12通訊主要是靠單片機(jī)給PDIUSBD12發(fā)命令和數(shù)據(jù)實(shí)現(xiàn)的。PDIUSBD12的命令字可以分為三種:初始化命令字、數(shù)據(jù)流命令字和通用命令字。PDIUSBD12給出了各種命令的代碼和地址。單片機(jī)先給PDIUSBD12的命令地址發(fā)命令,根據(jù)不同命令的要求再發(fā)送和讀出不同的數(shù)據(jù)。因此,可以編寫(xiě)不同功能的函數(shù),用函數(shù)實(shí)現(xiàn)各個(gè)命令,以后直接調(diào)用函數(shù)即可。軟件流程圖如圖2所示。
?上位機(jī)軟件部分的介紹
上位機(jī)的程序主要是調(diào)用4個(gè)未公開(kāi)的API函數(shù),根據(jù)上位機(jī)對(duì)USB端口的使用情況,分別用VC、VB、Delphi等調(diào)用這四個(gè)函數(shù)就可以實(shí)現(xiàn)上位機(jī)對(duì)USB端口的操作。
DWORD_stdcall ReadPort1(BYTE *pData,size_t iLen)
DWORD_stdcall WritePort1(BYTE *pData,size_t iLen)
DWORD_stdcall ReadPort2(BYTE *pData,size_t iLen)
DWORD_stdcall WritePort2(BYTE *pData,size_t iLen)
其中:pData為指向接收數(shù)據(jù)緩沖區(qū)的指針,iLen為接收數(shù)據(jù)的長(zhǎng)度。
?下位機(jī)軟件部分的介紹
下位機(jī)的軟件部分由初始化單片機(jī)、所有的外圍電路、主循環(huán)部分和中斷服務(wù)程序組成。主循環(huán)主要是對(duì)單片機(jī)初始化及對(duì)USB端口和一些變量的定義。中斷程序主要是通信協(xié)議的判斷、命令字的讀寫(xiě)和數(shù)據(jù)的讀寫(xiě),只要讀者深刻了解這段中斷程序,再相應(yīng)地進(jìn)行一些變量的定義,就可以輕松地在PC和DS87C520之間進(jìn)行數(shù)據(jù)傳輸。
void datarw(void)
{ If(bEPPflags.bits.ep1_rxdone){ //端點(diǎn)1接收有效
DISABLE;
BEPPfalgs.bits.ep1_rxdone=0; //清端點(diǎn)1接收有效
ENABLE;
If(bEPPflags.bits.timer) //分兩次進(jìn)行命令字的讀取
{ ComEpBuf[0]=GenEpBuf[0];
ComEpBuf[1]=GenEpBuf[1];
ComEpBuf[2]=GenEpBuf[2];
ComEpBuf[3]=GenEpBuf[3];
Commandflag=0;
DISABLE;
BEPPflags.bits.timer=0; //定時(shí)器1溢出清定時(shí)器
ENABLE;}
else
{ ComEpBuf[4]=GenEpBuf[0];
ComEpBuf[5]=GenEpBuf[1];
ComEpBuf[6]=GenEpBuf[2];
ComEpBuf[7]=GenEpBuf[3];
Check_data=ComEpBuf[0]^ ComEpBuf[1] ^ ComEpBuf[2] ^ ComEpBuf[3] ^ ComEpBuf[4] ^ ComEpBuf[5] ^ ComEpBuf[6] ^ ComEpBuf[7];
//如果校驗(yàn)和正確就進(jìn)行應(yīng)答值的判斷
If(check_dat==ComEpBuf[7]) {GenEpBuf[0]=0x55; GenEp Buf[1]=0xaa;}
Else{ GenEpBuf[0]=0xaa; GenEpBuf[1]=0x55;}
D12_WriteEndpoint(3,2,GenEpBuf); //命令字的讀寫(xiě)
D12_WriteEndpoint(3,2,EpBuf);}}} //數(shù)據(jù)的讀寫(xiě)
驅(qū)動(dòng)程序的設(shè)計(jì)
USB接口的驅(qū)動(dòng)程序主要實(shí)現(xiàn)以下的功能:USB接口器件的初始化;計(jì)算上層數(shù)據(jù)包的校驗(yàn)和,發(fā)送上層的數(shù)據(jù)包;發(fā)送SOF幀;接收從USB接口傳送來(lái)的數(shù)據(jù),并檢查數(shù)據(jù)的有效性;將接收到的數(shù)據(jù)送往上層。雖然Windows系統(tǒng)提供了很多USB設(shè)備的驅(qū)動(dòng)程序,但編制驅(qū)動(dòng)程序仍然是USB開(kāi)發(fā)中最為困難的事。USB設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)是基于WDM的。對(duì)于USB的設(shè)備來(lái)說(shuō),驅(qū)動(dòng)可分為USB總線(xiàn)驅(qū)動(dòng)程序和USB功能驅(qū)動(dòng)程序。USB總線(xiàn)驅(qū)動(dòng)程序由操作系統(tǒng)提供,它負(fù)責(zé)與實(shí)際硬件打交道,實(shí)現(xiàn)繁瑣的底層通信。USB功能驅(qū)動(dòng)程序由設(shè)備開(kāi)發(fā)者編寫(xiě),位于USB總線(xiàn)驅(qū)動(dòng)程序的上面,通過(guò)向USB總線(xiàn)驅(qū)動(dòng)程序發(fā)送中斷程序,來(lái)實(shí)現(xiàn)對(duì)USB設(shè)備信息的發(fā)送或接收。
結(jié)語(yǔ)
USB1.1協(xié)議的優(yōu)點(diǎn)在于,為PC和智能儀器之間提供了一種快速和方便的數(shù)據(jù)交換方式。同時(shí),USB可以采用“級(jí)聯(lián)”方式,通過(guò)這種菊花鏈?zhǔn)降倪B接,一個(gè)USB控制器可以連接多達(dá)127個(gè)外設(shè),每個(gè)外設(shè)間的距離可達(dá)5米。USB為PC的外設(shè)擴(kuò)充提供了一個(gè)很好的解決方案?!?/P>
參考文獻(xiàn)
1 Philips Corp. PDIUSBD12 Users Manual.2001,10
2 張力. Visual C++ 高級(jí)編程. 人民郵電出版社[M].2002,3.pp426-436
3 Jan Axelson. Universal Serial Bus Complete[M].中國(guó)電力出版社.2002,7(3).pp145-150
評(píng)論