新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > USB總線協議基礎知識

        USB總線協議基礎知識

        作者: 時間:2016-12-15 來源:網絡 收藏
        USB作為一種串行接口,應用日益廣泛。如同每個工程設計人員必須掌握I2C,RS232這些接口一樣,我們也必須掌握usb.

        但是usb的接口協議實在有點費解,linux uhci驅動作者之一Alan Stern曾經就說過“The USB documentation

        本文引用地址:http://www.104case.com/article/201612/330443.htm

        is downright evil. Mostof it is just crap, written by a committee. Youre better off ignoring

        mostof it ”。

        本文將從整體上介紹usb協議,包括usb host ,usb hub,usb function。希望能給讀者一個總體上的了解。也

        因此,文章將分成相應的三部分講解。

        一。usb function

        1。初識usb.usb是一種串行接口協議,它靠d+,d-兩條數據線構成的差分線來進行數據傳輸,這讓我們非常感興

        趣它到底和我們通常熟悉兩線rs232/485有何區別。了解這種區別有助于我們對usb作一個深入的了解。那么讓

        我們回想一下到底一個兩線rs232的數據是如何傳送的,如圖一:

        在這里我們的重點在于,我們發現要在串行口傳送數據一個最體碼的要求恐怕就是:要知道數據傳輸何時開始,

        何時結束。即如何delimit.那么rs232怎么做的。顯然,在idle(空閑)時,即無數據傳送時,數據線處于高電

        平,等到有數據開始傳送,發送方首先拉低數據線(start),表示數據傳輸開始,接受端也因為這個“start”信號

        開始準備接受即將到來的數據,類似一次握手,隨后,在兩者之間的數據傳送開始,結束后主方再次拉高數據

        線,表示結束傳輸,自此兩者重新進入Idle狀態。等待下一輪傳送開始。

        了解了rs232,那么我們自然想到usb如何做到這個呢,既然是串行位流傳輸,也理所當然的解決這個問題。沒錯,

        Usb協議必然要解決這個問題,讓我們作一個類似rs232的比較吧!類似于rs232,usb的傳輸楨如圖二:

        (這里我們暫時忽略這個傳輸所代表的意義)為了說明問題,我們對一些問題簡化,我們定義這樣幾個狀態:
        假設D+,D-分別表示usb信號線的電平信號。那么對于usb full speed function(high speed ,low speed是不

        同的),我們定義差分數據線上可能出現的四個狀態:

        Data J state:D+=1,D-=0;
        Data K state:D+=0,D-=1;
        SE0:D+=D-=0;
        SE1:D+=D-=1;

        那么上面的圖中,相應的也可表示為圖三:

        這個對usb full speed function來說,idle狀態將處于Data J state,se0表示一楨結束。看這個圖是不是很像

        我們熟悉的rs232。沒錯!!!他們確實很相似。在無數據傳輸時,它們都處于Idle狀態,當要開始傳輸數據時,

        先發一個sync(同步信號,rs232為start,usb為一sync字節,見協議說明)信號進行“握手”,而后開始傳輸,

        當傳輸要結束時,發一stop信號(usb為一個se0狀態表示要結束傳輸),最后又進入idle態等待新的傳輸。不過,

        你可能更加注意到,他們還是不同的。不同在于usb是按packet進行傳輸的,就是說它傳輸的最小單位是packet,

        而rs232是按字節傳送的,也即它的最小傳送單位是字節。既然是按pakcet傳送,想想我們相較于rs232的按字節

        單位傳輸,我們可以得到哪些“好處”。想想看,pakcet的好處不就在于我們可以靈活的定義數據的傳送格式,

        傳送方式,從而可以適應各種各樣的串行設備,這不就是所謂的“通用串行總線”嗎?

        簡介:從本節開始,我們將介紹usb的傳輸機制。這節先介紹usb現有傳輸方式的背景知識,做為對下節將要展開

        的四種傳輸類型,描述符,等相關知識的一個導引。

        2。usb傳輸。
        我們在上一節中了解到了usb的“packet”的感念,了解到了usb傳送一個packet總是以sync開始,以eop結束,

        這個稱為delimiter,即標記packet的始末。有了packet,我們就可以在usb總線上傳輸數據了。但是這還不夠,

        比如數據傳送方向,即傳回usb主機還是傳下usb從機,數據傳送的地址,數據傳送的類型(這些后面我們將會知

        道)這些信息在傳輸之前是必須搞清楚的,那么這個信息如何得知呢,看來這就需要我們定一套基于packet的

        “協議”了。主機與從機在傳輸中均遵循這套“協議”,那么這些問題就可以迎刃而解。事實上,usb的一次數

        據傳輸總是遵循這樣的“協議”的:

        首先,主機發第1個packet給從機,聲明數據傳送方向,數據傳輸地址,數據傳輸類型。

        其次,主機發第2個至第n個packet載有實際數據
        最后,從機返回一個packet是一個ACK包,報告數據傳輸的結果,比如接受出錯或成功等信息,這樣主機

        就可以借此了解到這次傳輸情況,從而有可能來作出相應措施如決定是否重發。

        這里我們考慮的是主機發數據給從機的情況,那么從機發數據給主機時,是不是也可以這樣呢?當然可以,比如

        從機要發數據給主機時,也可以采取同主機類似的方式:

        首先,從機發第1個packet給主機,聲明數據傳送方向,數據傳輸地址,數據傳輸類型。
        其次,從機發第2個至第n個packet載有實際數據
        最后,主機返回一個packet是一個ACK包,報告數據傳輸的結果,比如接受出錯或成功等信息,這樣從機就可以

        借此了解到這次傳輸情況,從而有可能來作出相應措施如決定是否重發。

        基本上可以歸結為一個“三段式”傳輸

        這里有人可能注意到了,對這樣一個傳輸機制,從機和主機的功能將是一樣的,因為這樣的實現機制,從機

        可能在某一時刻是主機,某一時刻又可能是從機,因為他們要實現同樣的功能。這樣實現起來的復雜性也將是

        一樣的。

        注:這里概念或許容易混淆,其實,我們這里的主機(master)和從機(slaver)是一個transceiver,即可收可發。

        相應的,在某一時刻,master在發數據,我們稱其為transmitter,在接受時我們稱為receiver.對slaver同樣。

        我們可能還注意到了,usb這種按pakcet傳輸的方式在實現時已經很復雜了(至少比rs232要復雜多吧),至少我

        們目前看來主從機功能一樣這樣的實現方式似乎還是可行,但是后面我們談到usb host時將會了解到host的功

        能是如何的復雜,以至于讓一個usb function 也帶上如此的功能成本和實現復雜性將陡然上升。作為面向廣范

        應用的usb,這是我們不允許的。我們期望的是一個使用usb 的udisk,使用usb的光驅,使用usb的耳麥等等這些

        東西不要因為usb而變得昂貴,復雜。

        正是因為這個原因,usb從機的傳輸發式便由上面的方式改成了下面的方式進行:

        首先,主機發第1個packet給從機,聲明數據傳送方向,數據傳輸地址,數據傳輸類型。
        其次,從機收到主機送來的第一個packet后,再發第2個至第n個packet載有實際數據
        最后,主機返回一個packet是一個ACK包,報告數據傳輸的結果,比如接受出錯或成功等信息,這樣從機

        就可以借此了解到這次傳輸情況,從而有可能來作出相應措施如決定是否重發。

        而對于usb 主機傳輸方式保持不變。


        對于這樣的改變,我們馬上就有疑問了:這個改變的傳輸方式是和未改變之前的等價嗎。當然,不全等價。問題

        在哪里?仔細觀察一下便知,兩者區別在于第一個packet是由誰發起的。未改變之前,第一個packet總是由要傳

        送數據的一方發起,而改變之后的第一個Packet總是由主機發起。這樣,就變成如果從機要發送數據給主機時,

        總是由主機發起(第一個packet),然后從機開始傳送。
        可能初次接觸我們會感覺怪怪的,怎么從機要給主機發送數據前反而要主機先發packet給從機。 這樣行嗎?

        我們要說這樣是可以的,因為通常一次傳輸交互的產生,并非無來由的產生,這些都是由程序員控制的,控制usb

        何時收,何時發,及發給誰!!!

        這里我們就注意到了,usb function(總是作為從機)的功能一下從原來與主機具有相同功能的tranceiver變成

        了現在僅具發送(或接收)功能的transmitter(或Receiver)實現的復雜性及成本可想而知也就相應得減小了。

        簡介:本節介紹usb full speed function的四種傳輸類型。

        上節中我們了解到了usb host與usb function之間采用的是一種“非對稱”的傳輸,也就是說,無論usb接受

        數據還是發送數據,都是由usb host首先發起。即傳輸的第一個packet總是由usb host發出的。這個packet將聲

        明本次即將進行的數據傳輸方向,數據傳輸地址和數據傳輸類型。


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 泗洪县| 澄迈县| 迭部县| 商都县| 迁西县| 凤凰县| 彰武县| 郓城县| 囊谦县| 饶阳县| 佛教| 中阳县| 武强县| 青铜峡市| 绍兴县| 衢州市| 襄垣县| 浮山县| 达孜县| 阳谷县| 和林格尔县| 蒙阴县| 开鲁县| 台山市| 历史| 麻城市| 朝阳区| 高要市| 台东市| 兰考县| 甘孜| 庆安县| 罗江县| 花莲市| 五河县| 保靖县| 镇雄县| 麻阳| 新晃| 青河县| 财经|