不用再為USB底層協議犯難了
USB它是串列匯流排,所以數據在匯流排上是一位一位傳輸的,先傳輸最低位數據,最後傳輸最高位數據。對於多個位元組的數據傳輸呢,採用的是小端格式,即先傳輸低位元組數據,最後傳輸高位元組數據。
在USB中,數據是以包為單位進行傳輸的,所有的包都必須以SYNC欄位開始,以EOP(End-of-Packet)結尾。在SYNC欄位之後,緊跟著的是包標識符(PID),PID為一個位元組,其中4位用於定義包的類型,另外4位是用來校驗PID的,PID格式如下:
在USB中,定義了四種類型的包,令牌包、數據包、握手包和特殊包,包類型詳細定義如下:
在令牌包的PID欄位之後,還包含地址域,地址就包括設備地址和端點地址,設備地址共7位,總共可定址128個地址,但是地址0是作為默認設備地址的,所以說,USB系統中,最多只能同時連接127個設備。端點地址共4位,可定址16個端點。
在USB包最後,還包含5位的CRC檢驗碼,CRC校驗碼只對PID後面的數據進行校驗,不對PID進行校驗,因為PID本身就包含4位校驗碼。
包格式
令牌包格式
令牌包格式定義如下:
這裡的令牌特指IN、OUT、SETUP令牌,而SOF包格式定義如下:
令牌包實例如下:
數據包格式
數據包包含包標識符(PID)和0到多個位元組的數據,數據包類型總共四種,DATA0、DATA1、DATA2和MDATA。數據包格式定義如下:
數據包實例如下:
上圖為SETUP請求數據包,用於讀取設備的設備描述符。
握手包格式
握手包有三種ACK、NAK和STALL,其中ACK表示數據傳輸完成並且無錯誤,NAK表示設備不能接收數據或者沒有數據上傳,STALL表示設備不能進行數據傳輸。而NYET和ERR握手包只針對高速設備,表示設備沒有準備好或者出錯。握手包格式定義如下:
ACK握手包實例如下:
特別推薦
※為什麼單片機不能直接驅動繼電器和電磁閥
※這麼講解高斯白雜訊,還有色雜訊,誰都會懂
※關於怎樣衡量一個工程師水平的一點想法
※十大主流智能電錶芯 你知多少
TAG:21ic電子網 |