本文轉自公眾號歡迎關注
基于DWC2的USB驅動開發-USB包詳解 (qq.com)
一.前言
不管什么通訊協議,比如UART,SPI,USB等等,不管是并口還是串口,不管是同步還是異步,我們從抽象的角度去看,其本質都是一樣的。都是先定義物理信號,物理信號可能是差分,單端,電流驅動電壓驅動等等,不管是什么樣的物理信號,我們從抽象角度看就是不同的物理狀態和數字1和0的對應, 這里的狀態不一定是電壓(雖然數字通訊大部分就是電壓),也可能是頻率,相位等等,這里的狀態也不一定是電平狀態也可能是跳變狀態,只要是有不同狀態可以區分的都可以,甚至你可以自由發揮自我創造。這里的數字1和0即bit,至此我們就到了數字的世界,一切都是1和0的世界了,這個轉化是由PHY的收發器完成的。bit再按照一定規則組成幀或者包,然后在包的基礎上定義各層協議。任意的通信協議都不外呼上述的過程,USB也是如此。這樣一看USB也沒有那么可怕了,和我們用的UART等協議本質是一樣的,只是物理層信號不一樣,協議不一樣而已。這一篇我們就來介紹協議層,底層相關的一些內容,這一篇主要關注USB的包,不涉及物理層信號,也不管位填充等等。
二.協議的一般約定
上面提到,協議都是建立在bit之上的,bit組成byte然后組成包或者幀。那么對于bit和byte在總線上的出現就有一個順序的約定,對于bit先發低位即 LSb ,對于byte先發低字節即 LSB 。對于協議中的多字節數據域都是 小端模式 ,即低字節在低地址,總線上先發送。
三.包組成
前面提到了包就是一系列的1,0序列組成,但是為了協議能解析,包需要分成一些特定的區域以代表不同的功能。比如一些常見的協議一般都有同步域,頭,負載,校驗等部分。
USB也類似,下面就介紹USB包的組成部分,不同包類型可能由不同的部分扭組合而成。
3.1SYNC同步域
所有USB的數據包以一個SYNC同步區域開始,接收電路可以利用該區域進行時鐘對齊。類似的CAN協議也有硬同步機制都差不多。所謂的硬對齊即通過一個特殊的狀態(區別于正常的數據,比如一個長串的1,長串的0,任何可以區別于其他狀態的都可以)來表示開始,然后以該開始狀態后的一個時鐘邊沿作為對齊。
SYNC的最后兩位用于標志SYNC的結束,承接PID的開始。
我們看到SYNC就是KJ對,所以有,邊沿這樣接收端就可以根據這些邊沿進行和北部時鐘同步,注意有意第一個KJ對有失真,所以不能用于同步。
SYNC是包的同步機制,不含協議層的有效信息,所以一般協議分析中就不會體現這部分了,只有硬件分析時才可能關注該部分,比如要示波器抓包則可以設置觸發條件來觸發到包頭觸發。
另外圖中SYNC開始,即從Idle到K也叫SOP,表示包的開始。
3.1.1全速/低速
8位:3個KJ對加兩個K,KJKJKJKK
如下所示
3.1.2高速
32位:15個KJ對加兩個K,KJKJKJKJ KJKJKJKJ KJKJKJKJ KJKJKJKK .
當重復數據包時,集線器允許從SYNC開始最多丟棄4位,但不能破壞SYNC字段的任何重復位。因此,在被5個集線器重復之后,SYNC字段可以短至12位。
但是注意對于接收方不一定要接收8位或者32位,對于高速接收到至少12位就算(KJKJKJKJKJKK)
3.2包ID區域
SYNC后面就是PID區域,可以看到和我們通常的協議都是一個套路,比如我們使用串口自定義應用層協議,一般前面會用幾個特殊字節作為同步域用于標志包的開頭,如果用AA,55這種還可以用于時鐘同步,波特率自適應。然后定義一個TYPE字段表示該包的作用和類型,這樣看來USB也不過如此,這種套路我們早就用過很多了。
USB的PID定義如下,用于表示包的類型,
低4位為包類型編碼,高四位為其取反用于校驗,接收方如果校驗低4位不是高4位的取反則為PID錯誤。對于編碼類型位定義或者PID校驗錯誤的包丟棄。
對于PID合法但是不符合預期的比如對IN端點收到了OUT令牌則不響應。
PID的編碼如下,注意如下是按照高位在左,實際傳輸是低位先傳輸,注意觀察下表
可以看到PID分為了4組,通過PID<0:1> 區分。
比如,以下為一個控制傳輸的實例,和上表對應,高低4位相加都是0xF
SETUP是0x2D
DATA0 是0xC3
ACK是0xD2
IN是0x69
NAK是0x5A
3.3地址域
地址域包括功能地址域和端點域。地址域必須完全獨立匹配,不容許重名(別名),不符合的SETUP必須忽略,訪問未初始化的端點的SETUP也要忽略。
一個設備對應一個地址,地址有7位,所以可以尋址128個設備。
一個設備地址對應一個功能,默認設備地址是0,在枚舉階段,標準請求設置地址。
設備地址0即做枚舉使用,不能分配給其他使用。
IN,STEUP,OUT,PING,SPLIT都需要帶ADDR以表明是和哪個設備通訊。
ADDR后面是端點域,4位可以表示16個端點。所以可以到設備最多16個端點。
端點0用于控制傳輸是必須支持的,所以很多控制端點是默認使能的,不需要手動使能,
其他端點是功能相關。
SETUP,IN,OUT,PING都要帶端點,表示和哪個端點通訊。
低速設備支持最多3個端點,控制端點0+兩個端點(兩個控制端點,控制端點+中斷端點,或者兩個中斷端點)。
注意控制端點不一定要是端點0,也可以是其他端點,但是必須要有端點0的控制端點。
全速和高速設備支持最多16個IN和OUT端點。
3.4幀序號域
幀序號區域11位,由主機每1mS遞增1.
到達最大值0x7FFH時繞回,只有SOF包中有。
SOF包在低速全速時是1mS發一次,
高速則是125uS發一次,注意只有1mS才子等一次,即一個微幀內不遞增,也就是8個SOF才遞增一次。
3.5數據域
數據域范圍從0到1024字節,不同速度不同端點類型長度不一樣,低字節先發
不同速度不同端點類型包長如下表
控制 | 中斷 | 批量 | 同步 | |
---|---|---|---|---|
高速 | 64 | ≤1024 x 3 | 512 | ≤1024 x 3 |
全速 | 8, 16, 32, 64 | ≤64 | 8, 16, 32, 64 | ≤1023 |
低速 | 8 | ≤8 | 無 | 無 |
3.6校驗域
校驗區域采用CRC校驗,保護非PID區域,這里為什么不包括PID呢? 因為PID自帶校驗了。
注意:CRC是在bit填充之前生成的,帶CRC的結果之后才是bit填充,接收是先bit填充恢復,然后才是CRC計算。這個很好理解bit填充是硬件層對于信號編碼的處理,所以是最后一步,CRC是協議層的內容肯行在前。
對于CRC錯誤的丟棄該部分數據,一般就是整個包。
Token的CRC
對IN,SETUP和OUT包的ADDR ENDP部分
SOF包的時間戳部分
PING和SPLIT包的ADDR ENDP部分
進行5位CRC校驗。
G(X) = X5+ X **2 ** + 1
數據的CRC
數據包使用16位CRC,對數據域進行校驗
G(X) = X16+ X15+ X **2 ** + 1
四.各種包格式
4.1令牌包
PID可以是IN,OUT,SETUP,PING
只有主機才能發令牌包,為什么呢? 因為USB架構是主從架構的,只有主機發起通訊,即由令牌包開始,從機才能會響應,否則這么多設備一起啟動發送就會亂套了。哪怕是設備要發送數據也是必須要主機發IN令牌包,從機才能響應。
令牌和SOF包由數據之后三字節的EOP間隔。如果一個數據包解碼為非有效的令牌或SOF沒有有效的EOP終止,則它必須被視為無效包被忽略。
4.2SOF包
全速時1.00 ms ±0.0005 ms 發一次SOF包
高速則125 μs ±0.0625 μs 發一次
SOF包不需要響應。
SOF包由主機或者HUB發送
注意高速的微幀內幀序號是不遞增的,只有下一個ms才遞增,可以通過判斷幀號的遞增來同步到該微幀是1ms內的第一個微幀,接下來的是剩余的7個。
4.3數據包
數據包有以下幾種
DATA0,DATA1,DATA2,MDATA
DATA1 DATA1 DATA0用于高帶寬ISO傳輸,即一個微幀傳3包則按照DATA2-DAT1-DATA0傳輸。
DATA1-DATA0用于傳輸翻轉差錯控制
不同速度的不同傳輸類型包長不一樣進前面的說明。
4.4握手包
握手包用于數據傳輸時報告狀態, 反應數據命令是否成功接收或接受,流控,halt等。
注意不是所有的包都需要握手,比如ISO數據是不需要握手的,因為其注重實時性,不管可靠性,IN和OUT數據之后對方收沒收到不管,好比UDP和TCP的區別。
例如如下的ISO的IN,設備返回數據后主機是不需要回ACK的
握手包格式如下,只有PID域:
握手包有如下幾種類型,具體什么情況回什么包,可以參考規格書的第8章的不同傳輸的拓撲圖,比如對于中斷傳輸的IN設備可能回NAK和STALL。
4.4.1ACK
ACK由數據的接收方回,表示數據被接收且沒有任何錯誤。
4.4.2NAK
NAK用于流控,由設備回,注意主機不能回NAK。
表示數據沒有準備好,或者不能接收數據。
4.4.3STALL
STALL由設備回,表示不能收發數據,或者指定的請求不支持。
主機不能回STALL。
在端點相關的特征Halt之后,再請求端點相關的特征則回STALL。
還有就是控制傳輸時可能回STALL,具體參考規格書中各種傳輸的拓撲圖。
4.4.4NYET
只有高速有,
PING協議中對數據包回NYET表示本包接收,不能繼續接收下一包。
HUB在split傳輸時也可能回NYET表示split船速和未完成或者不能處理split傳輸。
4.4.5ERR
只有高速HUB使用
用于報告全速/低速總線上的錯誤。
規格書8.4.6章節對響應有一個總結,
IN傳輸設備的響應
IN傳輸主機的響應,可以看到主機不能NAK要不就是ACK要不就是不響應。
OUT傳輸設備響應
設備對SETUP的響應
設備不能對SETUP和其數據做STALL和NAK響應,要么就是ACK要么就是不響應。
4.5SPLIT相關令牌包
這部分內容也比較多,后面單獨一篇講。
五.總結
熟悉USB包的格式,是后面查看協議分析儀,示波器抓波形分析等基礎,所以需要了解。USB報的格式沒有什么特殊,和其他協議套路都是一樣的,要從抽象的結構去理解。
審核編輯:湯梓紅
-
usb
+關注
關注
60文章
7936瀏覽量
264473 -
SPI
+關注
關注
17文章
1706瀏覽量
91502 -
編程
+關注
關注
88文章
3614瀏覽量
93686 -
開發板
+關注
關注
25文章
5032瀏覽量
97371 -
代碼
+關注
關注
30文章
4779瀏覽量
68521 -
單板計算機
+關注
關注
0文章
74瀏覽量
15627 -
編譯
+關注
關注
0文章
657瀏覽量
32852 -
驅動開發
+關注
關注
0文章
130瀏覽量
12072 -
DWC2
+關注
關注
0文章
35瀏覽量
125
發布評論請先 登錄
相關推薦
評論