前面文章我們說了令牌包、數據包、握手包,今天我們來看最后一個特殊包,本篇文章主要說明特殊包以及如何處理數據包,下面們開說。
特殊包是一些在特殊場合使用的包。總共有4種:pE、r、 SPLIT和PNG其中PRE、 SPLIT、PING是令牌包,ERR是握手包。ERR、 SPLIT、PING三個是在USB2.0協議中新增的。
PRE是通知集線器打開其低速端口的一種前導包。PRE只使用在全速模式中。平時,為了防止全速信號使低速設備誤動作,集線器是沒有將全速信號傳送給低速設備的。只有當收到PRE令牌包時,才打開其低速端口。PRE令牌包與握手包的結構一樣,只有同步域、PID和EOP。當需要傳送低速事務時,主機首先發送一個PRE令牌包(以全速模式發送)。對于全速設備,將會忽略這個令牌包。集線器在收到這個令牌包后,打開其連接了低速設備的端口。接著,主機就會以低速模式給低速設備發送令牌包、數據包等。
PING令牌包與OUT令牌包具有一樣的結構,但是PING令牌包后并不發送數據,而是等待設備返回ACK或者NAK,以判斷設備是否能夠傳送數據。在USB1.1中,是沒有PING令牌包的。只有在USB.0高速環境中才會使用PING令牌包,它只被使用在批量傳輸和控制傳輸的輸出事務中直接使用OUT令牌包發送數據時,不管設備是否有空間接收數據,都會在OUT令牌包之后跟著發送一個數據包,如果設備沒有空間接收數據,就返回一個NAK這樣的結果就是浪費了總線帶寬,白白傳送了數據。在高速設備中增加了這個PING機制,主機先用PING令牌包試試設備是否有空間接收數據,而不用事先把數據發送出去。在全速模式下,有時會遇到一個很有趣的現象,就是下位機程序慢了一點點處理完數據,結果傳輸速度卻下降了很多。這就是前面所說的OUT過程直接發送數據導致的,也就是說,雖然程序只慢了一點,但是卻丟棄了整個數據包。
接下來我們來說說如何處理數據包. SPLIT令牌包是高速事務分裂令牌包,通知集線器將高速數據包轉化為全速或者低速數據包發送給其下面的端口。ERR握手包是在分裂事務中表示錯誤使用。由于高速分裂事務過程比較復雜,主要屬于集線器的功能,在此就不詳述了,感興趣的讀者可以閱讀USB2.0協議相關部分。
這么多類型的包以及傳輸過程,那我們該怎么去處理呢?其實,如果使用現成的USB接口芯片,很多過程,USB接口芯片都已經處理好了,可以不用太關心這些細節,只要知道有這么一個過程就行了。
一般的USB接口芯片會完成如CRC校驗、位填充、PD識別、數據包切換、握手等協議的處理。
當USB接口芯片正確接收到數據時,如果有空間保存,則它將數據保存并返回ACK,同時,設置一個標志表示已經正確接收到數據;如果沒有空間保存數據,則自動會返回NAK。
收到輸入請求時,如果有數據需要發送,發送數據,并等待接收ACK。只有當數據成功發送出去(即接收到應答信號AC)之后,它才設置標志,表示數據已成功發送;如果無數據需要發送,則它自動返回NAK。
通常只需要根據芯片提供的一些標志,準備要發送的數據到端點,或者從端點讀取接收到的數據即可。所要發送和接收的數據是指數據包中的數據,至于同步域、包標識、地址、端點、CRC等是看不到的在 BUS Hound中抓到數據也是如此,僅是數據包;并且, BUS Hound中只能看到成功傳輸的數據,即只有ACK確認過的數據包。在USB接口芯片中,通過一些標志可以知道是哪個端點接收或者成功發送了數據。另外,由于控制傳輸比較特殊, SETUP包也會有相應的標志供我們使用。
至此為止我們的包結構和包分類就全部說完了,通過對這些包的了解,我們會更加清楚的認識USB的通信知識。對我們做USB通信有很大的幫助。希望通過文章的內容分享,能給大家帶來收獲。
往期回顧:
●USB的四種傳輸類型之控制傳輸
●指針和數組的恩恩怨怨
END

