新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > USB總線協(xié)議基礎知識

        USB總線協(xié)議基礎知識

        作者: 時間:2016-12-15 來源:網(wǎng)絡 收藏

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

        控制傳輸(Control Transfers)

        : 或許你已經(jīng)注意到了,一個usb host端口并不是僅僅支持一個Usb function.如圖1,

        通過usb hub,一個usb host端口可以連接usb鼠標,usb鍵盤,Usb寫字板......。要連接這么多東西在同一個

        usb host上,我們通常會有一個基本問題,即usb host如何識別這些被連接在它的端口上的設備呢。正如通常的

        主從式通訊系統(tǒng)一樣,如rs485多機通訊,我們通常是用一個特定的地址標志每一個從設備。對這里的usb,我們

        采用同樣的方法,將為每個掛接在該usb host上的usb function指定一個特定地址,通過這個特定地址來識別

        每個usb function.看來這將是一個usb function在數(shù)據(jù)傳輸之前必須解決的問題--得到它的地址分配。

        這個“地址指定”的過程需要usb host通知usb function才能完成,這個交互過程就是一個控制式傳輸。通過

        這個“控制式傳輸”,usb host將指定地址給usb function ,以為即將進行的正式通訊做好準備工作。這里細心

        的讀者可能已經(jīng)注意到了,既然usb host總要分配地址給usb function才能進行正式的數(shù)據(jù)傳輸工作,那么

        usb host將如何與一個初始時未分配地址的usb function進行交互來分配地址呢。這里,是這樣解決的:

        usb協(xié)議保留了一個“通用地址”0,usb host 通過這個地址0來和初始未分配地址的usb function進行通訊,進行一

        些初始的準備工作,諸如這里的為它非配一個特定地址。后面我們就會了解到,usb除了配置地址外,還有一些

        其它參數(shù)需要事先主從雙方達成共識。這些參數(shù)也都是通過控制式傳輸完成的。一個Usb 的控制式傳輸如圖二:

        一個Usb的控制式傳輸分為兩個或三個階段進行傳輸:setup stage,data stage(視情況而定),status stage。

        1. 首先是setup stage,聯(lián)系上節(jié)所說的Usb傳輸模式,usb Host總是先發(fā)起第一個packet--這里它
          1. 首先發(fā)起setup,
          2. 之后發(fā)起以data0為起始的setup data,
          3. 最后usb function回應ack結束一次交互。
        2. 其次如果有data stage,類似的,還是按照上節(jié)說的usb傳輸模式,
            1. usb host總是先發(fā)起第一個Packet--Out(或in),
            2. 之后usb host(或usb function)發(fā)起以data1為起始的payload data,
            3. 最后Usb fuction(或usb host)回應ack結束一次交互。
          1. 如果數(shù)據(jù)未傳完,繼續(xù)data stage,同上繼續(xù)。
        3. 最后是status stage,類似的,
          1. usb host首先發(fā)起第一個Packet--in(或out),
          2. 之后usb function(或usb host)發(fā)起以data1為起始的Null data(0長度),
          3. 最后Usb host(或usb function)回應ack結束一次交互。


        如此,整個控制式傳輸結束。 你或許有疑問,data stage為什么進行了多次而非一次完成?實際上,usb總是將

        一批大量的數(shù)據(jù)分成了許多小段來進行傳輸,稱為一個pay load。這樣傳輸?shù)哪康氖侨菀讓鬏斶M行控制。既然

        一次大量的數(shù)據(jù)總是被分成一段一段來分次傳輸,那么這里就出現(xiàn)了一個需要事先確定的參數(shù)(wMaxPacketSize):即每次即這個小段有多大。這個參數(shù)如地址指派一樣,正式傳輸之前需要事先達成共識。通過控制式傳輸,現(xiàn)在我們

        已經(jīng)完成了usb function的地址指定等參數(shù)的設置工作,下一步可以進行正式的數(shù)據(jù)傳輸了。

        塊傳輸(bulk Transactions)

        我們終于等到usb function 配置完成,現(xiàn)在我們的任務是要傳送一批數(shù)據(jù),這里可以使用批量數(shù)據(jù)傳輸(bulk Transactions)。 一個批量傳輸總是按照如圖所示方式進行,

        1. 首先,usb host發(fā)起第一個Packet--in(或out),表示要開始數(shù)據(jù)傳輸了。
        2. 其次,usb function(或usb host)發(fā)起以data1(或data0)為起頭的payload data,開始一次交互。
        3. 再其次,usb host(或Usb function)發(fā)起ack回應這次交互。 如果數(shù)據(jù)還為傳完,繼續(xù)上述過程,即:
          1. 首先,usb host再次發(fā)起一個Packet--in(或out),表示又要開始數(shù)據(jù)傳輸了。
          2. 其次,usb function(或usb host)發(fā)起以data0(或data1)為起頭的payload data,開始又一次交互。
          3. 再次,usb host(或Usb function)發(fā)起ack回應這次交互。
          如此繼續(xù)直至傳輸完成。

        這里的疑問依然是為什么一次可能傳完的數(shù)據(jù)為什么分成多次進行傳輸,原因在上次介紹控制式傳輸式已經(jīng)說明。

        后面我們就會明白,為什么這樣可以方便控制傳輸過程。 仔細看看控制式的data stage采用的傳輸方式,是否

        就是批量傳輸方式呢?!注意,每次payload data的“牽頭人”(preamble)在輪番掉換,先是data1,接著data0,

        再是data1,......如此接替,只要有一次交互出現(xiàn)問題,這個接替規(guī)則就會被打破進而被Usb host識別而發(fā)現(xiàn)

        傳輸異常。所以這個交替的“牽頭人”規(guī)則是可靠數(shù)據(jù)傳輸?shù)乃扇〉拇胧┲弧?/p>

        同步傳輸(Isochronous Transactions)和中斷式傳輸(Interrupt Transactions)

        在批量數(shù)據(jù)傳輸中,觸發(fā)一次批量數(shù)據(jù)傳輸總是“被動”的,就是說需要數(shù)據(jù)傳輸時Usb host并不會主動發(fā)起

        傳輸,而是需要得到你的指令。當你告訴它:“一切ok,讓我們開始吧!” 這時它才開始數(shù)據(jù)傳輸。這種方式

        顯然在某些情況下并不適合。比如音視頻流,你無法要求它聽從你的“指揮”,讓它等你發(fā)指令給usb host,

        然后開始一次傳輸。我們需要的是一種“及時”傳輸。一個好的方案就是設置一個timer,按照tick發(fā)起usb傳輸。

        這個tick通常以1ms(usb full speed)為最小單位。這時,可以設置為每次1ms tick出現(xiàn),usb host“自動”發(fā)起一

        次數(shù)據(jù)傳輸。那么這種方案具體如何來實現(xiàn)呢?看來最基本的要素便是一個發(fā)出tick的timer,而這個“timer”

        需要usb host和usb function(事實上還要包括usb hub)雙方均能“看到”,從而協(xié)調(diào)工作,否則單方面的

        timer又有何意義?這個"timer"(或tick)在usb中使用一個特殊的packet實現(xiàn),即是SOF。這個SOF由USB HOST

        相當精確的以每1.00 ms ±0.0005 ms的時間周期發(fā)送給usb device,來在二者之間定時。從而usb function能

        夠“及時”的了解到“現(xiàn)在時刻”。 現(xiàn)在我們在usb host和usb function之間建立起了“對時”機制。那么接下

        來看看剛才設想的“自動”傳輸如何實現(xiàn)。事實上,一旦usb host及usb function雙方建立了一種時間機制,那

        么這種“自動”傳輸是很容易實現(xiàn)的。usb 實現(xiàn)同步式傳輸或中斷式傳輸總是以一種類似于批量數(shù)據(jù)傳輸?shù)姆绞?/p>

        進行的,唯一不同的是傳輸?shù)挠|發(fā)不再是“被動”的,而是由SOF所建立的tick觸發(fā)。

        1. 首先,時間到達,usb host發(fā)起第一個Packet--in(或out),表示要開始數(shù)據(jù)傳輸了。
        2. 其次,usb function(或usb host)發(fā)起以data1(或data0)為起頭的payload data,開始一次交互。
        3. 再其次,如果是中斷式傳輸,usb host(或Usb function)發(fā)起ack回應這次交互,如果是同步式傳輸,
        4. 該步跳過。

        如此重復上述步驟,即usb host等待下一個tick到達,并開始新一輪的交互。

        這里我們注意到了,同步式傳輸和中斷式傳輸二者雖然都是時間觸發(fā),但是中斷式傳輸需要ack應答,而相反,

        同步式傳輸不需要。這個最大的區(qū)別決定了同步式傳輸是一種非可靠傳輸,但是因此換來了更多的usb傳輸時間。

        也因此,同步式傳輸?shù)?payload data(對應wMaxPacketSize )通常相較于其他傳輸方式比較大,因為它消掉了

        ack所占有數(shù)據(jù)傳輸時間。這里還有一個地方值得注意的是tick的設定,這個tick也是需要事先usb host 和

        usb function達成共識的參數(shù)之一。



        上一頁 1 2 下一頁

        關鍵詞: USB總線協(xié)議基礎知

        評論


        相關推薦

        技術專區(qū)

        關閉
        主站蜘蛛池模板: 曲周县| 泰和县| 延津县| 柘城县| 浦江县| 新巴尔虎右旗| 太仆寺旗| 自治县| 汤原县| 隆回县| 佛教| 德清县| 固始县| 嵩明县| 周至县| 肇庆市| 临澧县| 浮梁县| 启东市| 舒兰市| 囊谦县| 花莲县| 新龙县| 宣恩县| 宣化县| 新营市| 安阳县| 黑山县| 资中县| 大丰市| 岚皋县| 宿迁市| 大埔县| 施甸县| 莒南县| 蓬安县| 喜德县| 富平县| 比如县| 图木舒克市| 廊坊市|