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