盧宇清,張 巍
LU Yu-qing1,2, ZHANG Wei2
(1.河南師范大學(xué) 物理與信息工程學(xué)院,新鄉(xiāng) 453007;2.河南農(nóng)業(yè)職業(yè)學(xué)院,鄭州 451450)
Universal Serial Bus(USB)是連接外部設(shè)備和主機(jī)的一種標(biāo)準(zhǔn)接口。隨著微軟在操作系統(tǒng)中內(nèi)置了對(duì)USB接口的支持模塊,加上USB設(shè)備的日漸增多,USB接口逐步走進(jìn)了實(shí)用階段。
USB是一種靈活的接口技術(shù),可替代計(jì)算機(jī)中串行口或并行口,支持許多新型的接口。USB的超強(qiáng)性能意味著要比它所替代的老式串行接口和并行接口都復(fù)雜。實(shí)現(xiàn)USB接口是一個(gè)極大的挑戰(zhàn)。不管是USB主機(jī)一側(cè)的開發(fā),還是USB設(shè)備一側(cè)的開發(fā),從技術(shù)角度來講,都有相當(dāng)?shù)碾y度。
USB總線信號(hào)分析系統(tǒng)其整體功能的實(shí)現(xiàn)是一個(gè)軟硬件協(xié)同工作的過程。USB總線信號(hào)分析系統(tǒng)由六部分組成:用戶USB總線信號(hào)采集電路、CPLD硬件與Verilog程序、FIFO存儲(chǔ)器、MCU硬件與固件程序、設(shè)備驅(qū)動(dòng)程序和信號(hào)分析軟件。前四部分裝配在一塊線路板上,構(gòu)成系統(tǒng)的硬件;后兩部分安裝在分析主機(jī)上,為系統(tǒng)的高層軟件。為使系統(tǒng)正常工作,必須把各種設(shè)備正確連接起來,還要安裝設(shè)備驅(qū)動(dòng)程序和信號(hào)分析軟件。
USB電纜兩端各有一個(gè)連接器,中間不允許分叉。連接到用戶USB總線上需要使用兩個(gè)USB連接器,通過板上的布線直接相連。一個(gè)通過一條電纜連接到用戶USB主機(jī),另一個(gè)連接器通過另外一條電纜連接到用戶設(shè)備。在線路板上放置一個(gè)USB收發(fā)器,與兩個(gè)USB連接器相連。在信號(hào)傳輸?shù)臅r(shí)候,就能同時(shí)接收USB總線上的信號(hào)。
CPLD是一種用戶根據(jù)需要而自行構(gòu)造邏輯功能的數(shù)字集成電路。CPLD是整個(gè)系統(tǒng)中非常關(guān)鍵的一個(gè)部件,它直接決定系統(tǒng)實(shí)現(xiàn)的成功與失敗。因此,必須認(rèn)真分析需求,周密設(shè)計(jì)代碼,合理仿真功能,力求最大限度地有效利用CPLD的功能。
2.2.1 CPLD功能
在USB總線信號(hào)分析系統(tǒng)中,為了準(zhǔn)確地接收USB的數(shù)據(jù)流,CPLD中設(shè)置了去噪聲模塊,既使接收的數(shù)據(jù)中混入了噪聲,接收器也能正常工作。要正確獲得數(shù)據(jù),首先要正確恢復(fù)時(shí)鐘。低速USB的發(fā)送時(shí)鐘為1.5MHz,全速USB的發(fā)送時(shí)鐘為12MHz,CPLD也必須生成相應(yīng)的接收時(shí)鐘信號(hào),為此,CPLD中設(shè)置了一個(gè)相位跟蹤電路(DPLL)。
2.2.2 相位跟蹤電路
DPLL(Digit Phase Lock Loop)是一種使輸出信號(hào)相位與輸入信號(hào)相位保持一致的電路,也就是相位跟蹤電路。在UPA11中,DPLL根據(jù)用戶USB總線的速率產(chǎn)生1.5MHz或12MHz數(shù)據(jù)接收時(shí)鐘,該電路監(jiān)視輸入信號(hào)的變化,一旦發(fā)現(xiàn)信號(hào)出現(xiàn)了邊沿,立即調(diào)整接收時(shí)鐘的相位,確保與發(fā)送時(shí)鐘同步,同時(shí)保證了讀取數(shù)據(jù)的準(zhǔn)確性。
2.2.3 有限狀態(tài)機(jī)(FSM)
FSM(Finite State Machine)稱為有限狀態(tài)機(jī),是CPLD/FPGA中最常用的部件之一。通常,用FSM實(shí)現(xiàn)各種各樣的狀態(tài)轉(zhuǎn)換圖。FSM有四個(gè)狀態(tài),即初始狀態(tài)、SE0狀態(tài)、空閑狀態(tài)和接收狀態(tài),用來表示用戶USB總線的活動(dòng)。這四個(gè)狀態(tài)覆蓋了所有用戶USB總線狀態(tài)和用戶USB總線事件,低速和全速也都支持。
用戶USB總線有四種基本狀態(tài):SE0狀態(tài)、空閑狀態(tài)、J狀態(tài)和K狀態(tài)。空閑狀態(tài)與J狀態(tài)的差別僅在于驅(qū)動(dòng)器是否驅(qū)動(dòng),它們對(duì)應(yīng)的DP、DM和RCV都是相同的。為此,把空閑狀態(tài)與EOP中的J狀態(tài)合二為一,統(tǒng)稱為空閑狀態(tài)。
用戶USB總線傳輸數(shù)據(jù)包時(shí),涉及到的狀態(tài)只有兩個(gè),即J狀態(tài)和K狀態(tài)。把這兩個(gè)狀態(tài)合并為接收狀態(tài),為“正在接收用戶USB總線上的數(shù)據(jù)包”之意。接收狀態(tài)也包括遠(yuǎn)程喚醒信號(hào),只不過接收到的將是以FE打頭,后跟若干個(gè)FF的數(shù)據(jù)包。
用戶USB總線的事件有設(shè)備插入、設(shè)備拔出、設(shè)備復(fù)位、設(shè)備掛起、設(shè)備恢復(fù)等,對(duì)應(yīng)FSM的一種或幾種狀態(tài)。
綜上所述,用戶USB總線狀態(tài)和事件都可以歸納到FSM狀態(tài)機(jī)的一種或幾種狀態(tài)。
根據(jù)USB 1.1規(guī)范,USB總線的速率是由D+或D-的上拉電阻決定的。識(shí)別速率的最準(zhǔn)確的位置應(yīng)該是從SE0狀態(tài)轉(zhuǎn)換到空閑狀態(tài)的時(shí)刻。如果空閑狀態(tài)時(shí)DP=1,則用戶USB總線是全速。否則,如果DM=1,則用戶USB總線是低速。
2.2.4 MCU數(shù)據(jù)包裝配
CPLD輸入信號(hào)是DP,DM和RCV,輸出的則是MCU數(shù)據(jù)包。MCU數(shù)據(jù)包是對(duì)USB數(shù)據(jù)包的再次封裝,其一般格式為:
STX USB數(shù)據(jù)包 ETX
STX是MCU數(shù)據(jù)包的開始,其值為0F;ETX是MCU數(shù)據(jù)包的結(jié)束,其值為04。為了避免USB數(shù)據(jù)包中的STX、ETX被誤認(rèn)為MCU數(shù)據(jù)包的開始結(jié)束,特別增加了“字節(jié)插入”。 “字節(jié)插入”符為Byte_Stuff,其值為05 。當(dāng)USB數(shù)據(jù)包中出現(xiàn)了STX,ETX或Byte_Stuff時(shí),在其前面都要插入一個(gè)Byte_Stuff。例如:
USB數(shù)據(jù)包為:80 C3 03 04 05 06
對(duì)應(yīng)的MCU數(shù)據(jù)包為:0F 80 C3 03 05 04 05 05 06 04
2.2.5 數(shù)據(jù)輸出
數(shù)據(jù)輸出包括輸出隊(duì)列的管理、輸出總線和寫入信號(hào)管理兩部分。輸出隊(duì)列的管理包括取數(shù)據(jù)和指針移動(dòng)。
在USB數(shù)據(jù)包結(jié)束處,如果最后一個(gè)數(shù)據(jù)正好是STX、ETX或Byte_Stuff之一,則輸出順序應(yīng)該是Byte_Stuff、數(shù)據(jù)、ETX。這三個(gè)字節(jié)在同一時(shí)鐘周期出現(xiàn),但輸出一個(gè)字節(jié)要用兩個(gè)時(shí)鐘周期,并且輸出時(shí)一次只能輸出一個(gè)字節(jié)。這時(shí),把同時(shí)出現(xiàn)的數(shù)據(jù)按照既定的Byte_Stuff、數(shù)據(jù)、ETX的順序把標(biāo)志位存放在輸出隊(duì)列中等待輸出。
MCU(Micro Controller Unit),簡稱單片機(jī),是指隨著大規(guī)模集成電路的出現(xiàn)及其發(fā)展,將計(jì)算機(jī)的CPU、RAM、ROM、定時(shí)器和多種I/O接口集成在一片芯片上,形成芯片級(jí)的計(jì)算機(jī)。
MCU主要功能有:MCU初始化;中斷服務(wù)程序;USB標(biāo)準(zhǔn)請(qǐng)求服務(wù)程序;讀取FIFO數(shù)據(jù);向分析主機(jī)轉(zhuǎn)發(fā)數(shù)據(jù)。MCU的主要作用是把CPLD生成的數(shù)據(jù)轉(zhuǎn)發(fā)給分析主機(jī)。
MCU固件分中斷服務(wù)程序和主程序,這兩部分程序交叉執(zhí)行,中斷可能在主程序的任何地方發(fā)生并開始執(zhí)行中斷服務(wù)程序。中斷服務(wù)程序基本上是線性執(zhí)行的,主程序除了初始化部分以外則是無窮循環(huán)執(zhí)行。
USB總線信號(hào)分析系統(tǒng)必須配合適當(dāng)?shù)姆治鲕浖拍馨l(fā)揮作用。分析軟件安裝在計(jì)算機(jī)上,由應(yīng)用程序、動(dòng)態(tài)連接庫、設(shè)備驅(qū)動(dòng)程序三部分組成,它們相互協(xié)調(diào),完成數(shù)據(jù)控制、傳輸、分析等工作。
2.4.1 驅(qū)動(dòng)程序
馬戴的思鄉(xiāng)情結(jié)與隱逸情懷也是聯(lián)系在一起的,他在詩中每次提到回到家鄉(xiāng)就是要去過隱居生活,如其《客行》云:
所有USB設(shè)備必須有匹配的設(shè)備驅(qū)動(dòng)程序才能正常工作,UPA11的設(shè)備驅(qū)動(dòng)程序來自Microchip公司的通用USB驅(qū)動(dòng)程序,當(dāng)前最新版本是Microchip MCHPFSUSB v2.1,可從該公司網(wǎng)站免費(fèi)下載。
2.4.2 應(yīng)用程序?qū)PA11硬件的訪問
應(yīng)用程序?qū)τ布脑L問包括開始捕捉、停止捕捉和讀取數(shù)據(jù)。
控制捕捉是通過向OUT1管道發(fā)送一個(gè)控制位來實(shí)現(xiàn)的,如果向OUT1端點(diǎn)發(fā)送的第一個(gè)字節(jié)的最高位為1,就會(huì)打開硬件捕捉功能;否則關(guān)閉捕捉。捕捉的數(shù)據(jù)是通過IN1端點(diǎn)傳輸?shù)綉?yīng)用軟件的。一旦開始捕捉,應(yīng)用軟件必須始終讀取UPA11的數(shù)據(jù),否則可能丟失數(shù)據(jù)。
2.4.3 快速讀取UPA11的數(shù)據(jù)
一旦啟動(dòng)捕捉,在短時(shí)間內(nèi),CPLD可能輸出大量數(shù)據(jù)。為了防止數(shù)據(jù)丟失,唯一的辦法就是使用緩存。當(dāng)FIFO緩存中存有數(shù)據(jù)以后,MCU必須盡快取出,并存儲(chǔ)到IN1端口的數(shù)據(jù)區(qū),一旦MCU收到主機(jī)發(fā)來的IN數(shù)據(jù)包,可以立即發(fā)送出去。為了減少時(shí)間延遲,MCU內(nèi)部設(shè)置了14個(gè)IN1端口的數(shù)據(jù)區(qū),作為數(shù)據(jù)緩沖。
對(duì)于從FIFO取來的數(shù)據(jù),MCU只是簡單地放入某一個(gè)IN1數(shù)據(jù)區(qū),當(dāng)一個(gè)數(shù)據(jù)區(qū)放滿,則轉(zhuǎn)到下一數(shù)據(jù)區(qū),除非所有數(shù)據(jù)區(qū)都存滿了數(shù)據(jù)。
2.4.4 USB數(shù)據(jù)包分離、檢測(cè)、過濾
從硬件得到的是連續(xù)的數(shù)據(jù)流,首先必須從這些數(shù)據(jù)流中分離出一個(gè)一個(gè)的USB數(shù)據(jù)包,然后才能對(duì)它們進(jìn)行分析和顯示。CPLD在發(fā)送USB數(shù)據(jù)包時(shí)采用了編碼,在應(yīng)用程序中,必須對(duì)這種編碼后的數(shù)據(jù)進(jìn)行解碼,還原出原來的USB數(shù)據(jù)包。
當(dāng)一個(gè)USB數(shù)據(jù)包被分離出來后,首先必須進(jìn)行錯(cuò)誤檢測(cè),找出其中可能存在的各種錯(cuò)誤,包括同步錯(cuò)、PID錯(cuò)、CRC5錯(cuò)、CRC16錯(cuò)等。分析出錯(cuò)誤的類型以后,用戶可以查找錯(cuò)誤的原因。
過濾是UPA11的重要功能,通過使用過濾器,可以僅顯示那些感興趣的數(shù)據(jù)包,而那些SOF、NAK之類的數(shù)據(jù)包可以被屏蔽。
2.4.5 USB數(shù)據(jù)包分析
USB包(Packet)是最小的傳輸單位,其中的數(shù)據(jù)不容易被人們理解,但顯示這些數(shù)據(jù)卻是必需的。如果把一個(gè)USB事務(wù)的所有包集中為獨(dú)立的一項(xiàng),并根據(jù)令牌包恰當(dāng)命名,便很容易讓人們?cè)诟叩膶哟紊侠斫馄渥饔?。一個(gè)USB傳輸或USB請(qǐng)求可能有1~n個(gè)USB事務(wù)組成。如果能在USB傳輸或USB請(qǐng)求的級(jí)別上進(jìn)行歸納分析,并以樹狀層次顯示出來,將有很大的價(jià)值。
為實(shí)現(xiàn)這些功能,必須跟蹤USB主機(jī)和USB設(shè)備的所有數(shù)據(jù)包,確定每一個(gè)數(shù)據(jù)包所處的位置,并根據(jù)上下文總結(jié)出符合邏輯的功能描述。當(dāng)收到一個(gè)USB數(shù)據(jù)包以后,應(yīng)用程序需要做以下處理:根據(jù)狀態(tài)機(jī)的當(dāng)前狀態(tài)和輸入的包,決定下一狀態(tài);根據(jù)當(dāng)前狀態(tài)和下一狀態(tài),在顯示樹的不同層次上建立相應(yīng)的顯示節(jié)點(diǎn);如果條件滿足,為更高的層歸納出一個(gè)概括性的功能。為此,應(yīng)用軟件內(nèi)部設(shè)置了一個(gè)USB數(shù)據(jù)包狀態(tài)機(jī),該狀態(tài)機(jī)始終描述USB主機(jī)與設(shè)備之間數(shù)據(jù)傳輸?shù)臓顟B(tài),它支持USB的四種傳輸類型。
本文在USB1.1規(guī)范的基礎(chǔ)上,根據(jù)國內(nèi)外USB接口的發(fā)展現(xiàn)狀,做了一些研究,也得到了一些有意義的結(jié)果,完成了USB總線信號(hào)分析系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)。但是USB總線信號(hào)分析研究仍處于初級(jí)階段,后期可以進(jìn)行硬件、固件的升級(jí)和應(yīng)用軟件的擴(kuò)展。
[1] 蔡軍生.USB協(xié)議深入分析.[J/OL].
[2] 中國IT實(shí)驗(yàn)室.USB設(shè)備的調(diào)試與測(cè)試技巧.[J/OL].
[3] Microchip Technology Inc.PIC18F2550 Data Sheet(Chinese).[J/OL].