USB協議-USB的包結構及包的分類


USB是串行總線,所以數據是一位一位地在數據線上傳送的。既然是一位一位地傳送,就存在着一個數據位先后的問題。USB使用的是LSB在前的方式,即先出來的是最低位數據,接下來是次低位,最后是最高位(MSB)。一個包,又被分成了很多個域(field),而LSB、MSB就是以域為單位來划分的。

USB總線上傳輸數據是以包為基本單位的。一個包被分成不同的域。根據不同類型的包,所包含的域是不一樣的。但是不同的包有個共同的特點,就是都要以同步域開始,緊跟着一個包標識符PID(Packet Identified),最終以包結束符EOF(End Of Packet)來結束這個包。

同步域是用來告訴USB的串行接口引擎數據要開始傳輸了,請做好准備。除此之外,同步域還可以用來同步主機端和設備端的數據時鍾,因為同步域是以一串0開始的,而0在USB總線上就是被編碼為電平翻轉,結果就是每個數據位都發生電平變化,這讓串行接口引擎很容易就能夠恢復出采樣時鍾信號;對於全速設備和低速設備,同步域使用的是00000001(二進制數,總線上的發送順序);對於高速設備,同步域使用的是31個0,后面跟1個1(需要注意的是,這是對發送端的要求,接收端解碼時,0的個數可以少於這個數)。

包結束符EOF,對於高速設備和全速/低速設備也是不一樣的。全速/低速設備的EOF是一個大約為2個數據位寬度的單端0(SE0)信號。SE0的意思就是,D+和D-同時都保持為低電平。由於USB使用的是差分數據線,通常都是一高一低的,而SE0不同,是一種都為低的特殊狀態。SE0用來表示一些特殊的意義,例如包結束、復位信號燈。USB集線器對USB設備進行復位的操作,就是通過將總線設置為SE0狀態大約10ms來實現的。對於高速設備的EOF,使用故意的位填充錯誤來表示。那么如何判斷一個位填充錯誤是真的位錯誤還是包結束呢?這個由CRC校驗來判斷。如果CRC校驗正確,則說明這個位填充錯誤是EOP;否則,說明傳輸出錯。

包標識符PID是用來標識一個包的類型的。它總共有8位,其中USB協議使用的只有4位(PID0~PID3),另外4位(PID4~PID7)是PID0~PID3的取反,用來校驗PID。USB協議規定了4類包,分別是:令牌包(token packet,PID1~0為01)、數據包(data packet,PID1~0為11,)、握手包(handshake packet,PID1~0為10)和特殊包(special packet,PID1~0為00)。不同類的包又分成幾種具體的包。

下表是USB2.0協議中規定的各種PID,其中有些是在USB1.1協議中沒有的,用*號標出:

PID類型

PID

PID[3:0]

說明

令牌類

OUT

0001B

通知設備將要輸出數據

IN

1001B

通知設備將要輸入數據

SOF

0101B

通知設備這是一個幀起始包

SETUP

1101B

通知設備將要開始一個控制傳輸

數據類

DATA0

0011B

不同類的數據包

DATA1

1011B

DATA2*

0111B

MDATA*

1111B

握手類

ACK

0010B

確認

NACK

1010B

不確認

STALL

1110B

掛起

NYET*

0110B

未准備好

特殊類

PRE

1100B

前導(這是一個令牌包)

ERR*

1100B

錯誤(這是一個握手包)

SPLIT*

1000B

分裂事務(這是一個令牌包)

PING*

0100B

PING測試(這是一個令牌包)

-

0000B

保留,未使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM