新聞中心

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

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

作者: 時(shí)間:2016-12-15 來源:網(wǎng)絡(luò) 收藏
USB作為一種串行接口,應(yīng)用日益廣泛。如同每個(gè)工程設(shè)計(jì)人員必須掌握I2C,RS232這些接口一樣,我們也必須掌握usb.

但是usb的接口協(xié)議實(shí)在有點(diǎn)費(fèi)解,linux uhci驅(qū)動(dòng)作者之一Alan Stern曾經(jīng)就說過“The USB documentation

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

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

mostof it ”。

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

因此,文章將分成相應(yīng)的三部分講解。

一。usb function

1。初識(shí)usb.usb是一種串行接口協(xié)議,它靠d+,d-兩條數(shù)據(jù)線構(gòu)成的差分線來進(jìn)行數(shù)據(jù)傳輸,這讓我們非常感興

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

我們回想一下到底一個(gè)兩線rs232的數(shù)據(jù)是如何傳送的,如圖一:

在這里我們的重點(diǎn)在于,我們發(fā)現(xiàn)要在串行口傳送數(shù)據(jù)一個(gè)最體碼的要求恐怕就是:要知道數(shù)據(jù)傳輸何時(shí)開始,

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

平,等到有數(shù)據(jù)開始傳送,發(fā)送方首先拉低數(shù)據(jù)線(start),表示數(shù)據(jù)傳輸開始,接受端也因?yàn)檫@個(gè)“start”信號(hào)

開始準(zhǔn)備接受即將到來的數(shù)據(jù),類似一次握手,隨后,在兩者之間的數(shù)據(jù)傳送開始,結(jié)束后主方再次拉高數(shù)據(jù)

線,表示結(jié)束傳輸,自此兩者重新進(jìn)入Idle狀態(tài)。等待下一輪傳送開始。

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

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

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

同的),我們定義差分?jǐn)?shù)據(jù)線上可能出現(xiàn)的四個(gè)狀態(tài):

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

那么上面的圖中,相應(yīng)的也可表示為圖三:

這個(gè)對(duì)usb full speed function來說,idle狀態(tài)將處于Data J state,se0表示一楨結(jié)束??催@個(gè)圖是不是很像

我們熟悉的rs232。沒錯(cuò)?。?!他們確實(shí)很相似。在無數(shù)據(jù)傳輸時(shí),它們都處于Idle狀態(tài),當(dāng)要開始傳輸數(shù)據(jù)時(shí),

先發(fā)一個(gè)sync(同步信號(hào),rs232為start,usb為一sync字節(jié),見協(xié)議說明)信號(hào)進(jìn)行“握手”,而后開始傳輸,

當(dāng)傳輸要結(jié)束時(shí),發(fā)一stop信號(hào)(usb為一個(gè)se0狀態(tài)表示要結(jié)束傳輸),最后又進(jìn)入idle態(tài)等待新的傳輸。不過,

你可能更加注意到,他們還是不同的。不同在于usb是按packet進(jìn)行傳輸?shù)?,就是說它傳輸?shù)淖钚挝皇莗acket,

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

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

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

簡(jiǎn)介:從本節(jié)開始,我們將介紹usb的傳輸機(jī)制。這節(jié)先介紹usb現(xiàn)有傳輸方式的背景知識(shí),做為對(duì)下節(jié)將要展開

的四種傳輸類型,描述符,等相關(guān)知識(shí)的一個(gè)導(dǎo)引。

2。usb傳輸。
我們?cè)谏弦还?jié)中了解到了usb的“packet”的感念,了解到了usb傳送一個(gè)packet總是以sync開始,以eop結(jié)束,

這個(gè)稱為delimiter,即標(biāo)記packet的始末。有了packet,我們就可以在usb總線上傳輸數(shù)據(jù)了。但是這還不夠,

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

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

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

據(jù)傳輸總是遵循這樣的“協(xié)議”的:

首先,主機(jī)發(fā)第1個(gè)packet給從機(jī),聲明數(shù)據(jù)傳送方向,數(shù)據(jù)傳輸?shù)刂?,?shù)據(jù)傳輸類型。

其次,主機(jī)發(fā)第2個(gè)至第n個(gè)packet載有實(shí)際數(shù)據(jù)
最后,從機(jī)返回一個(gè)packet是一個(gè)ACK包,報(bào)告數(shù)據(jù)傳輸?shù)慕Y(jié)果,比如接受出錯(cuò)或成功等信息,這樣主機(jī)

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

這里我們考慮的是主機(jī)發(fā)數(shù)據(jù)給從機(jī)的情況,那么從機(jī)發(fā)數(shù)據(jù)給主機(jī)時(shí),是不是也可以這樣呢?當(dāng)然可以,比如

從機(jī)要發(fā)數(shù)據(jù)給主機(jī)時(shí),也可以采取同主機(jī)類似的方式:

首先,從機(jī)發(fā)第1個(gè)packet給主機(jī),聲明數(shù)據(jù)傳送方向,數(shù)據(jù)傳輸?shù)刂?,?shù)據(jù)傳輸類型。
其次,從機(jī)發(fā)第2個(gè)至第n個(gè)packet載有實(shí)際數(shù)據(jù)
最后,主機(jī)返回一個(gè)packet是一個(gè)ACK包,報(bào)告數(shù)據(jù)傳輸?shù)慕Y(jié)果,比如接受出錯(cuò)或成功等信息,這樣從機(jī)就可以

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

基本上可以歸結(jié)為一個(gè)“三段式”傳輸

這里有人可能注意到了,對(duì)這樣一個(gè)傳輸機(jī)制,從機(jī)和主機(jī)的功能將是一樣的,因?yàn)檫@樣的實(shí)現(xiàn)機(jī)制,從機(jī)

可能在某一時(shí)刻是主機(jī),某一時(shí)刻又可能是從機(jī),因?yàn)樗麄円獙?shí)現(xiàn)同樣的功能。這樣實(shí)現(xiàn)起來的復(fù)雜性也將是

一樣的。

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

相應(yīng)的,在某一時(shí)刻,master在發(fā)數(shù)據(jù),我們稱其為transmitter,在接受時(shí)我們稱為receiver.對(duì)slaver同樣。

我們可能還注意到了,usb這種按pakcet傳輸?shù)姆绞皆趯?shí)現(xiàn)時(shí)已經(jīng)很復(fù)雜了(至少比rs232要復(fù)雜多吧),至少我

們目前看來主從機(jī)功能一樣這樣的實(shí)現(xiàn)方式似乎還是可行,但是后面我們談到usb host時(shí)將會(huì)了解到host的功

能是如何的復(fù)雜,以至于讓一個(gè)usb function 也帶上如此的功能成本和實(shí)現(xiàn)復(fù)雜性將陡然上升。作為面向廣范

應(yīng)用的usb,這是我們不允許的。我們期望的是一個(gè)使用usb 的udisk,使用usb的光驅(qū),使用usb的耳麥等等這些

東西不要因?yàn)閡sb而變得昂貴,復(fù)雜。

正是因?yàn)檫@個(gè)原因,usb從機(jī)的傳輸發(fā)式便由上面的方式改成了下面的方式進(jìn)行:

首先,主機(jī)發(fā)第1個(gè)packet給從機(jī),聲明數(shù)據(jù)傳送方向,數(shù)據(jù)傳輸?shù)刂罚瑪?shù)據(jù)傳輸類型。
其次,從機(jī)收到主機(jī)送來的第一個(gè)packet后,再發(fā)第2個(gè)至第n個(gè)packet載有實(shí)際數(shù)據(jù)
最后,主機(jī)返回一個(gè)packet是一個(gè)ACK包,報(bào)告數(shù)據(jù)傳輸?shù)慕Y(jié)果,比如接受出錯(cuò)或成功等信息,這樣從機(jī)

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

而對(duì)于usb 主機(jī)傳輸方式保持不變。


對(duì)于這樣的改變,我們馬上就有疑問了:這個(gè)改變的傳輸方式是和未改變之前的等價(jià)嗎。當(dāng)然,不全等價(jià)。問題

在哪里?仔細(xì)觀察一下便知,兩者區(qū)別在于第一個(gè)packet是由誰發(fā)起的。未改變之前,第一個(gè)packet總是由要傳

送數(shù)據(jù)的一方發(fā)起,而改變之后的第一個(gè)Packet總是由主機(jī)發(fā)起。這樣,就變成如果從機(jī)要發(fā)送數(shù)據(jù)給主機(jī)時(shí),

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

我們要說這樣是可以的,因?yàn)橥ǔR淮蝹鬏斀换サ漠a(chǎn)生,并非無來由的產(chǎn)生,這些都是由程序員控制的,控制usb

何時(shí)收,何時(shí)發(fā),及發(fā)給誰?。?!

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

了現(xiàn)在僅具發(fā)送(或接收)功能的transmitter(或Receiver)實(shí)現(xiàn)的復(fù)雜性及成本可想而知也就相應(yīng)得減小了。

簡(jiǎn)介:本節(jié)介紹usb full speed function的四種傳輸類型。

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

數(shù)據(jù)還是發(fā)送數(shù)據(jù),都是由usb host首先發(fā)起。即傳輸?shù)牡谝粋€(gè)packet總是由usb host發(fā)出的。這個(gè)packet將聲

明本次即將進(jìn)行的數(shù)據(jù)傳輸方向,數(shù)據(jù)傳輸?shù)刂泛蛿?shù)據(jù)傳輸類型。


上一頁 1 2 下一頁

評(píng)論


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

關(guān)閉