<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          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ò) 收藏
          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)就說(shuō)過(guò)“The USB documentation

          本文引用地址:http://www.ex-cimer.com/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)成的差分線來(lái)進(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í)開(kāi)始,

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

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

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

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

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

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

          (這里我們暫時(shí)忽略這個(gè)傳輸所代表的意義)為了說(shuō)明問(wèn)題,我們對(duì)一些問(wèn)題簡(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來(lái)說(shuō),idle狀態(tài)將處于Data J state,se0表示一楨結(jié)束??催@個(gè)圖是不是很像

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          借此了解到這次傳輸情況,從而有可能來(lái)作出相應(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)起來(lái)的復(fù)雜性也將是

          一樣的。

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

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

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

          們目前看來(lái)主從機(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ù)傳輸類(lèi)型。
          其次,從機(jī)收到主機(jī)送來(lái)的第一個(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ī)

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

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


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

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

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

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

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

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

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

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

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

          上節(jié)中我們了解到了usb host與usb function之間采用的是一種“非對(duì)稱(chēng)”的傳輸,也就是說(shuō),無(wú)論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ù)傳輸類(lèi)型。


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

          評(píng)論


          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();