在之前的文章一次CAN波形分析之旅里,根據示波器采集的波形數據,詳細地分析了CAN通信。今天來分析USB數據,還是同樣的流程,但是這次使用matplotlib來協助分析。
USB基本波形
USB通過一對差分信號進行數據傳輸,這對差分信號叫D+和D-,用示波器抓取一段D+和D-的信號,保存成CSV格式,用matplotlib繪制該信號:
分了方便分析,我們將D+和D-分別繪制:
標記數據包(Packet)的組成:
進一步細化數據包(Packet)的內容
USB數據分析
起始幀數據包(FRAMEPACKET)
全速USB會每隔1毫秒發送一包起始幀數據包(FRAME PACKET),由PID,FRAME_NUMBER和CRC三部分:
PID(Packet ID)為數據包標識符,為8位長度,低4位為標識符數值,高4位值為低4位數值按位取反。起始幀數據包對應的PID為1010 0101(最左側為最高位,下同)
這里需要注意,USB數據流先傳輸最低字節的最低位,同時按照NRZI方式編碼,即(值不變表示數據'1',值發生改變表示數據'0')。
令牌數據包(TOKEN PACKET)
令牌數據包由PID,ADDR,ENDP和CRC四個段組成。一共有三種令牌:
- IN
- OUT
- SETUP
令牌IN對應的PID為0110 1001
令牌OUT對應的PID為1110 0001
令牌SETUP對應的PID為0010 1101
數據包(DATA PACKET)
數據包由PID,PAYLOAD,CRC三個段組成,
DATA1對應的PID為0100 1011
握手包(HANDSHAKE PACKET)
握手包只包含PID段,全速USB一共有3種握手狀態
-
-
- ACK
-
報告數據已經被成功收到。
-
-
- NAK
-
報告設備臨時無法發送或接收數據。也用於在中斷事務期間通知主機沒有要發送的數據。
-
-
- STALL
-
設備發現自己處於需要主機干預的狀態(端點停止,或者不支持控制管道請求)
ACK狀態對應的PID為1101 0010
NACK狀態對應的PID為0101 1010
-----------------------------------------------------------------------------------END
[參考資料]