一、概述
USB總線的數據流是USB主機和USB設備數據通信的基礎。一般來說,一個完整的USB數據流包含3個階段——令牌階段、數據階段、握手階段。
- 令牌階段:定義了傳輸類型,表徵數據流的開始。
- 數據階段:包含了本次傳輸的數據。數據量大小根據端點和傳輸類型而定,最大爲1024Byte。
- 握手階段:用於數據的接收方報告此次數據傳輸是否成功。
二、字段
在USB協議中,USB數據傳輸數據流是由一系列字段構成的。字段是USB數據流中的最小組成單元。字段有以下幾種:
- 同步字段(SYNC):用於數據同步;
- 包標記字段(PID):指明信息包的類型,可以用於差錯控制。
- 地址字段(ADDR):指明USB總線上的一個設備。
- 端點字段(ENDP):指明當前通信使用的USB端點。
- 幀號字段(NUM):指明當前幀的幀號。
- 數據字段(DATA):傳輸的數據。
- 校驗字段(CRC):用於循環冗餘校驗。
1. 同步字段SYNC
由於USB Host和USB Device之間是兩條串行信號線,沒有同步時鐘,因此容易造成數據錯位,導致數據不同步。爲此,在USB協議中使用同步字段進行所有信息包的同步。
- 低速/全速同步字段:同步字段長度爲8bit,數據爲80H。在數據總線上先發送低位,在發送高位,並採用NRZI編碼形式,如圖所示。
- 高速同步字段:同步字段長度爲32bit,數據爲80000000H,發送方式與低速/全速同步字段類似。
2. 包標識字段PID:
詳情可查看:https://blog.csdn.net/haihui1996/article/details/104889037
包標識字段(PID)長度爲8bit,由低4bit的類型字段和高4bit的校驗字段組成。校驗字段是類型字段的反碼。
PID字段有如下4中類型信息包:
- 令牌包:PID[1:0] = 01B;
- 握手包:PID[1:0] = 10B;
- 數據包:PID[1:0] = 11B;
- 特殊包:PID[1:0] = 00B。
3. 地址字段:ADDR
地址字段的長度爲7bit,共有128個地址值。其中0號地址是作爲默認地址,用於USB上電時主機和設備的通信。當USB上電配置完成後,USB主機便重新爲該USB設備分配一個USB地址(地址1到127)。因此USB主機最多隻能有127個設備。
4. 端點字段:ENDP
端點字段的長度爲4bit,共可以表示16個端點,但低於低速USB設備來說,協議只規定了3個端點,而對於高速/全速設備,則可以使用全部16個端點。這些設備中,端點0用於初期的配置,是USB設備必須的。
5. 幀號字段:NUM
幀號字段長度爲11bit,最大值爲07FFH。幀號字段中的值表示了當前幀或小幀的幀號,一般來說,每個幀或小幀發送時,幀號字段裏的內容加1。
6. 數據字段:DATA
數據字段的最大長度爲1024Byte,在數據傳輸時先傳輸低字節,每個字節先傳輸低位,實際數據字段的長度根據傳輸類型和程序的需要決定。
7. 校驗字段:CRC
採用的是循環冗餘校驗,用於保證傳輸的可靠性。令牌包採用5bit的CRC,數據包採用16bit的CRC。
上圖爲一段USB設備上電的通信實例,是主機與設備建立連接的第一步:
- Host發送起始信號幀SOF,表示數據傳輸開始。
- 發送SETUP令牌包,表示USB Host開始配置Device,該令牌包使用默認地址(ADDR)0以及端點(ENDP)0,CRC長度爲5bit;
- 發送數據包,DATA0爲PID字段,用於標識數據編號,Data字段包含通信數據內容,最後爲16bit的CRC校驗碼。
- Device接收到數據之後,向Host反饋ACK應答數據包。