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