全速USB和高速USB的識別過程分析
注:本文是根據網上的一些資料整理而成。
1 前言
我們知道USB2.0向下相容USB1.x,即高速2.0的hub能支援所有的速度型別的裝置,而USB1.x的hub不能支援高速裝置(High Speed Device)。因此,如果高速裝置掛到USB1.x的hub上,那該裝置只能工作在全速模式下。不管是hub還是裝置(device),對於速度的區分是非常重要的,否則,後續的通訊根本無法進行。
2 全速和低速USB的識別
根據規範,全速(Full Speed)和低速(Low Speed)很好區分,因為在裝置端有一個1.5k的上拉電阻,當裝置插入hub或上電(固定線纜的USB裝置)時,有上拉電阻的那根資料線就會被拉高,hub根據D+/D-上的電平判斷所掛載的是全速裝置還是低速裝置。如下兩圖:
3 高速USB的識別
USB全速/低速識別相當簡單,但USB2.0,USB1.x就一對資料線,不能像全速/低速那樣僅依靠資料線上拉電阻位置就能識別USB第三種速度:高速。因此對於高速裝置的識別就顯得稍微複雜些。
高速裝置初始是以一個全速裝置的身份出現的,即和全速裝置一樣,D+線上有一個1.5k的上拉電阻。USB2.0的hub把它當作一個全速裝置,之後,hub和裝置通過一系列握手訊號確認雙方的身份。在這裡對速度的檢測是雙向的,比如高速的hub需要檢測所掛上來的裝置是高速、全速還是低速,高速的裝置需要檢測所連上的hub是USB2.0的還是1.x的,如果是前者,就進行一系列動作切到高速模式工作,如果是後者,就以全速模式工作。
下圖展示了一個高速裝置連到USB2.0 hub上的情形:
hub檢測到有裝置插入/上電時,向主機通報,主機發送Set_Port_Feature請求讓hub復位新插入的裝置。裝置復位操作是hub通過驅動資料線到復位狀態SE0(Single-ended 0,即D+和D-全為低電平),並持續至少10ms。
高速裝置看到復位訊號後,通過內部的電流源向D-線持續灌大小為17.78mA電流。因為此時高速裝置的1.5k上拉電阻還未撤銷,在hub端,全速/低速驅動器形成一個阻抗為45歐姆(Ohm)的終端電阻,2電阻並聯後仍是45歐姆左右的阻抗,所以在hub端看到一個約800mV的電壓(45歐姆*17.78mA),這就是Chirp K訊號。Chirp K訊號的持續時間是1ms~7ms。
在hub端,雖然下達了復位訊號,並一直驅動著SE0,但USB2.0的高速接收器一直在檢測Chirp K訊號,如果沒有Chirp K訊號看到,就繼續復位操作,直到復位結束,之後就在全速模式下操作。如果只是一個全速的hub,不支援高速操作,那麼該hub不理會裝置傳送的Chirp K訊號,之後裝置也不會切換到高速模式。
裝置傳送的Chirp K訊號結束後100us內,hub必須開始回覆一連串的KJKJKJ….序列,向裝置表明這是一個USB2.0的hub。這裡的KJ序列是連續的,中間不能間斷,而且每個K或J的持續時間在40us~60us之間。KJ序列停止後的100~500us內結束復位操作。hub傳送Chirp KJ序列的方式和裝置一樣,通過電流源向差分資料線交替灌17.78mA的電流實現。
再回到裝置端來。裝置檢測到6個hub發出的Chirp訊號後(3對KJ序列),它必須在500us內切換到高速模式。切換動作有:
1. 斷開1.5k的上拉電阻。
2. 連線D+/D-上的高速終端電阻(high-speed termination),實際上就是全速/低速差分驅動器。
3. 進入預設的高速狀態。
執行1,2兩步後,USB訊號線上看到的現象就發生變化了:hub傳送出來的Chirp KJ序列幅值降到了原先的一半,400mV。這是因為裝置端掛載新的終端電阻後,配上原先hub端的終端電阻,並聯後的阻抗是22.5歐姆。400mV就是由17.78mA*22.5Ohm得來。以後高速操作的訊號幅值就是400mV而不像全速/低速那樣的3V。
至此,高速裝置與USB2.0 hub握手完畢,進行後續的480Mbps高速訊號通訊。
最後附上幾幅實際USB高速識別的示波器抓圖,圖中藍色訊號是D+,黃色訊號是D-。
資料線D+在T點之前掛上1.5K電阻,在T點被host拉成SE0狀態。在近2ms後,裝置傳送第一個Chirp K,向host通知說:我是一個高速裝置,如果可能,請用高速方式與我通訊。其幅度是800mV(17.78mA * (45ohm ||1.5kohm) = 800mV,見上文解釋)。在這裡,Chirp K的持續時間是2.13ms(a,b兩點之間)。
圖4 示波器擷取的高速USB協商過程1 這幅圖顯示了host發出的chirp KJ訊號的幅度,頭幾個KJ是800mv(a,b之間),隨後的是400mV。圖中可以看到裝置在收到第三個chirp J(藍色短條)後馬上把1.5k電阻取消,導致chirp J的幅值下降到400mV。(17.78mA * (45Ohm ||45Ohm) = 17.78mA * 22.5Ohm = 400mV)
圖5 示波器擷取的高速USB協商過程2 - 測量了一個chirp J的寬度:43.5us。
圖6 示波器擷取的高速USB協商過程3
最後附上一張來自Don Anderson的USB System Architecture裡的USB HS介面圖: