雖然USB定義數據在總線上傳輸的基本單位是包,但是我們還不能隨意地使用包來傳輸數據。必須按照一定的關系把這些不同的包組織成事務才能傳輸數據。
那什么是事務呢?事務通常由兩個或者三個包組成:令牌包,數據包和握手包。令牌包用來啟動一個事務,總是由主機發送;數據包傳送數據,可以從主機到設備,也可以是從設備到主機,方向由令牌包來指定;握手包的發送者通常為數據接收者,當數據接收正確后,發送握手。設備也可以使用NAK握手包來表示數據還未準備好。
USB協議規定了4中傳輸類型:批量傳輸,等時傳輸,中斷傳輸和控制傳輸。其中,批量傳輸,等時傳輸,中斷傳輸每次傳輸一次數據都是一個事務;控制傳輸包括三個過程,建立過程和狀態過程分別是一個事務,數據過程則可能包含多個事務。下面我們先來說說批量傳輸。
批量傳輸是最容易理解的,它使用批量事務傳輸數據。一次批量事務有三個階段:令牌包階段,數據包階段和握手包階段。這里的每個階段都是一個獨立的包。批量傳輸分為批量讀和批量寫(記住,輸入還是輸出是以主機為參考的),批量讀使用批量輸入事務,批量寫使用批量輸出事務。
批量傳輸沒有規定數據包中的數據的意義和結構,具體的數據結構要由設備自己定義。批量傳輸通常用在數據量大,對數據的實時性要求不高的場合,例如USB打印機,掃描儀,大容量存儲設備等。
首先介紹批量輸出事務。主機先發出一個OUT令牌包,這個令牌包中包含了設備地址、端點號。然后,再發送一個DATA包(具體是什么類型的DATA包,要看數據切換位),這時地址和端點匹配的設備就會收下這個數據包。然后主機切換到接收模式,等待設備返回握手包。設備解碼令牌包、數據包都準確無誤,并且有足夠的緩沖區來保存數據后,就會使用ACK握手包或者NYET握手包來應答主機(只有高速模式才有NYET握手包,它表示本次數據成功接收,但是沒有能力接收下一次傳輸)。
如果沒有足夠的緩沖區來保存數據,那么它就會返回一個NAK握手包,告訴主機目前沒有緩沖區可用,主機會在稍后的時間重試該批量輸出事務。如果設備檢測到數據正確,但是端點處于掛起狀態,返回一個 STALL握手包。如果設備檢測到有錯誤(例如校驗錯誤位填充錯誤等),則不做任何響應,讓主機等待超時再來看看批量輸入事務。
主機首先發出一個IN令牌包,同樣IN令牌包中包含了設備地址和端點號然后主機切換到接收數據狀態,等待設備返回數據如果設備檢測到錯誤,那么不做任何響應,主機等待超時如果此時有地址和端點匹配的設備,并且沒有檢測到錯誤,則該設備要做出響應:如果設備有數據需要返回,那么它把一個數據包放到總線上(具體的數據包類型要看數據切換位);如果設備沒有數據需要返回,則它直接使用NAK握手包來響應主機;如果該端點處于掛起狀態,設備會返回一個 STALL握手包。
如果主機接收到設備發送的數據包并解碼正確后,使用ACK握手包應答設備。如果主機檢測到錯誤,則不做任何響應,設備會檢測到超時USB協議規定,不允許主機使用NAK握手包來拒絕接收數據包(否則的話,設備會在下面想:你真是USB”啊!既然你沒空間接收數據,你還請求我返回數據給你干啥!浪費表情……)主機在收到NAK握手包后,知道設備暫時無數據返回,主機會在稍后的時間里重試該輸入事務。另外,在USB2。0高速設備中增加了一個ING令牌包,它不發出數據,直接等待設備的握手包。因此PING事務只有令牌包和握手包。圖1.10.1是一個批量事務的流程圖。下面對該流程圖進行簡單地解釋,后面幾種事務的流程圖表示方法是差不多的,就不再一一解釋了。
?
平時無數據傳輸時,總線處于空閑狀態。當需要傳輸一次事務時,主機發送一個令牌包,它可以是OUT令牌包、IN令牌包或者是PING令牌包,如圖1。10。1中第一行所示,其中PING令牌包是USB2。0高速模式輸出特有的,全速模式和低速模式沒有這個令牌包如果設備解碼令牌包時出錯,則直接進入空閑狀態。令牌階段之后是數據階段或者握手階段對于批量輸入事務,則由設備返回數據,或者返回應答包NAK握手包或 STALL握手包。這由設備的狀態來決定對于批量輸出事務,則主機在令牌包后面再發送一個數據包PING令牌用來探測設備是否有空間接收數據,它沒有數據階段,只有握手階段,設備根據實際的情況返回握手包,AK握手包表示有空間接收數據,NAK握手包表示無空間接收, STALL握手包表示端點掛起。
最后是握手階段。對于批量輸入事務,如果主機接收設備返回的數據正確,則由主機返回ACK握手包;否則數據錯誤,主機什么也不返回。主機必須要能夠接收數據,不能用NAK握手包回應設備。對于批量輸出事務,如果設備能夠接收數據,則返回ACK握手包;如果設備沒有空間接收數據包,則返回NAK握手包;如果設備端點掛起,則返回 STALL握手包;如果設備檢測到傳輸錯誤,則什么都不回應,直接進入到空閑狀態圖1.10.2和圖1.10.3更詳細地給出一個傳輸正確的批量輸入事務和批量輸出事務的數據包圖(傳送了2字節數據)
?
今天我們就先介紹這么多,你get到了嗎?