新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > USB總線協(xié)議基礎(chǔ)知識(shí)

USB總線協(xié)議基礎(chǔ)知識(shí)

作者: 時(shí)間:2016-12-15 來(lái)源:網(wǎng)絡(luò) 收藏

本文引用地址:http://butianyuan.cn/article/201612/330443.htm

控制傳輸(Control Transfers)

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

通過(guò)usb hub,一個(gè)usb host端口可以連接usb鼠標(biāo),usb鍵盤(pán),Usb寫(xiě)字板......。要連接這么多東西在同一個(gè)

usb host上,我們通常會(huì)有一個(gè)基本問(wèn)題,即usb host如何識(shí)別這些被連接在它的端口上的設(shè)備呢。正如通常的

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

采用同樣的方法,將為每個(gè)掛接在該usb host上的usb function指定一個(gè)特定地址,通過(guò)這個(gè)特定地址來(lái)識(shí)別

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

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

這個(gè)“控制式傳輸”,usb host將指定地址給usb function ,以為即將進(jìn)行的正式通訊做好準(zhǔn)備工作。這里細(xì)心

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

usb host將如何與一個(gè)初始時(shí)未分配地址的usb function進(jìn)行交互來(lái)分配地址呢。這里,是這樣解決的:

usb協(xié)議保留了一個(gè)“通用地址”0,usb host 通過(guò)這個(gè)地址0來(lái)和初始未分配地址的usb function進(jìn)行通訊,進(jìn)行一

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

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

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

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


如此,整個(gè)控制式傳輸結(jié)束。 你或許有疑問(wèn),data stage為什么進(jìn)行了多次而非一次完成?實(shí)際上,usb總是將

一批大量的數(shù)據(jù)分成了許多小段來(lái)進(jìn)行傳輸,稱為一個(gè)pay load。這樣傳輸?shù)哪康氖侨菀讓?duì)傳輸進(jìn)行控制。既然

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

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

塊傳輸(bulk Transactions)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

夠“及時(shí)”的了解到“現(xiàn)在時(shí)刻”。 現(xiàn)在我們?cè)趗sb host和usb function之間建立起了“對(duì)時(shí)”機(jī)制。那么接下

來(lái)看看剛才設(shè)想的“自動(dòng)”傳輸如何實(shí)現(xiàn)。事實(shí)上,一旦usb host及usb function雙方建立了一種時(shí)間機(jī)制,那

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

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

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

如此重復(fù)上述步驟,即usb host等待下一個(gè)tick到達(dá),并開(kāi)始新一輪的交互。

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

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

也因此,同步式傳輸?shù)?payload data(對(duì)應(yīng)wMaxPacketSize )通常相較于其他傳輸方式比較大,因?yàn)樗袅?/p>

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

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



上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: USB總線協(xié)議基礎(chǔ)知

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉