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