USB数据传输
幀
在USB系統中,正常狀態下根集線器或集線器會一直周期性地發送SOF包,高速USB 總線的幀周期為125us,全速以及低速 USB 總線的幀周期為 1ms。如果USB線上一直處于空閑(Idle)狀態超過3ms,設備應該把它當作一個掛起(Suspended)信號,要求設備在10ms內進入掛起狀態,并把設備所需的電流大小降到規定的值。設備處于掛起狀態時,任何總線上的活動(非空閑信號)都可以把設備喚醒/恢復,從而退出低功耗模式。主機需要繼續周期性地發送SOF包,否則設備又將進入suspend。
?
?
包結構
USB是以包為單位進行傳輸的,包只能在幀內傳輸。一個包包含多個域,不同的包包含不同的域,但都是以同步域(SYNC)開始,緊跟著包標識符(PID),最終以包結束符(EOP)結束。
同步域:表示包要開始傳輸了,同時可以用來同步主機和設備的時鐘。對于低速設備和全速設備,同步域使用的是00000001b;對于高速設備,同步域使用的是31個0后面跟1個1。
包標識符:表示數據包類型。總共8bit,bit0~3表示PID值,bit4~7為PID的取反,用來校驗PID。如上圖PID為0101,表示SOF包。
包結束符:表示數據包結束。
?
?
包類型
USB協議規定了四類包:令牌包(token)、數據包(data)、握手包(handshake)和特殊包(special)。
令牌包:用來啟動一次傳輸。由于USB是主從結構,一個USB主機可以對應多個設備,因此每次開啟傳輸之前必須先使用令牌包和目標設備進行握手,告知設備本次傳輸的功能是什么、由誰來響應。
令牌包有4種:輸出(OUT)、輸入(IN)、建立(SETUP)和幀起始(SOF)
- 輸出:通知某設備的某端點,主機將要輸出一個數據包,請準備查收。
- 輸入:通知某設備的某端點,準備向主機輸入一個數據包,請準備發送。
- 建立:通知某設備的某端點(只能是端點0),主機將要輸出一個數據包(只能是DATA0),該數據包是一個請求,請準備查收。
- 幀起始:USB周期性發送幀起始包,全速設備每毫秒產生一個幀。USB主機會對當前幀號進行計數,通過SOF包發送幀號。
數據包:用來傳輸數據。主機和設備都會維護自己的一個數據包類型切換機制,以解決握手包被損壞的情形:當數據包成功發送或者接收時,數據包類型切換。如果對方下一次使用的數據包類型跟自己不一致,則說明它剛剛已經成功接收到數據包;如果對方下一次使用的數據包類型跟自己一致,則說明剛剛的數據包沒有發送成功,這是上一次的重試操作。
握手包:用來表示一個傳輸是否被對方確認。
- ACK:表示正確接收數據。
- NAK:沒有數據返回,或數據正確接收但沒有足夠空間容納。主機接收到NAK后,會在合適時機重傳。
- STALL:設備無法執行這個請求,或端點已經被掛起。
- NYET:本次數據已經正確接收,但沒有足夠空間來接收下一次數據。
?
?
事務
由于USB是主從結構,每一次交互都必須由主機發起,這樣的過程稱為一次事務:
?
?
傳輸
USB協議規定了4種傳輸類型:批量傳輸、等時傳輸、中斷傳輸和控制傳輸。傳輸由一個或多個事務組成,其中批量傳輸、等時傳輸和中斷傳輸都是一個事務;控制傳輸包括三個事務。
批量傳輸:批量傳輸沒有規定數據包中數據的意義和結構,具體的數據結構要由設備自己定義。通常用在數據量大、對數據的實時性要求不高的場合。批量傳輸分為:批量輸出傳輸和批量輸入傳輸。
中斷傳輸:中斷傳輸是一種保證查詢頻率的傳輸。主機保證在不大于某個時間間隔內安排一次傳輸事務。中斷傳輸通常用在數據量不大,但是對時間要求嚴格的設備中。
等時傳輸:等時傳輸用在數據量大、對實時性要求高的場合。等時傳輸過程中,主機不斷安排傳輸事務。出現數據錯誤的時候不進行重傳,因此也就沒有應答包。
控制傳輸:控制傳輸分為三個過程,建立過程、數據過程(可選)和狀態過程。
?
?
端點
每個USB設備都有一個唯一的設備地址,設備地址是設備連接上主機時由主機分配的,主機主要依靠這個設備地址對USB設備進行訪問。但是在設備內部地址會被分的更細,設備會分出一些端點來,每個端點在設備都會有唯一的端點號,這個端點號是設計設備時給定的。
控制端點:低速模式下,固定最大包長為8字節;全速模式下,可選8、16、32、64字節為最大包長;高速模式下,固定最大包長為64字節。
等時端點:低速模式下,不支持等時傳輸;全速模式下,最大包長上限為1023字節;高速模式下,最大包長上限為1024字節;。
中斷端點:低速模式下,最大包長上限為8字節;全速模式下,最大包長上限為64字節;高速模式下,最大包長上限為1024字節。
批量端點:低速模式下,不支持批量傳輸;全速模式下,可選8、16、32、64字節為最大包長;高速模式下,固定最大包長為512字節。
?
總結
- 上一篇: Ruby 和 Python 分析器是如何
- 下一篇: 从1维到6维,一文读懂多维数据可视化策略