今天我們來詳細(xì)地說說數(shù)據(jù)包的結(jié)構(gòu)以及它們的傳輸過程。USB是串行總線,所以數(shù)據(jù)是一位一位地在數(shù)據(jù)線上傳送的。既然是一位一位地傳送,就存在著一個數(shù)據(jù)位先后的問題。usb使用的是LSB在前的方式,即先出來的是最低位數(shù)據(jù),接下來是次低位,最后是最高位(MSB)。一個包,又被分成了很多個域(field),而LSB、MSB就是以域?yàn)閱挝粊韯澐值摹?/p>
前面說過,USB數(shù)據(jù)在發(fā)送到總線上之前,要先經(jīng)過位填充,再經(jīng)過NRZ1編碼。在這里討論時,所用的數(shù)據(jù)都是原始的數(shù)據(jù),即沒有經(jīng)過位填充和NRZ編碼的原始數(shù)據(jù)。以后也是如此,凡是沒有明確說明是位填充或NRZI編碼過的數(shù)據(jù),默認(rèn)為原始的數(shù)據(jù)。另外還有一個數(shù)據(jù)傳輸方向的問題,因?yàn)樵赨SB系統(tǒng)中,主機(jī)處于主導(dǎo)地位,所以把從設(shè)備到主機(jī)的數(shù)據(jù)叫做輸入,從主機(jī)到設(shè)備的數(shù)據(jù)叫做輸出。
USB總線上傳輸數(shù)據(jù)是以包為基本單位的。一個包被分成不同的域。根據(jù)不同類型的包,所包含的域是不一樣的。但是不同的包有個共同的特點(diǎn),就是都要以同步域開始,緊跟一個包標(biāo)識符PD( Packet Identifier),最終以包結(jié)束符EOP(End Of Packet)來結(jié)束這個包。
同步域是用來告訴USB的串行接口引擎數(shù)據(jù)要開始傳輸了,請做好準(zhǔn)備。除此之外,同步域還可以用來同步主機(jī)端和設(shè)備端的數(shù)據(jù)時鐘,因?yàn)橥接蚴且砸淮?開始的,而0在USB總線上就被編碼為電平翻轉(zhuǎn),結(jié)果就是每個數(shù)據(jù)位都發(fā)生電平變化,這讓串行接口引擎很容易就能恢復(fù)出采樣時鐘信號;對于全速設(shè)備和低速設(shè)備,同步域使用的是0000001(二進(jìn)制數(shù),線上的發(fā)送順序);對于高速設(shè)備,同步域使用的是31個0,后面跟1個1(需要注意的是,這是對發(fā)送端的要求,接收端解碼時,0的個數(shù)可以少于這個數(shù))。
圖1是一個全速或者低速USB數(shù)據(jù)包的同步域經(jīng)過NRZ編碼后的波形。這個波形有7次電平翻轉(zhuǎn),即對應(yīng)著7個0,最后一個電平不翻轉(zhuǎn),即對應(yīng)著1個1當(dāng)串行接口引擎檢測到一個位的數(shù)據(jù)未發(fā)生翻轉(zhuǎn)后(即收到數(shù)據(jù)1),就認(rèn)為包標(biāo)識符PID開始了,如圖1.9.1中的PID0PD1,就是包標(biāo)識符的最低兩位。


圖1 全速設(shè)備和低速設(shè)備的同步域
包結(jié)束符EOP,對于高速設(shè)備和全速/低速設(shè)備也是不一樣的。全速/低速設(shè)備的EOP是一個大約為2個數(shù)據(jù)位寬度的單端0(SE0)信號。SE0的意思就是,D+和D同時都保持為低電平。由于USB使用的是差分?jǐn)?shù)據(jù)線,通常都是一高一低的,而SE0不同,是一種都為低特殊的狀態(tài)。SE0用來表示一些特殊的意義,例如包結(jié)束、復(fù)位信號等。前面提到USB集線器對USB設(shè)備進(jìn)行復(fù)位的操作,就是通過將總線設(shè)置為SE0狀態(tài)大約10ms來實(shí)現(xiàn)的。對于高速設(shè)備的EOP,使用故意的位填充錯誤來表示。那么如何判斷一個位填充錯誤是真的位填充錯誤還是包結(jié)束呢?這個由CRC校驗(yàn)來判斷。如果CRC校驗(yàn)正確,則說明這個位填充錯誤是EOP;否則,說明傳輸出錯。具體的定義請參看USB協(xié)議,這里只要知道有EOP這么一個東西就行了。
包標(biāo)識符PID是用來標(biāo)識一個包的類型的它總共有8位,其中USB協(xié)議使用的只有4位(PID~PID3),另外4位(PI4~PID7)是PID~PD3的取反,用來校驗(yàn)PID。USB協(xié)議規(guī)定了4類包,分別是令牌包(token packet,PD1~0為01)、數(shù)據(jù)包( data packet,pid1~0為11)、握手包(handshake packet,piD~0為10)和特殊包( special packet,PiD1~0為00)。不同類的包又分成幾種具體的包。圖2 是USB2.0協(xié)議中規(guī)定的各種PID,其中有些是在USB1.1協(xié)議中沒有的,用號標(biāo)出。


圖2 USB2.0中定義的各種PID
以上是數(shù)據(jù)包的結(jié)構(gòu)以及它們傳輸?shù)倪^程,今天的分享就到這里。
往期回顧:
●USB的四種傳輸類型之控制傳輸
●指針和數(shù)組的恩恩怨怨
●USB的四種傳輸類型之中斷傳輸?shù)葧r傳輸
-
usb
+關(guān)注
關(guān)注
60文章
8441瀏覽量
284692 -
數(shù)據(jù)包
+關(guān)注
關(guān)注
0文章
270瀏覽量
25605
原文標(biāo)題:USB的包結(jié)構(gòu)以及包的類型
文章出處:【微信號:gh_e7f294a514ca,微信公眾號:單片機(jī)匠人】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
CW32R030可以兼容BLE及XN297L數(shù)據(jù)包,請問這個XN297L數(shù)據(jù)包是什么?
bk3633 usb 設(shè)備如何讀取主機(jī)向端點(diǎn)0 發(fā)送數(shù)據(jù)包
使用CW32W031類mesh通訊的時候,節(jié)點(diǎn)傳輸過一次這包數(shù)據(jù)之后就不會再收到了吧?
串行通信接口的結(jié)構(gòu)和功能
串口DMA接收數(shù)據(jù)包丟失怎么解決?
如何保障遠(yuǎn)程運(yùn)維過程中的數(shù)據(jù)安全和隱私?
數(shù)據(jù)包的結(jié)構(gòu)及傳輸過程
評論