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