普通的消費者使用USB設備的時候是不需要了解USB本身到底是怎么回事的,實際上,這樣的人對USB到底是怎么回事都是處于無知的狀態。無知,同時又享受著USB帶來的便利,這種無知其實是很幸福的。
對于工程師來說,無知就常常意味著無能。你沒有辦法在無知的情況下進行思考,自然也沒有辦法開展相關的工作,要想把它變成安生立命的基礎,或是僅僅滿足求知的欲望,那就唯有從了解開始學習,使自己成為有知的狀態,然后在遇到問題的時候就有了很好的思考基礎,從而能夠展開思考并且確定自己應該采取的行動,這樣才有可能從中獲得正面的結果。
USB的規范既要滿足已有應用的需求,又要滿足不斷增加的帶寬要求,就從1.0版本發展到了3.0版本(雙向5Gbps),又在2013年進入了3.1時代,最終把它的速度提升到了雙向10Gbps的水平。
雙向同時進行的通訊是無法和USB 2.0以前的單一總線雙向輪流進行的通訊方法兼容的,所以,USB 3.0以后的最大的變化并不是速度提高了,而是變成了雙總線的結構:
為了持續兼容于過去的標準,很顯然,USB 2.0的總線將持續存在下去,我想這種狀況將持續到低速設備消亡以后才會發生改變。所以,首先認識USB 2.0的做法將具有比較長久的價值。我們今天關注的重點是USB 2.0以前版本的數據傳輸方法。
實際有效的數據傳輸大多是通過二進制的數據表達方式來進行的,由于二進制數據的每個位只有兩個狀態,其實現方法相對比較簡單。對于低速的數據傳輸來說,用高低不同的電壓信號就可以表達一個數據位的兩種狀態,其驅動電路和接收電路都非常簡單。但是,USB是用于不同設備之間的遠距離傳輸的,在這種情況下,用電壓傳遞信號變得很不可靠,所以,它采用了電流傳遞信號的方法。下圖是USB 2.0規范中提供的收發器接口電路示意圖:
一個典型的USB 2.0收發器就是由這樣的接口加上數據串并行轉換器、數據時鐘恢復電路以及一個ULPI(UTMI+ Low Pin Interface)接口和其它一些輔助電路構成的。
為了在USB總線上傳遞信息,驅動器的內部會有一個電流源(標稱值為17.78mA),它被一個高速開關輪流切換引導至D+或D-。當電流被引導至D+時,它就對外表達了一個信號狀態J;如果電流被引導至D-,它對外表達的信號狀態是K。由J和K組成的信號序列來源于原始數據,它們之間是通過不歸零反向編碼的方法來進行轉換的:
如上圖所示,以0和1組成的二進制串行數據經過NRZI編碼后形成的J/K序列送入前面圖中的LS/FS Driver或High Speed Current Driver,其輸出就呈現為總線上的連續不斷的數據流了。
如果要將電壓信號在傳輸線上進行傳輸,由于傳輸線是有阻抗的,其信號幅度會隨著線路的延長而衰減,到了接收端,很可能信號幅度已經變得不足以被檢出正確的數據了,而電流信號則不會有這個問題。當然了,電流信號的傳輸也會受到線路阻抗的影響,其脈沖形狀也會發生變化,但相對來說就要更好些。
以我的直覺來看,除了傳輸的可靠性外,采用電流信號傳輸數據對于及時發現外設的接入和拔出非常有好處。由于發送器的輸出是電流源,當沒有負載的時候,有電流輸出的端子就總是會處于高壓狀態,而當負載接入的時候,其電壓馬上就降低了,這是非常方便檢測電路的設計的。
要進行通訊,收發兩端的同步是非常重要的。同步分為兩種,一種是數據位的同步,一種是數據包的同步。
位同步要求收發兩側要有同步運作的時鐘,這個時鐘的信息是包含在NRZI編碼之中的。在數據與NRZI編碼的轉換過程中,一個為0的數據位將造成NRZI編碼的狀態發生變化,為1的數據位則不會。編碼發生變化的信息是很重要的,它正好對應著信號發生變化的地方,接收端的數據時鐘恢復電路利用此信息將與發端同步的時鐘恢復出來,然后再延遲一點時間后讀入狀態信息,就可以得到與發端相同的J/K數據流,再經過反向的NRZI編碼,原始數據就可以被恢復出來了。
由于NRZI編碼僅在數據為0的時候發生變化,如果長時間出現連續的1就會造成NRZI編碼持續處于一種狀態,其中便沒有了時鐘信息,數據時鐘恢復電路的時鐘輸出就可能失去與發端的同步。為了避免這個問題的發生,USB規范規定:如果數據串中連續出現了6個1,其后就要插入一個為0的數據位。這樣就可使接收器在7個數據位的傳輸時間內至少會看到一次編碼信號的狀態轉換,從而保證其時鐘恢復電路不至于丟掉同步狀態。當然了,這些插入的數據需要在接收端再把它們消除掉以恢復原始數據。
一個含有多個連續1的原始數據包被插入0后再進行編碼的過程如下圖所示,其中的Stuffed Bit箭頭所指的地方就是新插入的為0的數據位。
上圖中標識為Sync Pattern的信息被稱為同步模板,它們的作用是告訴收方后面的信息就是我要發送的數據包了,所以它們所起的作用就是數據包的同步。如果沒有包同步,收方就不會知道信息是從何時開始的,因而不能正確地理解收到的信息。
LS/FS通訊的數據包同步信號是由3個KJ序列緊接2個K狀態構成的,如下圖所示:
高速通訊的同步頭要長許多,它包含了15個KJ序列和緊接著的2個K狀態,總共有32個信號周期。考慮到高速通訊的速度提高了幾十倍,32個信號周期其實并不算太長。
USB總線上需要傳遞的數據可以分為4種類型:用于控制的數據,設備和主機之間的連接過程就需要傳輸這種數據(地址、端口編號等);批量數據,主機與打印機、掃描儀之類的外設間的通訊以這類數據為主;中斷信息,這種信息的出現時間是不確定的,但又需要系統做出及時的響應,這與MCU應用中的中斷信號很類似;同步數據,它們在時序上有嚴格的要求,而且需要按照一定的節奏進行,一旦不同步,接收方的感覺就會很差,所以在傳輸時需要安排出足夠的帶寬與其配合,攝像頭、話筒等外設所拾取的信息用這種方式進行傳輸就比較好。
USB屬于輪詢總線,所有的通訊都是在主機的控制下進行的,外設只有在收到主機的詢問數據包時才可以進行響應,告訴主機自己沒有數據或是把它要發送的數據打包發給主機,主機在收到以后要進行回應,至少它得說明收到的信息是否正確吧,所以一次正常的通訊至少會有三個數據包需要傳輸。
USB規范把一個主機應用和一個設備之間的傳輸通道稱為管道,這種管道并不真實存在,屬于一種邏輯實體。由于應用眾多,外設也很多,所以可以有很多管道同時存在,這有點像現實中的物流系統的樣子。當我向京東下了一個訂單的時候,我和京東之間就建立起了一個管道,京東將通過此管道把貨物送到我指定的地方,這個管道直到我收到貨物、京東也收到確認信息以后才會消失。當我需要京東的后續服務如退貨、返修之類的需求時,一條新的管道又會建立起來。而在我做這些事情的時候,也有其他人在和京東之間做著同樣的事情。這個物流系統與USB不一樣的地方是它不是輪詢式的,因為京東不會主動來詢問我要不要什么東西。但是,京東為了做成更多的業務,它會想辦法吸引我多去它那里選擇商品,這又屬于廣告性質了,這有點像USB主機在總線上發布廣播信息:“我要關機了,你們大家配合一下。”至于外設會不會配合,那是另外一回事了。
-
驅動器
+關注
關注
53文章
8255瀏覽量
146481 -
數據傳輸
+關注
關注
9文章
1914瀏覽量
64642
發布評論請先 登錄
相關推薦
評論