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