usb2.0 幀和微幀

usb2.0 幀和微幀屬於物理層時間基準的概念,每個幀長爲1ms,usb高速模式,每個幀又分爲8個微幀,即每個微幀長度爲125us。
usb主機和設備控制器同步後,每個微幀起始點開始傳輸數據,在一個微幀時間裏,usb host輪訓各個device
一個微幀傳輸時間裏,可以進行 控制傳輸,中斷傳輸,批量傳輸,同步傳輸。
通常微幀起始時間到來時,host 控制器發送中斷給 主機系統cpu,usb host驅動中斷處理函數處理微幀起始 ,把各種傳輸配置到host 控制器通道中,之後host開始工作,根據通道輪訓各個device。按照125us,那麼1s有8000次配置機會。

幀起始包在每幀(或微幀)開始時發送,它以廣播的形式發送,所有USB全速設備和高速設備都可以接收到SOF包。USB全速設備每毫秒產生一個幀,而高速設備每125us產生一個微幀。
幀起始包之後可以是輸出(OUT)、輸入(IN)、建立(SETUP)等令牌包
USB 採用“令牌包”-“數據包”-“握手包”的傳輸機制,在令牌包中指定數據包去向或者來源的設備地址和端點(Endpoint),從而保證了只有一個設備對被廣播的數據包/令牌包作出響應。握手包表示了傳輸的成功與否。

USB 採用輪詢的廣播機制傳輸數據,所有的傳輸都由主機發起,任何時刻整個 USB 體系內僅允許一個數據包的傳輸,即不同物理傳輸線上看到的數據包都是同一被廣播的數據包。

傳輸由OUT、IN和SETUP事務構成,傳輸有四種類型,中斷傳輸、批量傳輸、同步傳輸、控制傳輸,其中中斷傳輸和批量傳輸的結構一樣,同步傳輸有最簡單的結構,而控制傳輸是最重要的也是最複雜的傳輸。

傳輸類型 特點 應用場景 優先級
控制傳輸 非週期,突發 命令和狀態的傳輸
批量傳輸 非週期,突發 數據可以佔用任意帶寬,容忍延遲
中斷傳輸 週期性,低頻率 允許有延遲的通信,由主機保證在不大於某個時間間隔內安排一次傳輸,根據對應中斷端點描述符中指定的查詢間隔發起 僅次於同步傳輸
同步傳輸 週期,不可靠的傳輸 持續性傳輸,傳輸與時效相關的信息,並且在數據中保存時間戳的信息,音頻設備、視頻設備等 最高

在這裏插入圖片描述
包是USB總線數據傳輸的最小單位,不能被打斷或干擾,否則會引發錯誤。若干個數據包組成一次事務傳輸,一次事務傳輸也不能打斷,屬於一次事務傳輸的幾個包必須連續,不能跨幀完成。一次傳輸由一次到多次事務傳輸構成,可以跨幀完成。

USB主機會對當前幀號進行計數,在每次幀開始時通過SOF包發送幀號。SOF中的幀號是11位的。在4個令牌包中,只有SOF令牌包之後不跟隨數據傳輸,其他的都有數據傳輸。下圖是SOF令牌包的結構。每個令牌包,最後都有一個CRC5的校驗,它只校驗PID之後的數據,不包括PID本身,因爲PID本身已經有4個取反的位進行校驗了。
在這裏插入圖片描述
OUT、IN、SETUP令牌包的結構。其中,地址域是要訪問的設備的地址,端點域是要訪問的端點號。
在這裏插入圖片描述
數據包都具有同樣的結構:一個同步域,後面跟整數字節的數據,然後是CRC16校驗,最後是包結束符EOP
在這裏插入圖片描述
當USB接口芯片正確接收到數據時,如果有空間保存,則它將數據保存並返回ACK,同時,設置一個標誌表示已經正確接收到數據;如果沒有空間保存數據,則自動會返回NAK。
收到輸入請求時,如果有數據需要發送,則發送數據,並等待接收ACK。只有當數據成功發送出去(即接收到應答信號ACK)之後,它才設置標誌,表示數據已發送成功;如果無數據需要發送,則它自動返回ACK。

之所以有不同類型的數據包,是用在當握手包出錯時糾錯。下面以DATA0包和DATA1包的切換爲例進行具體的解釋。
主機和設備都會維護自己的一個數據包類型切換機制:當數據包成功發送或者接收時,數據包類型切換。當檢測到對方所使用的數據包類型不對時,USB系統認爲這發生了一個錯誤,並試圖從錯誤中恢復。數據包類型不匹配主要發生在握手包被損壞的情形。當一端已經正確接收到數據並返回確認信號時,確認信號卻在傳輸過程中被損壞。這時,另一端就無法知道剛剛發送的數據是否已經成功,這時它只好保持自己的數據包的類型不變。如果對方下一次使用的數據包類型跟自己的不一致,則說明它剛剛已經成功接收到數據包了(因爲它已經做了數據包切換,只有正確接收纔會如此);如果對方下一次使用的數據包類型跟自己的一致,則說明對方沒有切換數據包類型,也就是說,剛剛的數據包沒有發送成功,這是上一次的重試操作。

握手包用來表示一個傳輸是否被對方確認,握手包只有同步域、PID和EOP,是最簡單的一種數據包,
握手包有ACK、NAK、STALL和NYET。

ACK表示正確接收數據,並且有足夠空間來容納數據。主機和設備都可以用ACK來確認,而NAK、STALL、NYET只有設備能夠返回,主機不能使用這些握手包。

NAK表示沒有數據需要返回,或者數據正確接收但是沒有足夠的空間來容納它們。當主機收到NAK時,知道設備還未準備好,主機會在以後合適的時機進行重試傳輸。

STALL表示設備無法執行這個請求,或者端點已經被掛起了,它表示一種錯誤的狀態,設備返回STALL後,需要主機進行干預才能解除這種STALL狀態。

NYET只在USB2.0的高速設備輸出事務中使用,它表示設備本次數據成功接收,但是沒有足夠的空間來接收下一次數據。主機在下一次輸出數據時,將先使用PING令牌包來試探設備是否有空間接收數據,以避免不必要的帶寬浪費。

需要注意的是,返回NAK並不表示數據出錯,只是說明設備暫時沒有數據傳輸或者暫時沒有能力接收數據。當USB主機或者設備檢測到數據出錯時,將什麼都不返回。這時等待接收握手包的一方就會收不到握手包從而等待超時。
在這裏插入圖片描述
特殊包

特殊包是一些在特殊場合使用的包。總共有4種:PRE、ERR、SPLIT和PING。其中PRE、SPLIT和PING是令牌包,ERR是握手包。

PRE是通知集線器打開其低速端口的一種前導包。PRE只使用在全速模式中。平時,爲了防止全速信號使低速準備誤動作,集線器是沒有將全速信號傳遞給低速設備的。只有當收到PRE令牌包時,纔打開其低速端口。PRE令牌包與握手包的結構一樣,只有同步域、PID和EOP。當需要傳送低速事務時,主機首先發送一個PRE令牌包(以全速模式發送)。對於全速設備,將會忽略這個令牌包。集線器在收到這個令牌包後,打開其連接了低速設備的端口。接着,主機就會以低速模式給低速設備發送令牌包、數據包等。

PING令牌包與OUT令牌包具有一樣的結構,但是PING令牌包後並不發送數據,而是等待設備返回ACK或者NAK,以判斷設備是否能夠傳送數據。只有在USB2.0高速環境中才會使用PING令牌包,它只被使用在批量傳輸和控制傳輸的輸出事務中。直接使用OUT令牌包發送數據時,不管設備是否有空間接收數據,都會在OUT令牌包之後跟着發送一個數據包,如果設備沒有空間接收數據,就返回一個NAK。這樣的結果就是浪費了總線帶寬,白白傳送了數據。在高速設備中增加了這個PING機制,主機先用PING令牌包試試設備是否有空間接收數據,而不用事先把數據發送出去。

SPLIT令牌包是高速事務分裂令牌包,通知集線器將高速數據包轉化爲全速或者低速數據包發送給其下面的端口。

ERR握手包是在分裂事務中表示錯誤使用。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章