基于PDIUSBD12的USB數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)
1引 言
隨著計(jì)算機(jī)微處理器芯片性能的高速發(fā)展,計(jì)算機(jī)逐漸在各種領(lǐng)域中廣泛使用,但隨之而來(lái)的問(wèn)題是計(jì)算機(jī)本身軟硬件資源的嚴(yán)重不足。為節(jié)省計(jì)算機(jī)的軟硬件資源,USB接口應(yīng)運(yùn)而生。
USB在誕生之初便面對(duì)許多已趨成熟
的計(jì)算機(jī)接口的挑戰(zhàn),這既要求它有對(duì)于其他接口的明顯優(yōu)勢(shì),并不斷完善,才可能被廣大用戶(hù)接受。表1[1]是USB和其他常見(jiàn)總線(xiàn)在幾個(gè)參數(shù)上的比較。
表1 USB及其他常用總線(xiàn)的比較
USB的優(yōu)勢(shì)特點(diǎn):
(1)速度快。高速模式速率為12Mbps,低速模式速率也可達(dá)到1.5Mbps。USB2.0理論上傳輸率可以達(dá)到480Mbps。
(2)安裝配置容易。USB設(shè)備支持即插即用,支持熱拔插。系統(tǒng)對(duì)其進(jìn)行自動(dòng)配置,不占用中斷資源或者DMA資源。USB為接纜和連接頭提供了單一模型,解決了插槽緊張問(wèn)題。
(3)易于擴(kuò)展。用USB連接的外圍設(shè)備數(shù)目最多達(dá)127個(gè),通過(guò)集線(xiàn)器可以使外設(shè)距離達(dá)到12米。
(4)總線(xiàn)供電。USB總線(xiàn)提供最大達(dá)5V,500mA電流,對(duì)于功耗較小的設(shè)備來(lái)說(shuō)這是非常有效的。
(5)使用靈活。USB共有4種傳輸模式以適應(yīng)不同設(shè)備的需要。
(6)價(jià)格便宜。實(shí)現(xiàn)USB功能的模塊具有低廉的價(jià)格。
2 接口芯片PDIUSBD12[2]介紹
PDIUSBD12是Philips公司推出的一種并行接口芯片,它支持多路復(fù)用、非多路復(fù)用和DMA并行傳輸。芯片遵循協(xié)議USB1.1,支持不同用途的傳輸類(lèi)型。PDIUSBD12需要外接微控制器(MCU)來(lái)進(jìn)行協(xié)議處理和數(shù)據(jù)交換,它對(duì)MCU沒(méi)有特殊的要求,因此設(shè)計(jì)者可以選擇適合類(lèi)型的MCU對(duì)芯片進(jìn)行控制,也可以利用Philips公司的固件結(jié)構(gòu)來(lái)做開(kāi)發(fā)。
圖1 PDIUSBD12內(nèi)部結(jié)構(gòu)
PIDUSBD12內(nèi)部含有集成收發(fā)器接口,可通過(guò)端口電阻直接連接到USB通信電纜。PDIUSBD12片內(nèi)集成有3.3V調(diào)節(jié)器,可給收發(fā)器提供電源。該電壓可以外接1.5kΩ的上拉電阻作為輸出,也可以連接內(nèi)部集成的1.5kΩ的上拉電阻作為SoftConnectTM的內(nèi)部電源;由于片內(nèi)集成了6~48MHz 倍頻PLL,因此只需外接低頻晶振就可工作,EMI會(huì)相應(yīng)降低。
位時(shí)鐘恢復(fù)電路將時(shí)鐘從USB數(shù)據(jù)流中恢復(fù)出來(lái),還可以對(duì)頻率漂移和信號(hào)抖動(dòng)進(jìn)行跟蹤。
SIE(串行接口引擎)能完整地執(zhí)行USB協(xié)議,它已經(jīng)被完全固化在芯片內(nèi)部,因此不需要任何固件干涉。這一部分包括同步識(shí)別、并行/串行轉(zhuǎn)換、CRC檢測(cè)/產(chǎn)生、PID確認(rèn)/產(chǎn)生、地址識(shí)別以及握手評(píng)定/產(chǎn)生。
SoftConnect(軟連接)可通過(guò)MCU將指令發(fā)到D+(全速設(shè)備)來(lái)實(shí)現(xiàn)。PDIUSBD12的初始化在MCU發(fā)命令之前完成。下一次連接無(wú)需拔出USB線(xiàn)就可完成。
對(duì)MCU來(lái)說(shuō),PDIUSBD12是一個(gè)有8位數(shù)據(jù)總線(xiàn)和1位地址線(xiàn)的存儲(chǔ)設(shè)備,它支持地址數(shù)據(jù)總線(xiàn)復(fù)用、非地址數(shù)據(jù)總線(xiàn)復(fù)用以及DMA數(shù)據(jù)傳輸方式。
當(dāng)外設(shè)經(jīng)PDIUSBD12連接到集線(xiàn)器后,集線(xiàn)器就會(huì)檢測(cè)外設(shè)的連接狀態(tài)并向主機(jī)報(bào)告。一旦發(fā)現(xiàn)有設(shè)備連接,主機(jī)就發(fā)送一系列請(qǐng)求給集線(xiàn)器,使得集線(xiàn)器在主機(jī)和設(shè)備之間建立一個(gè)通信通道。然后主機(jī)開(kāi)始列舉設(shè)備,列舉成功后,主機(jī)即可從外設(shè)獲得相關(guān)的配置信息對(duì)外設(shè)進(jìn)行配置。只有經(jīng)過(guò)配置以后的外設(shè)才能被主機(jī)識(shí)別,并能和主機(jī)進(jìn)行通信。
3 硬 件 設(shè)計(jì)
此數(shù)據(jù)采集系統(tǒng)的硬件框圖如圖2所示。由于USB的協(xié)議框架比較大,所以MCU使用帶有8kEPROM的89C52。USB接口芯片為 PDIUSBD12。89C52和D12的連接有獨(dú)立的地址數(shù)據(jù)總線(xiàn)方式和復(fù)用的地址數(shù)據(jù)總線(xiàn)方式。由于PDIUSBD12既要接受來(lái)自89C52的命令又要和89C52進(jìn)行通信,而他們使用共同的接口D[0…7],所以D12地址的含義是對(duì)命令和數(shù)據(jù)的選擇。在第一種方式中,用A0腳表示地址位:A0為 1表示命令,A0為0表示讀寫(xiě)的是數(shù)據(jù),將它與89C52的一個(gè)IO口相連。在發(fā)送命令(數(shù)據(jù))前先對(duì)A0進(jìn)行置1(0),然后再把命令(數(shù)據(jù))的內(nèi)容送到數(shù)據(jù)總線(xiàn)上。此時(shí),D12的ALE腳未使用,可直接接地。而我們?cè)诖颂幨鞘褂玫诙N連接方式,命令和數(shù)據(jù)使用不同的地址,地址字節(jié)中僅LSB位具有實(shí)際意義。對(duì)偶數(shù)地址賦值表示送往D12的是讀/寫(xiě)數(shù)據(jù),對(duì)奇數(shù)地址賦值表示往D12寫(xiě)入一個(gè)命令。這種接法中,D12的ALE與89C52的ALE相連,ALE的時(shí)序關(guān)系與89C52跟一般存儲(chǔ)器相連相同,在下降沿對(duì)地址鎖存。此時(shí),A0不使用,應(yīng)該接高電平。89C52的P0口直接與D12的數(shù)據(jù)總線(xiàn)相連,作為并行數(shù)據(jù)和命令傳輸通道。它的時(shí)鐘可以直接從D12的CLKOUT接入,而不需要外接晶振。
圖2 硬件框圖
單片機(jī)采集外界模擬量,轉(zhuǎn)換成數(shù)字量,再經(jīng)過(guò)PDIUSBD12通過(guò)USB接口傳送給PC機(jī)。這其中主要的難點(diǎn)是89C52和PDIUSBD12之間的通信問(wèn)題,所以我們把主要精力集中在USB協(xié)議這一部分上,重點(diǎn)調(diào)通它們之間的通信。
4 軟 件 設(shè) 計(jì)
4.1固件設(shè)計(jì)[3][4]
USB單片機(jī)固件程序通常由三部分組成:第一、初始化單片機(jī)和所有的外圍電路(包括PDIUSBD12);第二、主循環(huán)部分:這部分是可中斷的;第三、中斷服務(wù)程序,可以立即執(zhí)行。根據(jù)USB協(xié)議,任何傳輸都是由主機(jī)開(kāi)始的,這樣單片機(jī)作它的前臺(tái)工作,等待中斷。主機(jī)首先要發(fā)令牌包給USB設(shè)備(這里是PDIUSBD12),PDIUSBD12接收到令牌包后就給單片機(jī)發(fā)中斷,單片機(jī)進(jìn)入中斷服務(wù)程序,首先讀PDIUSBD12的中斷寄存器,判斷 USB令牌包的類(lèi)型,然后執(zhí)行相應(yīng)的操作,因此USB單片機(jī)程序主要就是中斷服務(wù)程序的編寫(xiě)。在 USB單片機(jī)程序中要完成對(duì)各種令牌包的響應(yīng),其中比較難處理的是SETUP包,主要是端口0的編程。
單片機(jī)與PDIUSBD12的通信主要是靠單片機(jī)給PDIUSBD12發(fā)命令和數(shù)據(jù)來(lái)實(shí)現(xiàn)的。 PDIUSBD12的命令字分為三種:初始化命令字、數(shù)據(jù)流命令字和通用命令字。PDIUSBD12給出了各種命令的代碼和地址。單片機(jī)先給PDIUSBD12的命令地址發(fā)命令,根據(jù)不同命令的要求再發(fā)送或讀出不同的數(shù)據(jù)。因此,可以將每種命令做成函數(shù),用函數(shù)實(shí)現(xiàn)各個(gè)命令,以后直接調(diào)用函數(shù)即可。
在編寫(xiě)USB的單片機(jī)固件程序時(shí),需要注意:
單片機(jī)的中斷應(yīng)設(shè)置為電平觸發(fā);中斷后一定要讀上次傳輸狀態(tài)寄存器(命令40-45H),以清除中斷寄存器中的中斷標(biāo)志。這樣PDIUSBD12的中斷輸出才能變回高電平,這一點(diǎn)非常重要。
4.2驅(qū)動(dòng)程序[4]
盡管系統(tǒng)已經(jīng)提供了很多標(biāo)準(zhǔn)接口函數(shù),但編制驅(qū)動(dòng)程序仍然是USB開(kāi)發(fā)中最困難的一件事情,通常采用Windows DDK來(lái)實(shí)現(xiàn)。目前有許多第三方軟件廠商提供了各種各樣的生成工具,像 Compuware的driver works,Blue Waters的Driver Wizard等,它們能夠很容易地在幾分鐘之內(nèi)生成高質(zhì)量的USB 的驅(qū)動(dòng)程序。作為WIN98和WIN2K推薦的一項(xiàng)新技術(shù)來(lái)說(shuō),USB的驅(qū)動(dòng)程序和以往的直接跟硬件打交道的 WIN95的VXD方式的驅(qū)動(dòng)程序不同。它是WDM類(lèi)型的。
在調(diào)試USB設(shè)備時(shí),可使用UsbView程序檢測(cè)設(shè)備是否能被Windows枚舉并配置,如果成功,還可在該程序中查看設(shè)備描述符、配置描述符和端點(diǎn)描述符是否正確,之后可以使用Driver Wizard生成一個(gè)通用驅(qū)動(dòng)程序,在Windows提示安裝驅(qū)動(dòng)程序時(shí),選擇Driver Wizard生成的驅(qū)動(dòng)程序。其實(shí)Driver Wizard生成的僅是一個(gè)Windows控制臺(tái)的應(yīng)用程序,它會(huì)調(diào)用安裝Driver Wizard時(shí)安裝在系統(tǒng)中的通用USB驅(qū)動(dòng)程序。使用該程序就可測(cè)試設(shè)備是否能夠正確傳輸數(shù)據(jù)以及傳輸速度。該程序也可作為最終產(chǎn)品USB傳輸部分的框架;如果不能滿(mǎn)足要求,也可用WDM重新編制驅(qū)動(dòng)程序,用調(diào)試好的USB設(shè)備來(lái)開(kāi)發(fā)、調(diào)試主機(jī)軟件。
4.3用戶(hù)程序
用戶(hù)程序是系統(tǒng)與用戶(hù)的接口,它通過(guò)通用驅(qū)動(dòng)程序完成對(duì)外設(shè)的控制和通信。主機(jī)用戶(hù)程序的編寫(xiě)使用VC編譯環(huán)境下的API函數(shù)實(shí)現(xiàn)。程序中主要用到兩個(gè)API函數(shù):CreateFile( )和DeviceIoControl( )。首先查找設(shè)備,打開(kāi)設(shè)備的句柄:調(diào)用Win32函數(shù)CreatFile( )得到設(shè)備驅(qū)動(dòng)程序的句柄。然后進(jìn)行讀寫(xiě)和控制操作:調(diào)用Win32函數(shù)DeviceIoControl()通過(guò)得到的句柄把IOControlCode 和相關(guān)的輸入輸出緩沖區(qū)提交給驅(qū)動(dòng)程序。最后關(guān)閉設(shè)備句柄:當(dāng)退出用戶(hù)程序時(shí),用CloseHandle ( )關(guān)閉設(shè)備。
4.4軟件設(shè)計(jì)框圖及主要程序框架
圖3 固件結(jié)構(gòu)和數(shù)據(jù)流向
這里只給出主循環(huán)程序和中斷程序的主要框架:
void main (void)
{
init_port ( ); //初始化I/O口
init_timer0 ( ); //初始化定時(shí)器0
init_special_interrupts ( ); //設(shè)置中斷
reconnect_USB( ); //重新連接USB
while ( TRUE )
{
if (bEPPflags.bits.timer)
//定時(shí)器溢出,檢測(cè)按鍵狀態(tài)
if (bEPPflags.bits.bus_reset)
//總線(xiàn)復(fù)位處理
if (bEPPflags.bits.suspend)
//掛起改變處理
{
if(D12SUSPD == 1)
//掛起處理
}
if(bEPPflags.bits.setup_packet)
//Setup包處理
{
control_handler( );
//調(diào)用請(qǐng)求處理子程序
}
}
}
void control_handler( ) //請(qǐng)求處理子程序
{
if (type == USB_STANDARD_REQUEST) //調(diào)用標(biāo)準(zhǔn)請(qǐng)求
( *StandardDeviceRequest [ req ] ) ( );
}
5 總 結(jié)
此數(shù)據(jù)采集系統(tǒng)已經(jīng)應(yīng)用于一種自主開(kāi)發(fā)的近紅外光譜儀中,它滿(mǎn)足此近紅外光譜儀采集速度快的要求。以上方案為中小型智能儀器和計(jì)算機(jī)的高速USB連接提供了一種參考。
參 考 文 獻(xiàn):
[1]邊海龍,賈少華. USB2.0設(shè)備的設(shè)計(jì)與開(kāi)發(fā)[M].北京:人民郵電出版社,2004年1月.
[2]陳軍波,劉海華,陳亞光.USB接口芯片PDIUSBD12及應(yīng)用[J].國(guó)外電子元器件,2002第11期.
[3]程 讕,楊子杰. 基于PDIUSBD12的USB設(shè)備的固件程序開(kāi)發(fā)[J]. 計(jì)算機(jī)應(yīng)用,2004年第7期.
[4]周立功. PDIUSBD12固件編程與驅(qū)動(dòng)開(kāi)發(fā)[M].北京:北京航空航天大學(xué)出版社.2003年2月.
評(píng)論