usb概述
usb裝置現在是用的非常普遍的一種介面了,它即插即用的特性給人們帶來了很大的方便。在嵌入式的應用中, usb經常被用來作為與上位機通訊的介面,還用來通過u盤儲存資料等。usb按通訊速度可分為低速,全速和高速裝置。在我們的應用中,低速和全速是最為普遍的,在此我們對usb從物理層到協議層做乙個簡要的介紹。高速usb的原理是一樣的,在理解了低速和全速裝置的工作原理後再去理解高速裝置就比較簡單了,在此我們暫不討論。
低速(low speed, 1.5mbps):鍵盤,滑鼠,手寫筆
全速(full speed, 12mbps):音訊
2. 主機,裝置(host, device)
上圖是乙個典型的usb全速主機和裝置的連線示意圖。主機要有對外的供電能力,圖中可以看到作為主機的微控制器,乙個引腳用來控制三極體或mosfet,提供5v的電源至usb口。裝置供電有兩種方法:一種是通過usb匯流排,從主機提供的5v獲得,如我們常用的u盤;一種是自己從另外的電源獲得,此時主機至裝置的電源線可以不連。如果裝置的1.5k上拉電阻是加在d-上,那麼此裝置將被主機識別為低速裝置。高速裝置的上拉與全速裝置一樣是加到d+,需要靠軟體協議進一步區分。
通過usb匯流排獲得供電的裝置,分為兩種配置:
低功率裝置(low-power devices): 最大電流不超過100ma
高功率裝置(high-power devices): 剛連線後裝置後的列舉階段不超過100ma,配置完成後最大不超過500ma。
usb所有的通訊都是由主機發起。當主機檢測到有裝置連線時,首先會詢問裝置,讓裝置自報家門,看看裝置都具備哪些能力,其中就包括最大電流,然後主機根據上報的描述進行相應的操作。這個過程叫自舉(enumeration)。裝置通過描述符(descriptor)來宣告自己的能力,包括:
裝置描述符(device descriptor)
配置描述符(configuration descriptor)
介面描述符(inte***ce descriptor)
端點描述符(endpoint descriptor)
字串描述符(string descriptor)
端點(endpiont)是usb通訊的基本單元,每個usb裝置都會包含若干個端點。主機下發的資料最終會根據裝置位址和端點位址到達某乙個端點,主機獲取資料也是給某個端點發出讀資料命令,此端點隨後把儲存在自己緩衝區的資料發給主機。
在端點之上是邏輯組織,多個端點可以歸到乙個介面,多個介面可以歸為乙個配置。而乙個裝置可以有多個配置。
3. usb物理層
1 紅色 vbus(5v)
2 白色 d-
3 綠色 d+
4 黑色 gnd
有的usb介面會多出一根id線,以支援otg(on the go)。支援otg的線兩端是不一樣的,其中一端插到otg裝置時會把裝置介面的識別引腳id拉低,此裝置識別到自己的id拉低後會進入主機狀態(host),連線另一端的裝置id沒有拉低,預設進入裝置狀態(device)。之後通過軟協議可以主從切換。但是集中這種應用不是太多,一台裝置要麼作主機,要麼作裝置的情況比較多。
usb使用的是差分傳輸模式,有兩根資料線d+和d-。
differential 1:d+ > voh(min) (2.8v) 且d- < vol(max)(0.3v)
differential 0:d- > voh and d+ < vol
j狀態:對於低速usb是differential 0,對於全速usb是 differential 1
k狀態:對於低速usb是differential 1,對於全速usb是 differential 0
除此之外,通過把d+,d-當作單端訊號拉低,拉高,可以表示一些特殊的狀態。
se0狀態(single ended 0):d+ 低,d- 低
se1狀態(single ended 1):d+ 高,d- 高
reset訊號:d+ and d- < vol for >= 10ms
主機在要和裝置通訊之前會傳送reset訊號來把裝置設定到預設的未配置狀態。即主機拉低兩根訊號線(se0狀態)並保持10ms。
看到這裡也許有點暈,不過沒關係,你如果看usb協議會更暈。
我們千萬不要掉進這個坑里出不來,就像我們用串列埠也從來不會去觸發乙個起始訊號,或者拉出乙個結束訊號一樣,這些物理層訊號狀態的處理完全由晶元整合的usb控制器來處理。而且提供usb軟體協議棧也是必須的,靠使用者自己完全把所有細節搞清楚是不現實的。然而就像開車一樣,你如果對汽車的原理有更深入的了解,一定更能充分的發揮出這輛車的效能。
繼續,除了以上狀態,還有:
idle state, resume state, start of packet, end of packet, disconnect, connnect.
4. packet
packet是usb通訊最基本的單位。
sop:start of packet,標誌由空閒狀態轉入資料報傳送。
sync:同步段,供usb裝置進行時鐘同步。
pid:packet identifier。種模擬較多,下面再詳細說明。
frame number:幀號,每發一幀加1,達到7fffh時變為0。
data:資料段。
crc:校驗和。
eop:end of packet。
通過不同的pid,資料報被分成4個大類,每個大類又包含一些小類:
令牌 (token) out,in,setup,sof
資料 (data) data0,data1
握手 (handshake) ack,nak,stall,nyet
特殊包 (special) pre,err
5. transaction
一次transaction總是從主機向裝置發出乙個令牌(token)開始。再次強調,usb所有的通訊過程都是由主機發起。三種令牌把transaction分為三類:
out:主機傳送資料給裝置。
in:主機從裝置獲取資料。
setup:主機對裝置進行設定。
usb協議裡的out和in,都要站在主機的角度來看。下面是比較典型的獲取,傳送資料的例子:
每一次transaction,token總是必需的,資料段和握手則視情況而定。比如在上乙個例子中,當主機發出in令牌獲取資料時,如果裝置沒準備好資料,則可以返回nak結束此transaction。
6. transfer
好了,有了以上這些,似乎萬事俱備了。但是如果進一步想一下,那麼還是有些問題不好解決。什麼呢?比方說data資料段的長度規定多長好呢?主機多長時間發起一次通訊比較好呢?
乙個usb主機上是允許掛載多個裝置的,而這些裝置千差萬別:比如像滑鼠,按鍵後需要快速響應,把位置資訊傳送到主機,它的資料量很少,而像u盤則需要傳輸大量的資料。如果按滑鼠的時候u盤正在傳輸資料怎麼辦呢?
為了解決上述問題,usb首先規定了四種傳輸型別:
控制傳輸(control transfers):主要用來在裝置剛連線到主機時對裝置進行設定。還有平時對裝置狀態的管理。它需要雙向的資料傳輸。
批量傳輸(bulk data transfers):主要用來進行量大,但對傳輸時間要求不嚴格的場景。例如u盤。
中斷傳輸(interrupt data transfers):需要及時準確的傳輸資訊的場景。中斷傳輸總是單向的。比如滑鼠。
同步傳輸(isochronous data transfers):一般需要占用相對固定的頻寬,延時短而且比較確定。傳輸是單向的,資料出錯後不需要重傳。比如usb攝像頭。
然後,為了解決裝置的及時響應問題,usb每隔1ms (高速usb是每隔125us)發出乙個sof令牌,緊接令牌進行同步型別的傳輸,之後依次是中斷型別,控制型別和批量資料傳輸型別。在每乙個frame內,isochronous,interrupt和control都會保證一定的頻寬。而bulk型的傳輸優先順序最低,不一定每幀都得到頻寬進行資料傳輸。
乙個transfer 由乙個或多個transactions組成。比如一次控制傳輸可以由setup,in,out等transactions組成。packet和transaction是不允許被中間打斷的,而transfer的多個transactions可以分多次傳輸。
7. 小結
我們對usb的物理層和協議層做了簡要的介紹。在接下來的文章裡我們將通過實際的例子來看一下usb是如何工作的,並對很多任務程師經常忽略或者沒有意識到的一些問題進行**。
51微控制器學習之IIC匯流排
核心思想 主機與從機之間的資訊交換。主機傳送訊息,從機要回應一下。從機傳送訊息,主機也要回應。注意點 sda線和scl線都是預設高電平。即高電平為釋放狀態。include include typedef unsigned char u8 typedef unsigned int u16 void d...
微控制器模組學習之LED
點led就是高低電平的控制,整理一些用的到的知識吧 一些開發板上可能會把led連到鎖存器上,導致我們可能一開始就一臉蒙蔽,整理 一些鎖存器 數電裡學的38解碼器 簡單來說就是三個輸入,8個輸出 這種暫存器的好處就是節省i o口 真值表可以看出用法 這是個驅動器 輸出端可達500ma 50v.需要注意...
飛思卡爾微控制器PLL時鐘匯流排模組
要設定pwm模組首先要確定片內匯流排時鐘,mc9s12xs系列微控制器增加了時鐘產生器模組,鎖定內部頻率更高的壓控振盪器vco頻率,作為系統時鐘,微控制器的內部時鐘可達80mhz,片內匯流排時鐘可達40mhz。先給出一段例程 code refdv 0x07 refdiv 7 synr 0x53 sy...