1. 程式人生 > >usb包的結構和分類

usb包的結構和分類

 

USB的傳輸:總是低位在前,高位在後。

USB的傳輸方向:從裝置到主機的資料為輸入;從主機到裝置的資料叫做輸出。

 

1.

包結構

 

以同步域開始,緊跟著一個包識別符號PID(Packet Identifier),最終以包結束符EOP(End of Packet)結束這個包。(同步域+包識別符號PID+包結束符EOP)

 

同步域

1. 作用:① 通知USB序列介面引擎資料要開始傳輸;② 同步主機和裝置之間的時鐘。

2. 格式:① 全速/低速裝置的同步域為00000001;② 高速裝置的同步域為31個0,後面跟1個1;注意:這是對傳送端的要求,接收端在解碼時,0的個數可以少於這個數。

 

包識別符號PID

1. 包識別符號PID是用來標識一個包的型別。

2. PID共有8位,目前USB協議僅使用4位(PID0~PID3),另外4位(PID4~PID7)是PID0~PID3的取反,用來校驗PID。傳輸的順序為PID0,PID1,PID2,PID3,...,PID7。

 

 

包結束符EOP

1. 全速/高速模式的EOP是一個約為2個數據寬度的SE0;

2. 高速模式的EOP是通過故意的位填充錯誤實現的。

3. 單端0(SE0):D+和D-同時保持低電平。

4. 單端0的用處:① 包結束;② 復位訊號(USB集線器對USB裝置的復位操作,就是將匯流排設定為SE0約10ms)。

5. Q: 如何一個位填充錯誤是EOP還是傳輸錯誤?A: 通過CRC校驗,即如果CRC正確,則說明這個位填充是EOP;否則說明傳輸錯誤

 

2.

包分類

 

根據包識別符號PID的不同,包可以分為四種包:

令牌包(token packet, PID1~0為01)

資料包(data packet, PID1~0為11)

握手包(handshake packet, PID1~0為10)

特殊包(special packet, PID1~0為00)

 

 

 

 

令牌包

令牌包用來啟動一次USB傳輸。由於USB是主從結構的拓撲結構,所以所有的資料傳輸都是主機發起的(唯一的例外是支援遠端喚醒的裝置能夠主動改變匯流排的狀態,讓集線器感知到裝置的喚醒訊號,但是這一過程並不傳送資料,只是改變匯流排的狀態)。

 

令牌包分4種:輸出(OUT)、輸入(IN)、建立(SETUP)、幀起始(SOF)。

輸出令牌包:主機將要向裝置傳送一個數據包。

輸入令牌包:主機將要從裝置讀取一個數據包。

建立令牌包:與輸出令牌包幾乎相同,不同之處是建立令牌包只使用DATA0,並且傳送到裝置的控制端點,裝置必須接收建立令牌包。

幀起始令牌包:在每幀(或微幀)開始時傳送,並且以廣播的形式傳送,使得總線上的所有USB全速/高速裝置都可以接收到SOF令牌包。

 

 

OUT、IN、SETUP令牌包結構圖

 

同步域

8位識別符號PID

7位地址

4位端點號

5位CRC5校驗

EOP

 

 

 SOF令牌包結構圖

 

同步域

8位識別符號PID

11位幀號

5位CRC5校驗

EOP

 

 

 

 

資料包

同步域 8位識別符號 PID 位元組0 位元組1… 位元組n 16位CRC16校驗 EOP

             

 

資料包型別不匹配主要發生在握手包

 

 

握手包

 

同步域 8位識別符號PID EOP

     

 

1. ACK:正確接收資料,並且有足夠的空間容納資料。主機和裝置都可以使用ACK來確認,而NAK、STALL、NYET只有裝置才能夠返回,主機不能使用這些握手包。

2. NAK:① 沒有資料需要返回;② 資料接收正確,但是沒有足夠的空間容納資料。

3. STALL:裝置無法執行這個請求或者裝置已掛起。裝置返回STALL,需要主機干預才能解除這種STALL狀態。

4. NYET:只在USB2.0高速裝置輸出裝置中使用,表示裝置本次資料成功接收,但是沒有足夠的空間來接收下一次的資料。主機在下一次輸出資料前,將使用PING令牌包來探測裝置是否有足夠的空間接收資料,以免浪費不必要的頻寬和時間。

 

 

 

 

usb的transaction,包括一個Token包、一個Data包和一個Handshake包。

 

Token、Data和Handshake都屬於四種PID型別中的。

1. Token包只包括SYNC、PID、地址域、CRC,並沒有DATA欄位,它的名字起的很形象,就是用來標記所在transaction裡接下來動作的。

2. Out和Setup Token包,裡面的地址域指明瞭接下來要接收Data包的端點,

3. In Token包,地址域指明瞭接下來哪個端點要傳送Data包。

只有主機才有權利傳送Token包,協議裡就這麼規定的

 

與Token包相比,Data包裡沒了地址域,多了Data欄位,這個Data欄位對於低速裝置最大為8位元組,對於全速裝置最大為1023位元組,對於高速裝置最大為1024位元組。,它就是躲在Token後邊兒用來傳輸資料的。

 

Handshake包的成分,除了SYNC,它就只包含了一個PID,通過PID取不同的值來報告一個transaction的狀態,比如資料已經成功接收了等。