中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
C6748

1 USB接口總線

1.1 USB接口

    USB(Universal Serial Bus)全稱通用串口總線,USB為解決即插即用PnP(Plug and Play)需求而誕生,支持熱插拔。熱插拔。它能讓你在不斷電的情況下,插拔USB設(shè)備。如果要支持熱插拔,必須在VBUS、DP、DM三根線上,加上過(guò)壓、過(guò)流保護(hù),在未上電時(shí)DP和DM要保持高阻態(tài)。另外,要利用金手指長(zhǎng)短來(lái)控制上電順序,插入時(shí)首先讓電源線接通,讓電源穩(wěn)定之后,再接通信號(hào)線,拔出時(shí)順序正好相反。這樣有效防護(hù)接口被損壞。

    USB協(xié)議版本有USB1.0、USB1.1、USB2.0、USB3.1等,USB2.0目前比較常用,以下以2.0為主介紹。由于USB是主從模式的結(jié)構(gòu)(所有的通信都由主機(jī)發(fā)起,設(shè)備不能發(fā)起),故設(shè)備與設(shè)備之間、主機(jī)與主機(jī)之間不能互連,為解決這個(gè)問(wèn)題,擴(kuò)大USB的應(yīng)用范圍,出現(xiàn)了USB OTG,全拼 ON The Go。USB OTG 同一個(gè)設(shè)備,在不同的場(chǎng)合下可行在主機(jī)和從機(jī)之間切換。USB家族成員如下圖所示:

  • USB Host,即USB主機(jī),一般是PC機(jī)。

  • USB Device,即USB設(shè)備,有USB鍵盤(pán)、U盤(pán)等,而USB Hub集線器是一種特殊的USB設(shè)備。

  • USB OTG,OTG即On-The-Go,同時(shí)具備USB主機(jī)和USB設(shè)備的功能,數(shù)碼相機(jī)就帶有OTG的功能

    USB體系包括"主機(jī)"、"設(shè)備"、"物理連接"三個(gè)部分,其中主機(jī)是一個(gè)提供USB接口及接口管理能力的硬件、軟件的復(fù)合體,可以是PC,也可以是OTG設(shè)備。一個(gè)USB系統(tǒng)中僅有一個(gè)USB主機(jī);設(shè)備包括USB功能設(shè)備和USB集線器,最多支持127個(gè)設(shè)備,這是因?yàn)閰f(xié)議規(guī)定了每個(gè)USB設(shè)備具有一個(gè)7bit的地址(取值范圍0~127,而地址0是保留給未初始化的設(shè)備使用的);物理連接指的是USB的傳輸線使用屏蔽的雙絞線。

    標(biāo)準(zhǔn)的USB連接器有A型、B型、Mini A/B型和Micro-A/B型,每個(gè)型號(hào)又分為插頭和插座。標(biāo)準(zhǔn)的USB2.0連接線都是四線,但MINI USB使用5條線,增加了一條ID線(主從識(shí)別)。

 

    

1.2 USB特點(diǎn)

    USB1.0和USB1.1支持1.5Mb/s的低速模式和12Mb/bs的全速模式。在USB2.0以上支持480Mb/s的高速模式。其中在USB的低速和全速模式下,采用的是電壓傳輸方式,高速模式采用的是電流傳輸模式。應(yīng)用如下:

1.2.1  usb2.0、usb3.0、usb3.1、type-c 接口含義與區(qū)別

  • usb3.0 比2.0的傳輸速率快,充電快,能向下兼容2.0

  • usb3.1 通常是指 usb3.1 gen2,比3.0的傳輸速率更快、充電更快,同兼容

  • type-c 通常是指 usb3.1的一種接口形狀,總共三大類,c就是第三大類

usb2.0

  • 理論傳輸速率480Mbps,即60MB/s

  • 四引腳

  • 供電最高允許標(biāo)準(zhǔn)5V/0.5A

  • USB 2.0基于半雙工二線制總線,兩根線的差分信號(hào)來(lái)傳輸數(shù)據(jù),只能提供單向數(shù)據(jù)流傳輸

usb3.0

  • 理論傳輸速率5.0Gbps

  • 采用了8/10b的編碼方式,將8位的數(shù)據(jù)編碼成10位來(lái)發(fā)送,即500MB/s

    • 關(guān)于8/10b編碼方式看這里:https://baike.baidu.com/item/8B/10B/9125856、https://zh.wikipedia.org/wiki/8b/10b

  • 9引腳,其中4個(gè)引腳的位置與usb2.0位置相同,也是其可以兼容usb2.0的原因

    • 注意,這里說(shuō)的兼容只是說(shuō)能物理兼容插進(jìn)去,傳輸速度肯定還是2.0的效果

    • 里面的5根線路中2根用來(lái)發(fā)送數(shù)據(jù),另2根用來(lái)接收數(shù)據(jù),還有1根是地線。也就是說(shuō),USB 3.0可以同步全速地進(jìn)行讀寫(xiě)操作

  • 供電最高允許標(biāo)準(zhǔn)5V/0.9A

  • USB 3.0采用了TxRx四線制差分信號(hào)線,類似于PCIe總線,故而支持雙向并發(fā)數(shù)據(jù)流傳輸,為全雙工傳輸。

usb3.1

  usb3.1并不像2.0、3.0那樣是即使技術(shù)標(biāo)準(zhǔn)也是實(shí)際的插口,usb3.1只是一個(gè)標(biāo)準(zhǔn),不代表實(shí)際的插口

  包括兩種技術(shù)標(biāo)準(zhǔn):usb3.1 gen1,usb3.1 gen2

  和三種接口標(biāo)準(zhǔn):Type-A(Standard-A)、Type-B(Micro-B)以及Type-C

先介紹兩種技術(shù)標(biāo)準(zhǔn):

  • usb3.1 gen1:技術(shù)標(biāo)準(zhǔn)基本與usb3.0相同,沒(méi)有很大提升(可以當(dāng)做就是3.0)

  • usb3.1 gen2:才是真正的usb3.1。我們通常說(shuō)的usb3.1,就是指的usb3.1 gen2。下面介紹的都是gen2的技術(shù)標(biāo)準(zhǔn):  

  • 理論傳輸速率增加到10.0Gbps

    • 使用128b/132b編碼,在132bit數(shù)據(jù)中,只需使用4bit做為檢查碼,編碼損耗相比于usb3.0的20%(2/10)下降為約3%(4/132),大約為1.21GB/s

    • 供電最高允許標(biāo)準(zhǔn)20V/5A

    • 新增USB A/V 3.1 影音傳輸規(guī)范

    • 標(biāo)簽從3.0的"SuperSpeed"更新為"SuperSpeed+"

三種接口標(biāo)準(zhǔn):

  從左到右依次是type-a、b、c

  • type-a:與普通usb接口外設(shè)形狀相

  • type-b:外部設(shè)備多采用,比如打印機(jī),顯示器等,和一些android手機(jī)

    • type-b有兩種細(xì)分形狀:Mini USB 和 Micro USB,這兩種都有各自的 A 和 B 形狀(比較亂),主要用外設(shè)形狀解決了防誤插(與傳統(tǒng)的長(zhǎng)方形不同,為近似梯形或邊緣缺角,方便識(shí)別正反)

  • type-c:"采用了 usb3.1 gen2 技術(shù)標(biāo)準(zhǔn)的 type-c 型接口",技術(shù)指標(biāo)和usb3.1 gen2相同。同時(shí)還有一個(gè)優(yōu)勢(shì):不會(huì)插反!(上下兩排線,引腳設(shè)計(jì)中心對(duì)稱)

注:

    type-c實(shí)現(xiàn)usb3.1不是強(qiáng)制規(guī)范,沒(méi)有規(guī)定說(shuō)用type-c口一定就是usb3.1,也沒(méi)有規(guī)定說(shuō)用usb3.1一定要用type-c

1.3 USB設(shè)備供電方式

    USB設(shè)備有兩種供電方式 :

  • 自供電設(shè)備:設(shè)備從外部電源獲取工作電壓

  • 總線供電設(shè)備:設(shè)備從VBUS(5v) 取電

    對(duì)總線供電設(shè)備,區(qū)分低功耗和高功耗USB設(shè)備

  • 低功耗總線供電設(shè)備:最大功耗不超過(guò)100mA

  • 高功耗總線供電設(shè)備: 枚舉時(shí)最大功耗不超過(guò)100mA,枚舉完成配置結(jié)束后功耗不超過(guò)500mA

    設(shè)備在枚舉過(guò)程中,通過(guò)設(shè)備的配置描述符向主機(jī)報(bào)告它的供電配置(自供電/總線供電)以及它的功耗要求

1.4 USB總線信號(hào)

USB使用的是差分傳輸模式,兩個(gè)數(shù)據(jù)線D+和D-

差分信號(hào)1:D+ > VOH(min) (2.8V) 且D- < VOL(max)(0.3V)

差分信號(hào)0:D- > VOH and D+ < VOL

1.4.1 J態(tài)、K態(tài)、SEO態(tài)

    USB協(xié)議中是是用J、K、SEO狀態(tài)來(lái)表示總線狀態(tài)的(J狀態(tài):(LS-低速:差分0;FS-全速:差分1) K狀態(tài):(LS:差分1;FS:差分0),具體的狀態(tài)如下: 

(1)低速設(shè)備:

  • J態(tài): D+ ="0",D- ="1"

  • K態(tài): D+ ="1",D- ="0"

  • SE0態(tài):D+ ="0",D- ="0"

從J到K或者從K到J,信號(hào)翻轉(zhuǎn),說(shuō)明發(fā)送的是信號(hào)0

從J到J或者從K到K,信號(hào)保持不變,說(shuō)明發(fā)送的是信號(hào)1。這就是差分信號(hào)0/1的發(fā)送。

(2)高速設(shè)備的J和K相反:

  • 低速下: D+為"0",D-為"1"是為"J"狀態(tài),"K"狀態(tài)相反;

  • 全速/高速下:D+為"1",D-為"0"是為"J"狀態(tài),"K"狀態(tài)相反;

1.4.2 空閑狀態(tài)(IDLE態(tài))

  • 低速下空閑狀態(tài)為"K"狀態(tài);

  • 全速下空閑狀態(tài)為"J"狀態(tài);

  • 高速下空閑狀態(tài)為"SE0"狀態(tài);

1.4.3 reset和suspend(掛起)狀態(tài)

  • 對(duì)于全速操作,SE0表示為復(fù)位和EOP,持續(xù)時(shí)間大于2.5us表示總線復(fù)位;

  • 對(duì)于高速操作,SE0維持3ms~3.125ms,設(shè)備進(jìn)入全速狀態(tài),全速后100us~875us內(nèi)采樣,如果繼續(xù)維持SE0,則設(shè)備總線復(fù)位,開(kāi)始高速握手;若變?yōu)?quot;J"狀態(tài),則進(jìn)入掛起狀態(tài)"suspend"。

1.4.4 高速握手條件

  • 設(shè)備處于掛起狀態(tài),若出現(xiàn)SE0則立即開(kāi)始高速握手;

  • 設(shè)備處于全速,SE0持續(xù)2.5us,則開(kāi)始高速握手;

  • 設(shè)別處于高速,SE0持續(xù)3.0ms,且繼續(xù)持續(xù),則開(kāi)始高速握手。

1.4.5 信號(hào)狀態(tài)電平

  • Reset信號(hào):主機(jī)在要和設(shè)備通信之前會(huì)發(fā)送Reset信號(hào)來(lái)把設(shè)備配置到默認(rèn)的未配置狀態(tài)。即SE0狀態(tài)(D+ 和D- 都是低電平)保持10ms以上。

  • Idle狀態(tài):J狀態(tài)數(shù)據(jù)發(fā)、送前后總線的狀態(tài)

  • Suspend狀態(tài):3ms以上的J狀態(tài)

  • SYNC: 3個(gè)KJ狀態(tài)切換,后跟隨2位時(shí)間的K狀態(tài)(看到的波形變化是總線上發(fā)送0000 0001經(jīng)過(guò)NRZI編碼后的波形)

  • Resume信號(hào):20ms的K狀態(tài)+低速EOP

    主機(jī)在掛起設(shè)備后可通過(guò)翻轉(zhuǎn)數(shù)據(jù)線上的極性并保持20ms來(lái)喚醒設(shè)備,并以低速EOP信號(hào)結(jié)尾,帶遠(yuǎn)程喚醒功能的設(shè)備還可自己發(fā)起該喚醒信號(hào);前提是設(shè)備已進(jìn)入idle狀態(tài)至少5ms,然后發(fā)出喚醒K信號(hào),維持1ms到15ms并由主機(jī)在1ms內(nèi)接管來(lái)繼續(xù)驅(qū)動(dòng)喚醒信號(hào)

  • SOP:從IDLE狀態(tài)切換到K狀態(tài)

  • EOP:持續(xù)2位時(shí)間的SE0信號(hào),后跟隨1位時(shí)間的J狀態(tài)

1.5 差分信號(hào)技術(shù)的特點(diǎn)

    傳統(tǒng)的傳輸方式大多采用"正信號(hào)"或者"負(fù)信號(hào)",二進(jìn)制表達(dá)機(jī)制,這些信號(hào)利用單線傳輸。用不同的信號(hào)電平范圍來(lái)分別表示1或者0,他們之間有一個(gè)臨界值,如果在數(shù)據(jù)傳輸過(guò)程中受到強(qiáng)干擾,高低電平突破臨界值,那么會(huì)造成數(shù)據(jù)傳輸出錯(cuò)。差分信號(hào)技術(shù)最大的特是:必須使用兩條線路才能表達(dá)一個(gè)比特位,用兩條線路傳輸信號(hào)的壓差作為判斷1還是0的依據(jù)。這種做法的優(yōu)點(diǎn)是具有極強(qiáng)的抗干擾性。對(duì)于外界的強(qiáng)烈干擾,兩條線路對(duì)應(yīng)的電平會(huì)出現(xiàn)同樣的變化,這樣保證了電壓差值時(shí)鐘相對(duì)穩(wěn)定,因此數(shù)據(jù)的準(zhǔn)確性不會(huì)因?yàn)楦蓴_噪聲而有所降低。

1.6 USB插入檢測(cè)和速度檢測(cè)

    主機(jī)通過(guò)在設(shè)備D+或D-上的1.5K上拉電阻來(lái)檢測(cè)設(shè)備的連接和斷開(kāi)事件,并由此判別低速和全速設(shè)備。當(dāng)沒(méi)有USB來(lái)連接時(shí),由于主控器的D+和D-上的下拉電阻使得這條數(shù)據(jù)線上的電壓是近地的,當(dāng)連接設(shè)備時(shí),通過(guò)檢測(cè)設(shè)備上的D+和D-的電壓,在D+/D-上出現(xiàn)大小為(Vcc*15/(15+1.5))直流高電平電壓,而其他線保持接地時(shí),就可以知道全速/低速設(shè)備了。

  USB高速設(shè)備首先被識(shí)別成全速設(shè)備,然后通過(guò)集線器和設(shè)備兩者的確認(rèn),再切換到高速模式下。在高速模式下,十點(diǎn)六傳輸模式,這是要將D+上的上拉電阻斷開(kāi)。

一個(gè)簡(jiǎn)單的實(shí)驗(yàn):用一個(gè)10K的上拉電阻接在USB的+5V和D+(或者D-)上,Windoes也會(huì)提示發(fā)現(xiàn)新硬件,但無(wú)法找到驅(qū)動(dòng)程序,這是因?yàn)镈+或D-被拉高,集線器認(rèn)為有設(shè)備插入了,它就報(bào)告給了主機(jī);但主機(jī)獲取數(shù)據(jù)卻沒(méi)有響應(yīng),就會(huì)得到一個(gè)無(wú)法識(shí)別的USB設(shè)備,這是設(shè)備管理器顯示一個(gè)未知的USB設(shè)備,并且其VID和PID都為0(枚舉不成功)。

USB連接和斷開(kāi)連接:

  • 設(shè)備連上主機(jī)時(shí)(連接)

    當(dāng)主機(jī)檢測(cè)到某一個(gè)數(shù)據(jù)線電平拉高并保持了一段時(shí)間,就認(rèn)為有設(shè)備連上來(lái)了

主機(jī)必需在驅(qū)動(dòng)SE0狀態(tài)以復(fù)位設(shè)備之前,立刻采樣總線狀態(tài)來(lái)判斷設(shè)備的速度

  • 沒(méi)有設(shè)備連上主機(jī)時(shí)(斷開(kāi))

    D+和D-數(shù)據(jù)線上的下拉電阻起作用,使得二者都在低電平;主機(jī)端看來(lái)就是個(gè)SE0狀態(tài);同樣地,當(dāng)數(shù)據(jù)線上的SE0狀態(tài)持續(xù)一段時(shí)間了,就被主機(jī)認(rèn)為是斷開(kāi)狀態(tài)

1.7 數(shù)據(jù)編解碼和位填充

USB采用NRZI(非歸零編碼)對(duì)發(fā)送的數(shù)據(jù)包進(jìn)行編碼

    輸入數(shù)據(jù)0, 編碼成"電平翻轉(zhuǎn)"

    輸入數(shù)據(jù)1, 編碼成"電平不變"

編碼出來(lái)的序列,高電平:J狀態(tài);低電平:K狀態(tài)

  USB信號(hào)線中無(wú)單獨(dú)的時(shí)鐘信號(hào)線,時(shí)鐘信號(hào)是通過(guò)調(diào)制和差分?jǐn)?shù)據(jù)一同被傳送出去,時(shí)鐘信號(hào)被轉(zhuǎn)換成NRZI碼。每一個(gè)數(shù)據(jù)包中附有同步信號(hào)以使的接收方可還原出時(shí)鐘信號(hào)。

  NRZI沒(méi)有自同步特性,在USB中,每個(gè)數(shù)據(jù)包的最開(kāi)始處都有一個(gè)同步域(SYNC),其值為00000001,在經(jīng)過(guò)NRZI編碼后,就是一串方波,接收方可能過(guò)這個(gè)同步頭來(lái)計(jì)算發(fā)送方的頻率,以便用這個(gè)頻率來(lái)繼續(xù)采樣數(shù)據(jù)信號(hào)。由于USB所采用的NRZI編碼中,每當(dāng)邏輯0時(shí)就會(huì)進(jìn)行電平翻轉(zhuǎn),那么接收方可通過(guò)這個(gè)不斷翻轉(zhuǎn)的信號(hào)來(lái)調(diào)整同步的頻率,保證數(shù)據(jù)的正確傳輸。

  但這仍然存在問(wèn)題,一旦電平長(zhǎng)時(shí)間保持不變時(shí),我們無(wú)法知道到時(shí)發(fā)送的是100個(gè)邏輯1,還是1000個(gè)邏輯1,即使傳輸?shù)氖?00個(gè)邏輯1,但接收方與發(fā)送方的頻率相差了100分之1,那么也還是存在可能把數(shù)據(jù)采集成為99或者101。而USB中采用了Bit-Stuffing位填充處理,即在連續(xù)發(fā)送6個(gè)1后面會(huì)插入1個(gè)0,強(qiáng)制使發(fā)送信號(hào)進(jìn)行翻轉(zhuǎn),從而讓接收方調(diào)整頻率,同步接收。而接收方在接收時(shí)只要接收到連續(xù)的6個(gè)1后,直接將后面的0刪除即可恢復(fù)數(shù)據(jù)的原貌。

  經(jīng)過(guò)位填充的數(shù)據(jù),由串行接口引擎(SIE)將數(shù)據(jù)串行化和NRZI編碼后,發(fā)送到USB的差分線上,在接收端,剛好是一個(gè)相反的過(guò)程,由SIE將數(shù)據(jù)并行化(反串行化),恢復(fù)出原來(lái)的數(shù)據(jù)。通常,我們使用的現(xiàn)成的USB芯片,如位填充,串行化、反串行化、CRC校驗(yàn)等處理過(guò)程,芯片內(nèi)部的硬件已經(jīng)幫我們做好,因此不必關(guān)心這些細(xì)節(jié)。

  注意USB模塊雖然需要一個(gè)單獨(dú)的48MHz的時(shí)鐘信號(hào),但是它應(yīng)該不是供USB模塊工作的時(shí)鐘,而只是提供給串行接口引擎(SIE)使用的時(shí)鐘

1.8 主機(jī)與設(shè)備之間的通信模型

    上圖展示了USB主機(jī)和USB設(shè)備之間的數(shù)據(jù)傳輸過(guò)程。在設(shè)備端,USB設(shè)備將非USB格式的數(shù)據(jù)進(jìn)行打包處理,轉(zhuǎn)換成USB格式的數(shù)據(jù)包,然后傳遞到鏈路層,經(jīng)過(guò)硬件處理、傳遞到物理層,由物理層通過(guò)PHY以數(shù)據(jù)流的形式傳輸?shù)街鳈C(jī)。

2. USB傳輸

    USB進(jìn)行一次數(shù)據(jù)傳輸遵循的"協(xié)議"簡(jiǎn)單來(lái)說(shuō)就是:

(1)主機(jī)給從機(jī)發(fā)送數(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ī)就可以借此了解到這次傳輸情況,從而有可能來(lái)作出相應(yīng)措施如決定是否重發(fā)。

(2)從機(jī)給主機(jī)發(fā)送數(shù)據(jù):

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

②其次,從機(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ā)。

    USB數(shù)據(jù)是由二進(jìn)制數(shù)字串構(gòu)成的,首先數(shù)字串構(gòu)成域(有七種),域再構(gòu)成包,包再構(gòu)成事務(wù)(IN、OUT、SETUP),事務(wù)最后構(gòu)成傳輸(中斷傳輸、等時(shí)傳輸、批量傳輸和控制傳輸)。

    USB主機(jī)在USB設(shè)備和USB主機(jī)之間發(fā)起的傳輸過(guò)程,稱為事務(wù)。每次事務(wù)以2到3個(gè)數(shù)據(jù)包的形式進(jìn)行USB總線傳輸。每個(gè)數(shù)據(jù)包包含2到3個(gè)步驟:

  • USB主機(jī)控制器向USB設(shè)備發(fā)出命令

  • USB控制器和USB設(shè)備之間傳遞讀寫(xiě)請(qǐng)求,其方向取決于第一部分的命令是讀還是寫(xiě)

  • 握手信號(hào)。

    USB主機(jī)控制器向USB設(shè)備發(fā)送事務(wù)類型請(qǐng)求,通過(guò)分組標(biāo)識(shí)符(PID)來(lái)進(jìn)行識(shí)別。

    傳輸又分為四種類型:批量傳輸、等時(shí)(同步)傳輸、中斷傳輸、控制傳輸。

注意:USB傳輸數(shù)據(jù)先發(fā)數(shù)據(jù)低位再發(fā)高位數(shù)據(jù)

2.1 包

2.1.1 包的組成

    包(Packet)是USB系統(tǒng)信息傳輸?shù)幕締卧?,所有?shù)據(jù)都是經(jīng)過(guò)打包后在總線上傳輸?shù)?。?shù)據(jù)在 USB總線上的傳輸以包為單位,包只能在幀內(nèi)傳輸。高速USB 總線的幀周期為125us,全速以及低速 USB 總線的幀周期為 1ms。

    幀的起始由一個(gè)特定的包(SOF 包)表示,幀尾為 EOF。EOF不是一個(gè)包,而是一種電平狀態(tài),EOF期間不允許有數(shù)據(jù)傳輸。

(注意:雖然高速USB總線和全速/低速USB總線的幀周期不一樣,但是SOF包中幀編號(hào)的增加速度是一樣的,因?yàn)樵诟咚賃SB系統(tǒng)中,SOF包中幀編號(hào)實(shí)際上取得是計(jì)數(shù)器的高11位,最低三位作為微幀編號(hào)沒(méi)有使用,因此其幀編號(hào)的增加周期也為 1mS)

    USB的包(Packet)包括五個(gè)部分組成,即同步字段(SYNC)、包標(biāo)識(shí)符段(PID)、數(shù)據(jù)字段、循環(huán)冗余校驗(yàn)字段(SRC)和包結(jié)尾字段(EOP),包的基本格式為(注意包中的數(shù)據(jù)都是原始數(shù)據(jù),沒(méi)有經(jīng)過(guò)NRZI編碼):

包的內(nèi)容:

    包是USB總線上數(shù)據(jù)傳輸的最小單位,不能被打斷或干擾,否則會(huì)引發(fā)錯(cuò)誤。若干個(gè)數(shù)據(jù)包組成一次事務(wù)傳輸,一次事務(wù)傳輸也不能打斷,屬于一次事務(wù)傳輸?shù)膸讉€(gè)包必須連續(xù),不能跨幀完成。一次傳輸由一次到多次事務(wù)傳輸構(gòu)成,可以跨幀完成

1)SYNC字段:同步域,由8位組成,作為每個(gè)數(shù)據(jù)包的前導(dǎo),用來(lái)產(chǎn)生同步作用,使USB設(shè)備與總線的包傳輸率同步,對(duì)于低速和全速設(shè)備,它的數(shù)值固定為00000001.該數(shù)據(jù)通過(guò)NRZI編碼后,就是一串0101010的方波,而發(fā)送方波的頻率,就是發(fā)送數(shù)據(jù)的波特率。對(duì)于高速設(shè)備,同步域使用的是31個(gè)0,后面跟隨1個(gè)1.

2)PID字段用來(lái)表示數(shù)據(jù)封包的類型。包標(biāo)識(shí)符的校驗(yàn)字段是通過(guò)對(duì)類型字段的每個(gè)位反碼產(chǎn)生的,PID字符如下圖所示:

    這里只用(PID0~4),PID4~7是PID0~4的取反,用來(lái)校驗(yàn)PID

    PID1~0:01 令牌包、11 數(shù)據(jù)包、10 握手包、00 特殊包

  其中PID傳送的前兩位(PID<0:1>指出了其屬于哪個(gè)組),這說(shuō)明了PID的編碼分布。

3)數(shù)據(jù)字段:用來(lái)攜帶主機(jī)和設(shè)備之間傳遞的信息,其內(nèi)容和長(zhǎng)度根據(jù)包標(biāo)識(shí)符、傳輸類型的不同而各不同。在USB包中,數(shù)據(jù)字段可以包括設(shè)備地址、端點(diǎn)號(hào)、幀序列號(hào)以及數(shù)據(jù)等內(nèi)容。在總線傳輸中總是先傳輸字節(jié)的最低位,最后傳輸字節(jié)的最高位。

  • 設(shè)備地址(ADDR)數(shù)據(jù)域:ADDR數(shù)據(jù)域由7位組成,代表了設(shè)備在主機(jī)上的地址,地址000 0000被命名為零地址,是任何一個(gè)設(shè)備第一次連接到主機(jī)時(shí),在被主機(jī)配置、枚舉前的默認(rèn)地址,可用來(lái)尋址多達(dá)127個(gè)外圍設(shè)備。

  • 端點(diǎn)(ENDP)數(shù)據(jù)域.:ENDP數(shù)據(jù)域由4位組成。通過(guò)4個(gè)位最多可尋址出16個(gè)端點(diǎn)。這個(gè)ENDP數(shù)據(jù)域僅用在IN、OUT與SETUP令牌信息包中。對(duì)于慢速設(shè)備可支持端點(diǎn)0以及端點(diǎn)1作為終端傳輸模式,而全速設(shè)備則可以擁有16個(gè)輸入端點(diǎn)(IN)與16個(gè)輸出端點(diǎn)(OUT)共32個(gè)端點(diǎn)。

  • 幀序列號(hào)(FRAM)域:幀號(hào)字段用于指出當(dāng)前幀的幀號(hào),它僅在每幀/小幀開(kāi)始的SOF令牌包中被發(fā)送,其數(shù)據(jù)位長(zhǎng)度為11位,每傳輸一幀,主機(jī)就將其內(nèi)容加1,最大數(shù)值為0X7FF,當(dāng)幀序列號(hào)達(dá)到最大數(shù)時(shí)將自動(dòng)從0開(kāi)始循環(huán)。

  • 數(shù)據(jù)域:長(zhǎng)度為0到1023字節(jié)(實(shí)時(shí)傳輸),它僅存在于DATA信息包中,根據(jù)不同的傳輸類型,擁有不同的字節(jié)大小,但必須為整個(gè)字節(jié)的長(zhǎng)度。

4)CRC字段:由不同數(shù)目的位組成。根據(jù)不同的信息包的類型,CRC數(shù)據(jù)域由不同數(shù)目的位所組成。其中重要的數(shù)據(jù)信息包采用CRC16的數(shù)據(jù)域(16個(gè)位),其余的信息包類型采用CRC5的數(shù)據(jù)域(5個(gè)位)。其中的循環(huán)冗余碼校驗(yàn)CRC,是一種錯(cuò)誤檢測(cè)技術(shù)。由于數(shù)據(jù)在傳輸時(shí),有時(shí)候會(huì)發(fā)生錯(cuò)誤,因此CRC可根據(jù)數(shù)據(jù)算出一個(gè)校驗(yàn)值,然后依此判斷數(shù)據(jù)的正確性。CRC只校驗(yàn)PID之后的數(shù)據(jù),不包括PID本身,因?yàn)镻ID本身通過(guò)四個(gè)取反位校驗(yàn)。

5)EOP段:即發(fā)送方在包的結(jié)尾發(fā)出包結(jié)尾信號(hào)。USB主機(jī)根據(jù)EOP判斷數(shù)據(jù)包的結(jié)束。全速/低速設(shè)備的EOP是一個(gè)大約為2個(gè)數(shù)據(jù)位寬度的單端0(SE0)信號(hào),高速設(shè)備用故意的位填充錯(cuò)誤來(lái)表示,用CRC判斷,CRC校驗(yàn)正確,則為位填充錯(cuò)誤EOP,否則為傳輸錯(cuò)誤。

2.1.2 常用包的類型

    Packet分四大類: 令牌 (Token) 、Packet 幀首 (Start of Frame) 、Packet 數(shù)據(jù) (Data) 、Packet 握手 (Handshake) Packet

①令牌包(Token Packet):

    在USB系統(tǒng)中,只有主機(jī)才能發(fā)出令牌包。令牌包定義了數(shù)據(jù)傳輸?shù)念愋?,它?strong>事務(wù)處理的第一個(gè)階段,用來(lái)啟動(dòng)一次USB傳輸。令牌包中較為重要的是SRTUP、IN和OUT這三個(gè)令牌包。他們用來(lái)在根集線器和設(shè)備端點(diǎn)之間建立數(shù)據(jù)傳輸。

  • 輸出(OUT)令牌包:用來(lái)通知設(shè)備將要輸出一個(gè)數(shù)據(jù)包

  • 輸入(IN)令牌包:用來(lái)通知設(shè)備返回一個(gè)數(shù)據(jù)包

  • 建立(SETUP)令牌包:只用在控制傳輸中,和輸出令牌包作用一樣,也是通知設(shè)備將要輸出一個(gè)數(shù)據(jù)包,兩者區(qū)別在于:

    SETUP令牌包后只使用DATA0數(shù)據(jù)包,且只能發(fā)送到設(shè)備的控制端點(diǎn),并且設(shè)備必須要接收,而OUT令牌包沒(méi)有這些限制。其格式如下:

例子:

②SOF Packet

    SOF包由Host發(fā)送給Device,在每幀(或微幀)開(kāi)始時(shí)發(fā)送,以廣播的形式發(fā)送,所有USB全速設(shè)備和高速設(shè)備都可以接收到SOF包。

    1) 對(duì)于full-speed總線,每隔1.00 ms ±0.0005 ms發(fā)送一次;

    2) 對(duì)于high-speed總線,每隔125 μs ±0.0625 μs發(fā)送一次;

  SOF包以相對(duì)于每幀的開(kāi)始精確計(jì)算的時(shí)間間隔發(fā)送SOF記號(hào)和伴隨的幀數(shù),包括集線器的所有全速/高速設(shè)備都可以接收到SOF包。SOF包不會(huì)使得接收功能部件產(chǎn)生返回包,因此,不能保證向任何給定的設(shè)備發(fā)送SOF都能被接收到。當(dāng)設(shè)備探測(cè)到SOF的PID時(shí),會(huì)被告知發(fā)生了SOF。

例子:

0xA5:1010 0101:對(duì)應(yīng)上面PID表可知是幀起始包

③Data Packet、

    數(shù)據(jù)包含有4個(gè)域:SYNC、PID、DATA和CRC16。有四種類型的數(shù)據(jù)包:DATA0, DATA1, DATA2,and MDATA,且由PID來(lái)區(qū)分。DATA0和DATA1被定義為支持?jǐn)?shù)據(jù)切換同步(data toggle synchronization)。在USB1.1協(xié)議中,只有兩種數(shù)據(jù)包:DATA0和DATA1,USB2.0中增加了DATA2和MDATA,主要用于高速分裂事務(wù)和高速高帶寬同步傳輸中。

    DATA數(shù)據(jù)域的位值是根據(jù)USB設(shè)備的傳輸速度及傳輸類型而定的,且須以8字節(jié)為基本單位。也就是傳輸?shù)臄?shù)據(jù)不足8字節(jié)的。或是傳輸?shù)阶詈笏S嗟囊膊蛔?字節(jié)的,仍需傳輸8字節(jié)的數(shù)據(jù)域。格式如下:

  主機(jī)和設(shè)備都會(huì)維護(hù)自己的一個(gè)數(shù)據(jù)包類型切換機(jī)制:當(dāng)數(shù)據(jù)成功發(fā)送或者接收時(shí),數(shù)據(jù)包類型會(huì)進(jìn)行切換。當(dāng)檢測(cè)到對(duì)方所使用的數(shù)據(jù)包類型不對(duì)時(shí)(未切換),USB系統(tǒng)會(huì)認(rèn)為這發(fā)生了一個(gè)錯(cuò)誤,并試圖從錯(cuò)誤中恢復(fù)。數(shù)據(jù)包類型不匹配主要發(fā)生在握手包被損壞的情況,當(dāng)一端已經(jīng)正確接收到數(shù)據(jù)并返回確認(rèn)信號(hào)時(shí),確認(rèn)信號(hào)卻在傳輸過(guò)程中被損壞。此時(shí)另一端就無(wú)法知道剛剛發(fā)送的數(shù)據(jù)是否已經(jīng)成功,由于未接到返回確認(rèn)信號(hào),則只好保持自己的數(shù)據(jù)包類型不變,這時(shí)就要通過(guò)對(duì)方下一次的數(shù)據(jù)包類型判斷傳輸是否成功。如果對(duì)方下一次使用的數(shù)據(jù)包類型和自己的不一致,則可以確定自己剛剛已經(jīng)成功發(fā)送(因?yàn)閷?duì)方已經(jīng)做了數(shù)據(jù)切換,只有正確接收才會(huì)如此);如果下一次對(duì)方發(fā)送的數(shù)據(jù)和自己一致。則說(shuō)明剛剛發(fā)送的數(shù)據(jù)包沒(méi)有成功。

例子:

④Handshake Packet 

    握手信息包是最簡(jiǎn)單的信息包類型。在這個(gè)握手信息包中僅包含一個(gè)PID數(shù)據(jù)域而已,其格式如下:

  握手包主要用來(lái)報(bào)告數(shù)據(jù)事務(wù)的狀態(tài),還能表示數(shù)據(jù)成功接收、命令的接收或拒絕、流控制和停止條件,只有支持流控制的事務(wù)類型才能返回握手信號(hào)

  主機(jī)和設(shè)備都可以使用ACK來(lái)確認(rèn),而NAK、STALL、NYET只有設(shè)備可以返回,主機(jī)不能使用這些握手包。NYET只在USB2.0的高速設(shè)備的輸出事務(wù)中使用,表示本次數(shù)據(jù)成功接收,但沒(méi)有足夠的空間接收下一次數(shù)據(jù),主機(jī)在下一次輸出數(shù)據(jù)時(shí),將先使用PING令牌包試探設(shè)備是否有空間接收數(shù)據(jù),避免不必要的帶寬浪費(fèi)。

  注意,當(dāng)USB主機(jī)或設(shè)備檢測(cè)到數(shù)據(jù)傳輸錯(cuò)誤時(shí)(如CRC校驗(yàn)錯(cuò)、PID校驗(yàn)錯(cuò)、位填充錯(cuò)誤時(shí)),將什么都不返回,這是等待接收握手信號(hào)包的一方將不會(huì)收到握手包而等待超時(shí)。

例子:

 2.1.3  數(shù)據(jù)包的處理

  數(shù)據(jù)包處理的很多過(guò)程在USB接口芯片中都已經(jīng)處理好,故我們不必關(guān)心這些細(xì)節(jié)。一般的USB接口芯片會(huì)完成如CRC校驗(yàn)、位填充、數(shù)據(jù)切換、握手等協(xié)議的處理。

  當(dāng)USB接口芯片正確接收到數(shù)據(jù)時(shí),如有空間保存,則將數(shù)據(jù)保存并返回ACK,同時(shí)設(shè)置一個(gè)標(biāo)志表示已經(jīng)正確接收到數(shù)據(jù);如果沒(méi)有空間保存,則自動(dòng)返回一個(gè)NAK。

  收到輸入請(qǐng)求時(shí),如有數(shù)據(jù)需要發(fā)送,則發(fā)送數(shù)據(jù),并等待接收ACK。只有當(dāng)數(shù)據(jù)成功發(fā)送出去(即接收到應(yīng)答信號(hào)ACK)之后,它才設(shè)置標(biāo)志,表示數(shù)據(jù)已經(jīng)成功發(fā)送;如果無(wú)數(shù)據(jù)需要發(fā)送,則地洞返回NAK。

  通常只需要根據(jù)芯片提供的一些標(biāo)志,準(zhǔn)備要發(fā)送的數(shù)據(jù)到端點(diǎn),或從端點(diǎn)讀取接收到的數(shù)據(jù)即可。所要發(fā)送的數(shù)據(jù)是指數(shù)據(jù)包中的數(shù)據(jù),至于同步域、包標(biāo)識(shí)、地址、端點(diǎn)、CRC等是看不到的,在BUS Hound(USB抓包工具)中抓到的數(shù)據(jù)也是如此,僅是數(shù)據(jù)包。在USB接口芯片中,通過(guò)一些標(biāo)志,我們知道哪個(gè)端點(diǎn)接收或成功發(fā)送了數(shù)據(jù)。

2.2 事務(wù)

    在USB上數(shù)據(jù)信息的一次接收或發(fā)送的處理過(guò)程稱為事務(wù)處理(Transation)。事務(wù)通常由三個(gè)包組成:令牌包、數(shù)據(jù)包和握手包。

  • 令牌包用來(lái)啟動(dòng)一個(gè)事務(wù),總由主機(jī)發(fā)送;

  • 數(shù)據(jù)包傳送數(shù)據(jù),可以由主機(jī)到設(shè)備或從設(shè)備到主機(jī),方向由令牌包來(lái)指定。

  • 握手包的發(fā)送著通常時(shí)數(shù)據(jù)的接收者,當(dāng)數(shù)據(jù)正確接收時(shí),發(fā)送握手信號(hào),設(shè)備也可發(fā)送NAK握手包表示數(shù)據(jù)未準(zhǔn)備好。

    Transaction可以分成三類 :

  • Setup transaction:主機(jī)用來(lái)向設(shè)備發(fā)送控制命令

  • Data IN transaction:主機(jī)用來(lái)從設(shè)備讀取數(shù)據(jù)

  • Data OUT transaction:主機(jī)用來(lái)向設(shè)備發(fā)送數(shù)據(jù)

    在OUT和SETUP事務(wù)處理中,緊接在SETUP和OUT包后的是DATA包,DATA0和DATA1包是接替地發(fā)送的,在DATA包后面,設(shè)備將回應(yīng)一個(gè)握手信號(hào),(如果設(shè)備可以接受數(shù)據(jù),就回應(yīng)ACK包;如果設(shè)備忙,則回應(yīng)NAK包;如果設(shè)備出錯(cuò),則回應(yīng)STALL包)。

    在IN事務(wù)中,在IN包后面是設(shè)備發(fā)送的DATA包或NAK包或STALL包,(若設(shè)備忙或者出錯(cuò),就發(fā)送NAK包或STALL包給主機(jī);若設(shè)備數(shù)據(jù)準(zhǔn)備好發(fā)送,則發(fā)送DATA包),DATA0和DATA1包也是交替發(fā)送的,緊接著DATA包后面的是主機(jī)發(fā)送給設(shè)備的握手包。(ACK表示主機(jī)可以接收數(shù)據(jù),NAK包代表主機(jī)忙,STALL代表主機(jī)出錯(cuò)

例子:

1)輸入(IN)事務(wù)處理:(USB主機(jī)從設(shè)備接收數(shù)據(jù)包)

①正常的輸入事務(wù)處理

②設(shè)備忙時(shí)的輸入事務(wù)處理

③設(shè)備出錯(cuò)時(shí)的輸入事務(wù)處理

2)輸出(OUT)事務(wù)處理

①正常的輸出事務(wù)處理

②設(shè)備忙時(shí)的輸出事務(wù)處理

③設(shè)備出錯(cuò)時(shí)的輸出事務(wù)處理

3)設(shè)置(SETUP)事務(wù)處理

①正常的設(shè)置事務(wù)處理

②設(shè)備忙時(shí)的設(shè)置事務(wù)處理

③設(shè)備出錯(cuò)時(shí)的設(shè)置事務(wù)處理

2.3 傳輸

    USB協(xié)議定義了四種傳輸類型:控制傳輸、中斷傳輸、批量傳輸以及等時(shí)傳輸。其中,批量傳輸、等時(shí)傳輸、中斷傳輸每傳輸一次數(shù)據(jù)就是一個(gè)事務(wù)控制傳輸分為2~3個(gè)階段:建立階段、數(shù)據(jù)階段(無(wú)數(shù)據(jù)控制沒(méi)有此階段)以及狀態(tài)階段,其中建立階段和狀態(tài)階段分別是一個(gè)事務(wù),數(shù)據(jù)階段則可能包含多個(gè)事務(wù)。根據(jù)數(shù)據(jù)階段的數(shù)據(jù)傳輸方向,控制傳輸又可分為3種類型:控制讀?。ㄗx取USB描述符)、控制寫(xiě)入(配置USB設(shè)備)以及無(wú)數(shù)據(jù)控制。

①控制傳輸(Control Transfers): 非周期性,突發(fā)。用于命令和狀態(tài)的傳輸。

②中斷傳輸(Interrupt Transfers): 周期性,低頻率,允許有限延遲的通信 如人機(jī)接口設(shè)備(HID)中的鼠標(biāo)、鍵盤(pán)、軌跡球等

③批量(大容量數(shù)據(jù))傳輸(Bulk Transfers): 非周期性,突發(fā)大容量數(shù)據(jù)的通信,數(shù)據(jù)可以占用任意帶寬,并容忍延遲 。如USB打印機(jī)、掃描儀、大容量?jī)?chǔ)存設(shè)備等

④等時(shí)(同步)傳輸(Isochronous Transfers): 周期性、持續(xù)性的傳輸,用于傳輸與時(shí)效相關(guān)的信息,并且在數(shù)據(jù)中保存時(shí)間戳的信息 ,如音頻視頻設(shè)備

    其中,批量傳輸、同步傳輸和中斷傳輸每傳輸一次數(shù)據(jù)都是一個(gè)事務(wù),控制傳輸包括3個(gè)過(guò)程,建立過(guò)程和狀態(tài)過(guò)程分別是一個(gè)事務(wù),數(shù)據(jù)過(guò)程則可能包含多個(gè)事務(wù)。

2.3.1 控制傳輸

    控制傳輸時(shí)USB傳輸中最重要的傳輸,包含3種傳輸類型:控制讀取、控制寫(xiě)入以及無(wú)數(shù)據(jù)控制。這3種控制傳輸類型又可分為2~3個(gè)過(guò)程:(1)設(shè)置過(guò)程(2)數(shù)據(jù)過(guò)程(可選)(3)狀態(tài)過(guò)程.

  建立過(guò)程使用一個(gè)建立事務(wù),是一個(gè)輸出數(shù)據(jù)的過(guò)程??刂苽鬏敽团總鬏?shù)妮敵鍪聞?wù)不同,首先令牌包使用SETUP令牌包,其次數(shù)據(jù)包類型,SETUP只能使用DATA0包,最后是握手包,設(shè)備只能使用ACK來(lái)應(yīng)答(除非是錯(cuò)了、不應(yīng)答),而不能使用NAK或STALL,即設(shè)備必須要接收建立事務(wù)的數(shù)據(jù)。

(1)設(shè)置過(guò)程

    主機(jī)從USB獲得配置信息,并設(shè)置設(shè)備的配置值。

    設(shè)置階段的數(shù)據(jù)交換包含SETUP令牌封包,其后是DATA0數(shù)據(jù)包以及ACK握手包。它的作用是執(zhí)行一個(gè)設(shè)置的數(shù)據(jù)交換,并定義此控制傳輸?shù)膬?nèi)容(即:在Data Stage中IN或OUT的data包個(gè)數(shù),及發(fā)送方向,在Setup Stage已經(jīng)被設(shè)定)。

(2)數(shù)據(jù)傳輸過(guò)程

    該階段用來(lái)傳輸主機(jī)和設(shè)備之間的數(shù)據(jù)。其數(shù)據(jù)傳輸過(guò)程為前面提到的事務(wù)處理過(guò)程。

    而根據(jù)數(shù)據(jù)階段的數(shù)據(jù)傳輸?shù)姆较?,控制傳輸又可分?種類型:1) 控制讀取(讀取USB描述符);2) 控制寫(xiě)入(配置USB設(shè)備);3) 無(wú)數(shù)據(jù)控制

  數(shù)據(jù)過(guò)程的所有數(shù)據(jù)事務(wù)必須是同一傳輸方向,一旦數(shù)據(jù)傳輸方向發(fā)生改變,就會(huì)認(rèn)為是進(jìn)入狀態(tài)階段。數(shù)據(jù)過(guò)程的第一個(gè)包必須是DATA1包,然后每次正確傳輸一個(gè)數(shù)據(jù)包后就在DATA0和DATA1之間替換。

(3)狀態(tài)過(guò)程

    狀態(tài)過(guò)程用來(lái)表示整個(gè)傳輸?shù)倪^(guò)程已完全結(jié)束。(過(guò)程類似數(shù)據(jù)傳輸過(guò)程,但傳輸方向相反,且狀態(tài)過(guò)程只使用DATA1包).

    狀態(tài)傳輸?shù)姆较虮仨毰c數(shù)據(jù)傳輸方向相反,即原來(lái)是IN令牌包,則這個(gè)階段應(yīng)為OUT令牌包。對(duì)于控制讀取而言,主機(jī)會(huì)發(fā)送OUT令牌包,其后為0長(zhǎng)度的DATA1封包,此時(shí),設(shè)備也會(huì)做出相對(duì)應(yīng)的動(dòng)作,送ACK、NAK或STALL握手封包。對(duì)于控制寫(xiě)入傳輸,主機(jī)會(huì)送出IN令牌包,然后設(shè)備送出表示完成階段的0長(zhǎng)度的DATA1封包,主機(jī)再做出相應(yīng)的動(dòng)作;送ACK、NAK或STALL封包。

以高速設(shè)備的最大數(shù)據(jù)包長(zhǎng)度64字節(jié)為例 :

  • 要傳輸250字節(jié),拆分成4個(gè)packet

  • 要傳輸正好256字節(jié),通過(guò)最后一個(gè)0字節(jié)包告訴設(shè)備傳輸完成

2.3.2 中斷傳輸

    中斷傳輸方式總是相對(duì)于設(shè)備查詢的,以確定是否有數(shù)據(jù)需要傳輸,因此中斷傳輸?shù)姆较蚩倿閺腢SB設(shè)備到主機(jī)。中斷傳輸由IN或OUT事務(wù)組成。中斷端點(diǎn)在端點(diǎn)描述符中要報(bào)告它的查詢間隔,主機(jī)會(huì)保證在小于這個(gè)時(shí)間間隔的范圍內(nèi)安排一次傳輸。這里說(shuō)的中斷與硬件上的中斷不同,他不是由設(shè)備主動(dòng)發(fā)起的一個(gè)中斷請(qǐng)求,而是由主機(jī)保證不大于某個(gè)時(shí)間間隔內(nèi)安排一次傳輸。

    中斷傳輸在流程上除不支持PING 之外,其他的跟批量傳輸是一樣的。他們之間的區(qū)別也僅在于事務(wù)傳輸發(fā)生的端點(diǎn)不一樣、支持的最大包長(zhǎng)度不一樣、優(yōu)先級(jí)不一樣等這樣一些對(duì)用戶來(lái)說(shuō)透明的東西。

    主機(jī)在排定中斷傳輸任務(wù)時(shí),會(huì)根據(jù)對(duì)應(yīng)中斷端點(diǎn)描述符中指定的查詢間隔發(fā)起中斷傳輸。中斷傳輸有較高的優(yōu)先級(jí),僅次于同步傳輸。

    同樣中斷傳輸也采用PID翻轉(zhuǎn)的機(jī)制來(lái)保證收發(fā)端數(shù)據(jù)同步。下圖為中斷傳輸?shù)牧鞒虉D(DATA0或DATA1中的包含的是中斷信息,而不是中斷數(shù)據(jù))。

2.3.3 批量傳輸

  • 用來(lái)傳輸大量數(shù)據(jù),要求傳輸不能出錯(cuò),適用于打印機(jī)、存儲(chǔ)設(shè)備等。

  • 批量傳輸是可靠的傳輸,需要握手包來(lái)表明傳輸?shù)慕Y(jié)果。若數(shù)據(jù)量比較大,將采用多次批量事務(wù)傳輸來(lái)完成全部數(shù)據(jù)的傳輸,傳輸過(guò)程中數(shù)據(jù)包的PID 按照 DATA0-DATA1-DATA0-…的方式翻轉(zhuǎn),以保證發(fā)送端和接收端的同步。

  • USB 允許連續(xù) 3次以下的傳輸錯(cuò)誤,會(huì)重試該傳輸,若成功則將錯(cuò)誤次數(shù)計(jì)數(shù)器清零,否則累加該計(jì)數(shù)器。超過(guò)三次后,HOST 認(rèn)為該端點(diǎn)功能錯(cuò)誤(STALL),放棄該端點(diǎn)的傳輸任務(wù)

  • 一次批量傳輸(Transfer)由 1 次到多次批量事務(wù)傳輸(Transaction)組成。

  • 翻轉(zhuǎn)同步:發(fā)送端按照 DATA0-DATA1-DATA0-…的順序發(fā)送數(shù)據(jù)包,只有成功的事務(wù)傳輸才會(huì)導(dǎo)致 PID 翻轉(zhuǎn),也就是說(shuō)發(fā)送端只有在接收到 ACK 后才會(huì)翻轉(zhuǎn) PID,發(fā)送下一個(gè)數(shù)據(jù)包,否則會(huì)重試本次事務(wù)傳輸。同樣,若在接收端發(fā)現(xiàn)接收到到的數(shù)據(jù)包不是按照此順序翻轉(zhuǎn)的,比如連續(xù)收到兩個(gè) DATA0,那么接收端認(rèn)為第二個(gè) DATA0 是前一個(gè) DATA0 的重傳。

    它通過(guò)在硬件級(jí)執(zhí)行"錯(cuò)誤檢測(cè)"和"重傳"來(lái)確保host與device之間"準(zhǔn)確無(wú)誤"地傳輸數(shù)據(jù),即可靠傳輸。它由三種包組成(即IN事務(wù)或OUT事務(wù)):1) token; 2) data; 3) handshake

    其傳輸過(guò)程如下:

①批量輸出事務(wù):(1)主機(jī)先發(fā)出一個(gè)OUT令牌包(包含設(shè)備地址,端點(diǎn)號(hào)),(2)然后再發(fā)送一個(gè)DATA包,這時(shí)地址和端點(diǎn)匹配的設(shè)備就會(huì)收下這個(gè)數(shù)據(jù)包,主機(jī)切換到接收模式,等待設(shè)備返回握手包,(3)設(shè)備解碼令牌包,數(shù)據(jù)包都準(zhǔn)確無(wú)誤,并且有足夠的緩沖區(qū)來(lái)保存數(shù)據(jù)后就會(huì)使用ACK/NYET握手包來(lái)應(yīng)答主機(jī)(只有高速模式才有NYET握手包,他表示本次數(shù)據(jù)成功接收,但是沒(méi)有能力接收下一次傳輸),如果沒(méi)有足夠的緩沖區(qū)來(lái)保存數(shù)據(jù),就返回NAC,告訴主機(jī)目前沒(méi)有緩沖區(qū)可用,主機(jī)會(huì)在稍后時(shí)間重新該批量傳輸事務(wù)。如果設(shè)備檢查到數(shù)據(jù)正確,但端點(diǎn)處于掛起狀態(tài),返回STALL。如果檢測(cè)到有錯(cuò)誤(如校驗(yàn)錯(cuò)誤,位填充錯(cuò)誤),則不做任何響應(yīng),讓主機(jī)等待超時(shí)。

②批量輸入事務(wù):(1)主機(jī)首先發(fā)送一個(gè)IN令牌包(包含設(shè)備地址,端點(diǎn)號(hào)),(2)主機(jī)切換到接收數(shù)據(jù)狀態(tài)等待設(shè)備返回?cái)?shù)據(jù)。如果設(shè)備檢測(cè)到錯(cuò)誤,不做任何響應(yīng),主機(jī)等待超時(shí)。如果此時(shí)有地址和端點(diǎn)匹配的設(shè)備,并且沒(méi)有檢測(cè)到錯(cuò)誤,則該設(shè)備作出反應(yīng):設(shè)備有數(shù)據(jù)需要返回,就將一個(gè)數(shù)據(jù)包放在總線上;如果沒(méi)有數(shù)據(jù)需要返回,設(shè)備返回NAK響應(yīng)主機(jī);如果該端點(diǎn)處于掛起狀態(tài),設(shè)備返回STALL。如果主機(jī)收到設(shè)備發(fā)送的數(shù)據(jù)包并解碼正確后,使用ACK握手包應(yīng)答設(shè)備。如果主機(jī)檢測(cè)到錯(cuò)誤,則不做任何響應(yīng),設(shè)備會(huì)檢測(cè)到超時(shí)。注意:USB協(xié)議規(guī)定,不允許主機(jī)使用NAK來(lái)拒絕接收數(shù)據(jù)包。主機(jī)收到NAK,知道設(shè)備暫時(shí)沒(méi)有數(shù)據(jù)返回,主機(jī)會(huì)在稍后時(shí)間重新該批量輸入事務(wù)。

    在USB2.0高速設(shè)備中增加了一個(gè)PING令牌包,它不發(fā)送數(shù)據(jù),直接等待設(shè)備的握手包,因此PING事務(wù)只有令牌包和握手包。

2.3.4 等時(shí)傳輸

    等時(shí)(同步)傳輸適用在數(shù)據(jù)量大、對(duì)實(shí)時(shí)性要求高的場(chǎng)合,如音頻設(shè)備,視頻設(shè)備等,這些設(shè)備對(duì)數(shù)據(jù)的延遲很敏感。對(duì)于音頻或視頻設(shè)備數(shù)據(jù)的100%正確性要求不高,少量的數(shù)據(jù)錯(cuò)誤是可以容忍的,主要是保證數(shù)據(jù)不能停頓,所以等時(shí)傳輸是不保證數(shù)據(jù)100%正確的。

    實(shí)時(shí)傳輸只需要令牌和數(shù)據(jù)兩個(gè)信息包,沒(méi)有握手應(yīng)答包,故當(dāng)數(shù)據(jù)錯(cuò)誤時(shí),不再重傳操作。數(shù)據(jù)是否正確,由數(shù)據(jù)的CRC校驗(yàn)來(lái)確認(rèn)。同步傳輸也不支持PID翻轉(zhuǎn)。主機(jī)在排定事務(wù)傳輸時(shí),同步傳輸有最高的優(yōu)先級(jí)。

各種傳輸特性比較:

2.5 設(shè)備列舉

2.5.1 描述符

    USB描述符類似USB外圍設(shè)備的"身份證"一樣,詳細(xì)地記錄著外圍設(shè)備相關(guān)的一切信息(設(shè)備類型、廠商的ID和產(chǎn)品的ID、端點(diǎn)情況、本版本號(hào)等)。為了描述不同的數(shù)據(jù),需要以不同的數(shù)據(jù)類型的USB描述符加以描述,共有11種類型,每種描述符的第一個(gè)字節(jié)描述該描述符包含的字節(jié)數(shù)目,第二個(gè)字節(jié)描述該描述符的類型。

  USB1.1協(xié)議定義的標(biāo)準(zhǔn)描述符是:設(shè)備描述符,配置描述符、接口描述符、端點(diǎn)描述符和字符串描述符,USB2.0中又新增了Device Qualifier Descriptor 和 Other Speed Configuration Descriptor。除此之外,還有其他描述符如:組描述符、報(bào)告描述符、類特殊描述符等。

  一個(gè)USB設(shè)備只有一個(gè)設(shè)備描述符,設(shè)備描述符里決定了該設(shè)備有多少種配置,每種配置都有一個(gè)配置描述符;而在每個(gè)配置描述符中又定義了該配置有多少個(gè)接口,每個(gè)接口都有一個(gè)接口描述符;在接口描述符中又定義了該接口有多少個(gè)端點(diǎn),每個(gè)端點(diǎn)都有一個(gè)端點(diǎn)描述符;端點(diǎn)描述符定義了端點(diǎn)的大小、類型等。

  由此可以看出,USB描述符之間的關(guān)系是一層一層的,在主機(jī)獲得描述符時(shí),首先獲取設(shè)備描述符,其次是配置描述符,再接下來(lái)是接口描述符,最后是端口描述符。

  這些描述符參數(shù)字段都有一個(gè)小寫(xiě)字母表示的前綴,它們所表示的意思如下:
? b 表一個(gè)字節(jié),=8bits;
? w 表一個(gè)字,=16bits;
? bm 表按位尋址;
? bcd 用BCD碼表示;
? i 表索引值
? id 表標(biāo)識(shí)碼

(1)設(shè)備描述符

    設(shè)備描述符具有18字節(jié)的長(zhǎng)度,并且是主機(jī)向設(shè)備請(qǐng)求的第一個(gè)描述符。包含的信息有:設(shè)備所使用的USB協(xié)議版本號(hào),設(shè)備類型、端點(diǎn)0的最大包大小、廠商ID(VID)和產(chǎn)品ID(PID)、設(shè)備版本號(hào)、廠商字符索引、產(chǎn)品字符索引、設(shè)備序列號(hào)索引、可能的配置數(shù)等。以下列出設(shè)備描述符的范圍、數(shù)值以及各個(gè)字段的意義:

? bLength: 表示描述符的長(zhǎng)度,對(duì)于設(shè)備描述符來(lái)說(shuō),其值為18,即0x12。
? bDescriptorType: 描述符類型,對(duì)應(yīng)表1中的值,設(shè)備描述符為0x01。
? bcdUSB:該設(shè)備遵循的USB版本號(hào),以BCD碼表示,USB1.1為0x0101,USB2.0為0x0200。
? bDeviceClass:該設(shè)備所屬的標(biāo)準(zhǔn)設(shè)備類,USB協(xié)議中對(duì)常見(jiàn)的設(shè)備進(jìn)行了分類。該字段值為0x01~0xFE時(shí),表示是USB協(xié)議中已定義的設(shè)備類,常用的HID設(shè)備類編號(hào)為0x03,其它設(shè)備類編號(hào)參:http://www.usb.org/developers/defined_class
? bDeviceProtocol:用于表示USB設(shè)備類所采用的設(shè)備類協(xié)議,其值和bDeviceClass和bDeviceSubClass有關(guān)。當(dāng)此 字段為0時(shí),表示不使用任何設(shè)備類協(xié)議。如果該USB設(shè)備屬于某個(gè)設(shè)備類和設(shè)備子類,則應(yīng)該繼續(xù)指明所采用的設(shè)備類協(xié)議。當(dāng)該字段為0xFF時(shí),表明設(shè)備 類協(xié)議由供應(yīng)商自定義。
? bMaxPacketSize0:用于表示在USB設(shè)備中,端點(diǎn)0所支持最大數(shù)據(jù)包的長(zhǎng)度,它以字節(jié)為單位。對(duì)于低速USB設(shè) 備,bMaxPacketSize0為8;對(duì)于全速USB設(shè)備,bMaxPacketSize0為8、16、32、64;對(duì)于高速USB設(shè) 備,bMaxPacketSize0為64。
? IdVendor:用于表示USB設(shè)備供應(yīng)商的ID。USB組織中規(guī)定每種產(chǎn)品都必須包含一個(gè)供應(yīng)商ID,這樣可以使主機(jī)加載合適的驅(qū)動(dòng)程序。
? idProduct:用于表示USB產(chǎn)品的ID,由設(shè)備供應(yīng)商提供。idProduct用于表示特定的USB設(shè)備,在USB設(shè)備上電的時(shí)候可以幫助USB主機(jī)選擇合適的驅(qū)動(dòng)程序。
? bcdDevice:用于表示USB設(shè)備的版本號(hào),它以BCD碼的形式表示。一般來(lái)說(shuō)bcdDevcie由設(shè)備供應(yīng)商指定,在USB設(shè)備上電的時(shí)候可以幫助USB主機(jī)選擇合適的驅(qū)動(dòng)程序。
? iManufacturer:用于表示供應(yīng)商字符串描述符的索引值。具體字符串的內(nèi)容在后面字符串描述符中定義。如果沒(méi)有供應(yīng)商字符串,可以置0。
? iSerialNumber:用于表示設(shè)備序列號(hào)字符串描述符的索引值,如果沒(méi)有,可以置為0。
? bNumConfigurations:用于表示該USB設(shè)備所支持的配置數(shù)。

(2)配置描述符

    配置描述符具有9字節(jié)長(zhǎng)度,針對(duì)設(shè)備給予配置的信息,包括配置所包含的接口數(shù)、配置的編號(hào)、供電方式、是否支持遠(yuǎn)程喚醒、電流需求量等。以下列出配置描述符的范例、數(shù)值以及各個(gè)字段的意義。

? bLength:用于表示配置描述符的長(zhǎng)度,固定為9個(gè)字節(jié),即0x09。
? bDescriptorType:用于表示配置描述符的類型值,固定為0x02。
? wTotalLength:用于表示配置信息的總長(zhǎng)度,包括配置描述符、接口描述符、端點(diǎn)描述符長(zhǎng)度的總和。
? bNumInterfaces:用于表示配置所支持的接口數(shù)。一般來(lái)說(shuō),USB設(shè)備的接口至少有一個(gè),因此其最小值為1。
? bConfigurationValue:用于表示USB設(shè)備的配置值。
? iConfiguration:用于指出配置字符串描述符的索引值。具體字符串的內(nèi)容在后面字符串描述符中定義。如果沒(méi)有配置字符串,可以置為0。
? bmAttributes:用于表示USB設(shè)備特性。bmAttributes是接位尋址的,第6位置1表示使用總線電源;第5位置1表示支持遠(yuǎn)程喚醒功能;該字段其他位均保留,一般來(lái)說(shuō),第0~4位置0即可,第7位置1即可。
? bMaxPower:用于表示USB設(shè)備運(yùn)行時(shí)所需要消耗的總線電流,單位以2mA為基準(zhǔn)。USB設(shè)備可以從USB總線上獲得最大的電流為500mA,因此bMaxPower字段的最大值可以設(shè)置為250。

(3)接口描述符

    接口描述符具有9字節(jié)的長(zhǎng)度,用來(lái)描述每個(gè)設(shè)備的接口特性,包括接口的編號(hào)、接口的端點(diǎn)數(shù)、接口所使用的類、子類、協(xié)議等。以下列出配置描述符的范例、數(shù)值以及各個(gè)字段的意義。

(4)端點(diǎn)描述符

    端點(diǎn)描述符具有7字節(jié)的長(zhǎng)度,用來(lái)描述端點(diǎn)的屬性以及各個(gè)端點(diǎn)的位置,有端點(diǎn)號(hào)及方向、端點(diǎn)的傳輸類型、最大包長(zhǎng)度、查詢時(shí)間間隔等。該實(shí)例中有兩個(gè)端點(diǎn),首先介紹端點(diǎn)1的描述符:

    接下來(lái)介紹端點(diǎn)2的描述符:

? bLength:用于表示端點(diǎn)描述符的長(zhǎng)度,固定為7字節(jié),即0x07。
? bDescriptorType:用于表示接口描述符的類型值,固定為0x05。
? bEndpointAddress:用于表示端點(diǎn)的端點(diǎn)號(hào)以及端點(diǎn)的數(shù)據(jù)傳輸方向。第七位表示端點(diǎn)的數(shù)據(jù)傳輸方向,0表示OUT數(shù)據(jù)傳輸,1表示IN數(shù)據(jù)傳輸;第0~位表示端點(diǎn)號(hào),例如001B表示端點(diǎn)1、010B表示端點(diǎn)2;其余位均保留,必須置0。
? bmAttributes:用于表示端點(diǎn)的特性。其中第0位和第1位表示端點(diǎn)的數(shù)據(jù)傳輸類型,00B表示控制傳輸、01B表示同步傳輸、10B表示塊傳 輸、11B表示中斷傳輸;如果是同步傳輸,第2位和第3位表示同步類型,00B表示非同步、01B表示異步、10B表示自適應(yīng)、11B表示同步;第4、5 位表示端點(diǎn)的用法類型,00B表示數(shù)據(jù)端點(diǎn)、01B表示顯示反饋端點(diǎn)、10B表示隱匿反饋端點(diǎn)、11B保留。其余位保留。
? wMaxPacketSize:用于表示端點(diǎn)所支持最大數(shù)據(jù)包的長(zhǎng)度。其中第0~10位表示數(shù)據(jù)包的長(zhǎng)度,第11位和12位指出每小幀最多傳輸?shù)氖聞?wù)數(shù),其余位均保留,必須置0。
? bInterval:用于指定端點(diǎn)數(shù)據(jù)傳輸?shù)脑L問(wèn)間隔。低速中斷端點(diǎn),取值范圍為10~255,對(duì)應(yīng)的訪問(wèn)間隔為10~255ms;對(duì)于全速中斷端點(diǎn),取值范圍為1~255,對(duì)應(yīng)的訪問(wèn)間隔為1~255ms;對(duì)于其他端點(diǎn),可以參閱USB相關(guān)協(xié)議。

 2.6  端點(diǎn)類型和傳輸類型的關(guān)系

  一個(gè)具體的端點(diǎn),只能工作在一種傳輸模式下。通常,我們把工作在什么模式下的端點(diǎn)就叫做什么端點(diǎn),如控制端點(diǎn)、批量端點(diǎn)等。

  端點(diǎn)0是每個(gè)USB設(shè)備都必須具備的默認(rèn)控制端點(diǎn),它一上電就存在并且可用。設(shè)備的各種描述符以及主機(jī)發(fā)送的一些命令,都是通過(guò)端點(diǎn)0傳輸?shù)?。其他端點(diǎn)都是可選的,需要通過(guò)具體設(shè)備來(lái)決定。非0端點(diǎn)只有在Set Config之后才能使用

2.7  傳輸類型和端點(diǎn)支持的最大包長(zhǎng)

  每個(gè)端點(diǎn)描述符都規(guī)定了端點(diǎn)支持的最大數(shù)據(jù)包長(zhǎng),主機(jī)每次發(fā)送數(shù)據(jù)包,都不能超過(guò)端點(diǎn)的最大包長(zhǎng)。

  • 控制傳輸?shù)亩它c(diǎn),低速模式最大包長(zhǎng)固定為8字節(jié),高速模式最大包長(zhǎng)固定為64字節(jié),而全速模式在8,16,32,64中選擇。

  • 等時(shí)傳輸?shù)亩它c(diǎn),全速模式最大包長(zhǎng)的上限為1023字節(jié),高速模式最大包長(zhǎng)上限是1024字節(jié),低速模式不支持等時(shí)傳輸。

  • 中斷傳輸?shù)亩它c(diǎn),低速模式最大包長(zhǎng)的上限為8字節(jié),全速模式最大包長(zhǎng)上限是64字節(jié),高速模式最大包長(zhǎng)上限是1024字節(jié)。

  • 批量傳輸?shù)亩它c(diǎn),高速模式固定為512字節(jié),全速模式最大包長(zhǎng)可在8、16、32、64字節(jié)中選擇,低速模式不支持批量傳輸。

3 USB標(biāo)準(zhǔn)請(qǐng)求

3.1 USB標(biāo)準(zhǔn)請(qǐng)求的數(shù)據(jù)結(jié)構(gòu)

  USB設(shè)備請(qǐng)求命令 :bmRequestType + bRequest + wValue + wIndex + wLength

  USB協(xié)議定義了一個(gè)8字節(jié)的標(biāo)準(zhǔn)設(shè)備請(qǐng)求,主要用在設(shè)備的枚舉過(guò)程中。這8個(gè)字節(jié)的數(shù)據(jù)使用在控制傳輸的過(guò)程中通過(guò)默認(rèn)的控制端點(diǎn)0發(fā)出的。在這8字節(jié)的數(shù)據(jù)中,包含了數(shù)據(jù)過(guò)程所需要的傳輸數(shù)據(jù)的方向、長(zhǎng)度以及數(shù)據(jù)類型等信息。正式由于8字節(jié)的標(biāo)準(zhǔn)請(qǐng)求的原因,USB協(xié)議規(guī)定,端點(diǎn)0的最大包長(zhǎng)度至少為8字節(jié),就是說(shuō),任何一個(gè)USB設(shè)備都能夠(而且必須)接收8字節(jié)的標(biāo)準(zhǔn)請(qǐng)求。

  注意:wValue、wIndex、wLength這三個(gè)域都是兩字節(jié)的。在USB協(xié)議中用的是小端結(jié)構(gòu),即低字節(jié)在先,高字節(jié)在后。

  這里只介紹了USB協(xié)議定義的標(biāo)準(zhǔn)請(qǐng)求,即bmRequestType的D6~5位位00的標(biāo)準(zhǔn)請(qǐng)求。

3.2 USB設(shè)備請(qǐng)求

  • 0 GET_STATUS:用來(lái)返回特定接收者的狀態(tài)

  • 1 CLEAR_FEATURE:用來(lái)清除或禁止接收者的某些特性

  • 3 SET_FEATURE:用來(lái)啟用或激活命令接收者的某些特性

  • 5 SET_ADDRESS:用來(lái)給設(shè)備分配地址

  • 6 GET_DEscriptOR:用于主機(jī)獲取設(shè)備的特定描述符

  • 7 SET_DEscriptOR:修改設(shè)備中有關(guān)的描述符,或者增加新的描述符

  • 8 GET_CONFIGURATION:用于主機(jī)獲取設(shè)備當(dāng)前設(shè)備的配置值(注同上面的不同)

  • 9 SET_CONFIGURATION:用于主機(jī)指示設(shè)備采用的要求的配置

  • 10 GET_INTERFACE:用于獲取當(dāng)前某個(gè)接口描述符編號(hào)

  • 11 SET_INTERFACE:用于主機(jī)要求設(shè)備用某個(gè)描述符來(lái)描述接口

  • 12 SYNCH_FRAME:用于設(shè)備設(shè)置和報(bào)告一個(gè)端點(diǎn)的同步幀

    這里主要介紹幾種常用的設(shè)備請(qǐng)求:

(1)取得描述符(Get Descriptor)

    該請(qǐng)求是在枚舉過(guò)程中使用最多的一個(gè)請(qǐng)求,主機(jī)通過(guò)發(fā)送獲得描述符請(qǐng)求讀取設(shè)備的各種描述符,從而獲得設(shè)備類型,端點(diǎn)情況等眾多重要信息。獲得描述符的接收者只能是設(shè)備,從bmRequestType的第7位可以看出,它是請(qǐng)求數(shù)據(jù)輸入的。

  該請(qǐng)求可以取得USB設(shè)備中存在的特定的描述符,其格式如下:

    該請(qǐng)求的wValue的高字節(jié)表示要取的描述字符類型,低字節(jié)表示描述符的索引值,描述的類型有:1=設(shè)備描述符;2=配置描述符;3=字符串描述符;4=接口描述符;5=端點(diǎn)描述符。wIndex的值為0或語(yǔ)言ID,當(dāng)要取得的描述符是字符描述符時(shí),該域的值為語(yǔ)言ID;當(dāng)為其他的描述符時(shí),該域?yàn)?。 wLength表示要返回的數(shù)據(jù)長(zhǎng)度,如果SETUP階段的地址使用的是預(yù)設(shè)地址0(ENDP字段0),這時(shí)的wLength值會(huì)大于實(shí)際描述的值(這是因?yàn)橛脩粢灶A(yù)設(shè)地址0來(lái)取得設(shè)備描述符時(shí),不管多少字節(jié),用戶最多只能取得前8字節(jié),即在控制傳輸過(guò)程中只有一次數(shù)據(jù)階段)。對(duì)于全速模式和低速模式,獲取描述符的標(biāo)準(zhǔn)請(qǐng)求只有三種:獲取設(shè)備描述符、獲取配置描述符、獲取字符串描述符。另外的接口描述符和端點(diǎn)描述符是跟配置描述符一并返回的,不能單獨(dú)請(qǐng)求返回(如果單獨(dú)返回,主機(jī)無(wú)法確認(rèn)他們屬于哪個(gè)配置)。

(2)設(shè)置地址(Set Address)

    該請(qǐng)求給USB設(shè)備設(shè)置地址,從而可以對(duì)USB設(shè)備進(jìn)行進(jìn)一步的訪問(wèn)。每個(gè)連接在同一主控器上的USB設(shè)備都需要有一個(gè)唯一的設(shè)備地址,這樣主機(jī)才能區(qū)分每個(gè)不同的設(shè)備。當(dāng)設(shè)備復(fù)位后,都是用默認(rèn)的地址0,主機(jī)從地址位0的設(shè)備獲取設(shè)備描述符,一旦收到第一次設(shè)備描述符之后,主機(jī)就會(huì)發(fā)送設(shè)置地址請(qǐng)求,以盡量減少設(shè)備使用公共地址0的時(shí)間。設(shè)置地址請(qǐng)求是沒(méi)有數(shù)據(jù)的,因此wLength的值為0,wIndex用不到,值為0。當(dāng)設(shè)備收到設(shè)置地址請(qǐng)求后,就直接進(jìn)入狀態(tài)過(guò)程,等待主機(jī)讀取0長(zhǎng)度的狀態(tài)數(shù)據(jù)包。主機(jī)成功讀取到狀態(tài)數(shù)據(jù)包(用ACK響應(yīng)設(shè)備),設(shè)備將啟用新的地址。格式如下:

    該請(qǐng)求與其他請(qǐng)求有一個(gè)重要的不同,該請(qǐng)求下,USB設(shè)備一直不改變它的地址,直到該請(qǐng)求的狀態(tài)階段被成功的完成,而其他請(qǐng)求的操作都是在狀態(tài)階段之前完成的。若特定的設(shè)備地址大于127,或者wIndex或我Length為非0值,那么該請(qǐng)求不執(zhí)行。

(3)設(shè)置配置(SET_CONFIGURATION)

    該請(qǐng)求對(duì)設(shè)備進(jìn)行設(shè)置。其格式如下:

    該請(qǐng)求中的wValue域的低字節(jié)表示設(shè)置的值,該值必須為0或者域配置描述符中的配置值相匹配。如果與配置描述符中的配置編號(hào)一致時(shí),表示選中該配置。該值通常為1,因?yàn)榇蠖鄶?shù)USB設(shè)備只有一種配置,配置編號(hào)為1,如果設(shè)置值等于0,表示設(shè)備在地址狀態(tài)。設(shè)備只有收到非0的配置后,才能啟動(dòng)它的非0端點(diǎn)。如果Index或wLength為非0值,那么該請(qǐng)求不執(zhí)行。

(4)清除特性(Clear Feature)

    該請(qǐng)求是用來(lái)取消一個(gè)特性,其格式如下:

    該請(qǐng)求的wValue表示特性選擇器,它對(duì)應(yīng)的值為:0=端點(diǎn),1=設(shè)備。當(dāng)某個(gè)特點(diǎn)不允許取消,或該特性根本不存在,或者指向一個(gè)根本不存在的端點(diǎn)或者接口時(shí),該請(qǐng)求將會(huì)導(dǎo)致設(shè)備請(qǐng)求失敗。如果端點(diǎn)被固件設(shè)為停止?fàn)顟B(tài),主機(jī)軟件(總線驅(qū)動(dòng)程序)也可以發(fā)送一個(gè)值為0的CLEAR_FEATURE命令清除該端點(diǎn)的停止?fàn)顟B(tài)。

 3.3 設(shè)備描述符的返回

  當(dāng)主機(jī)由端點(diǎn)0向設(shè)備發(fā)送設(shè)備描述符請(qǐng)求時(shí),設(shè)備將通過(guò)控制輸入端0來(lái)返回。在端點(diǎn)0的輸出中斷處理函數(shù)中,設(shè)備先對(duì)接收到的建立過(guò)程的數(shù)據(jù)進(jìn)行判斷,如果是獲取設(shè)備設(shè)備描述符的請(qǐng)求時(shí),那么將設(shè)備描述符數(shù)組內(nèi)容寫(xiě)入到端點(diǎn)0輸入緩沖區(qū)中,并使能端點(diǎn)發(fā)送。當(dāng)下一次主機(jī)發(fā)送IN令牌后,將自動(dòng)將端點(diǎn)0的輸入緩沖區(qū)內(nèi)的數(shù)據(jù)返回給主機(jī),首先獲取設(shè)備描述符的請(qǐng)求。

4 USB主機(jī)識(shí)別USB設(shè)備

    當(dāng)USB設(shè)備插上主機(jī)時(shí),主機(jī)就通過(guò)一系列的動(dòng)作來(lái)對(duì)設(shè)備進(jìn)行枚舉配置,即從設(shè)備讀取各種描述符信息,這樣主機(jī)就可以根據(jù)這些信息來(lái)加載合適的驅(qū)動(dòng)程序從而知道設(shè)備是什么樣的設(shè)備,如何進(jìn)行通信等。

枚舉:是USB體系中一個(gè)很重要的活動(dòng),由一系列標(biāo)準(zhǔn)請(qǐng)求組成(若設(shè)備屬于某個(gè)子類,還包含該子類定義的特殊請(qǐng)求)。通過(guò)枚舉HOST可以獲得設(shè)備的基本描述信息,如支持的USB版本,PID、VID、設(shè)備分類、供電方式、最大消耗電流、配置數(shù)量、各種類型端口數(shù)量以及傳輸能力(最大包長(zhǎng)度)。HOST根據(jù)PID和VID加載設(shè)備驅(qū)動(dòng)程序,并對(duì)設(shè)備進(jìn)行合適的配置,只有經(jīng)過(guò)枚舉的設(shè)備才能正常使用。

  根據(jù)USB協(xié)議,對(duì)于總線供電設(shè)備,在枚舉完成前最多可以從總線獲取100mA電流,在枚舉后,最多可以從總線上獲取500mA的電流。

4.1 USB設(shè)備狀態(tài)

USB設(shè)備的狀態(tài)如下:

  • 接入態(tài)(Attached):設(shè)備接入主機(jī)后,主機(jī)通過(guò)檢測(cè)信號(hào)線上的電平變化來(lái)發(fā)現(xiàn)設(shè)備的接入;

  • 供電態(tài)(Powered):就是給設(shè)備供電,分為設(shè)備接入時(shí)的默認(rèn)供電值,配置階段后的供電值(按數(shù)據(jù)中要求的最大值,可通過(guò)編程設(shè)置)

  • 缺省態(tài)(Default):USB在被配置之前,通過(guò)缺省地址0與主機(jī)進(jìn)行通信;

  • 地址態(tài)(Address):經(jīng)過(guò)了配置,USB設(shè)備被復(fù)位后,就可以按主機(jī)分配給它的唯一地址來(lái)與主機(jī)通信,這種狀態(tài)就是地址態(tài);

  • 配置態(tài)(Configured):通過(guò)各種標(biāo)準(zhǔn)的USB請(qǐng)求命令來(lái)獲取設(shè)備的各種信息,并對(duì)設(shè)備的某此信息進(jìn)行改變或設(shè)置。

  • 掛起態(tài)(Suspended):總線供電設(shè)備在3ms內(nèi)沒(méi)有總線***作,即USB總線處于空閑狀態(tài)的話,該設(shè)備就要自動(dòng)進(jìn)入掛起狀態(tài),在進(jìn)入掛起狀態(tài)后,總的電流功耗不超過(guò)280UA。

4.2 USB設(shè)備枚舉過(guò)程

    對(duì)應(yīng)USB設(shè)備的狀態(tài),host對(duì)USB設(shè)備會(huì)有以下活動(dòng):

    在枚舉過(guò)程中,都是使用控制傳輸。

(1)復(fù)位階段

    USB主機(jī)檢測(cè)到USB設(shè)備插入后,就會(huì)對(duì)設(shè)備復(fù)位。USB設(shè)備在總線復(fù)位后其地址為0,這樣主機(jī)就可以通過(guò)地址0和那些剛剛插入的設(shè)備通信。USB主機(jī)往地址為0的設(shè)備的端點(diǎn)0發(fā)送獲取設(shè)備描述符的標(biāo)準(zhǔn)請(qǐng)求。設(shè)備會(huì)將設(shè)備描述符返回給主機(jī),主機(jī)在成功獲取到數(shù)據(jù)包后,就會(huì)返回一個(gè)確認(rèn)數(shù)據(jù)包給設(shè)備,從而進(jìn)入接下來(lái)的分配地址階段。

(2)分配地址階段

    主機(jī)對(duì)設(shè)備又一次復(fù)位,就進(jìn)入到分配地址階段。主機(jī)往地址為0的設(shè)備的端點(diǎn)0發(fā)送一個(gè)設(shè)置地址的請(qǐng)求,新的設(shè)備地址就包含在建立過(guò)程的數(shù)據(jù)包中。具體的地址由主機(jī)負(fù)責(zé)管理,主機(jī)會(huì)分配一個(gè)唯一的地址給剛接入的設(shè)備。設(shè)備在收到這個(gè)建立過(guò)程后,就會(huì)進(jìn)入到狀態(tài)過(guò)程。設(shè)備等待主機(jī)請(qǐng)求狀態(tài)返回,收到狀態(tài)請(qǐng)求后,設(shè)備就返回0長(zhǎng)度的狀態(tài)數(shù)據(jù)包。如果主機(jī)確認(rèn)該狀態(tài)包已經(jīng)正確收到,就會(huì)發(fā)送應(yīng)答包ACK給設(shè)備,設(shè)備在收到這個(gè)ACK之后,就要啟用新的設(shè)備地址了。這樣設(shè)備就分配到了一個(gè)唯一的設(shè)備地址。

(3)獲取描述符階段

    獲取描述符可以形象地表述如下:

Host:你是什么設(shè)備?Device:12 01 0100....Device DescriptorHost:你有幾種功能?Device:09 02 09....Configuration DescriptorHost:每個(gè)功能有幾個(gè)接口?Device:09 04 00....Interface DescriptorHost:每個(gè)接口使用哪幾個(gè)端點(diǎn)?Device:06 05 82....Endpoint DescriptorHost:好了,我知道你是誰(shuí)了,開(kāi)始傳輸設(shè)備吧!Device:OK,Read Go!

    具體的過(guò)程如下所示:

第一步:

⑴用戶將一個(gè)USB設(shè)備插入U(xiǎn)SB端口,主機(jī)為端口供電,設(shè)備此時(shí)處于上電狀態(tài)。主機(jī)檢測(cè)設(shè)備。集線器使用中斷通道將事件報(bào)告給主機(jī)。

⑵主機(jī)發(fā)送Get_Port_Status(讀端口狀態(tài))請(qǐng)求,以獲取更多的設(shè)備信息。返回的消息告訴主機(jī)該設(shè)備是什么時(shí)候連接的。集線器檢測(cè)設(shè)備是低速運(yùn)行還是高速運(yùn)行,并將此信息送給主機(jī),這是對(duì)Get_Port_Status請(qǐng)求的響應(yīng)。

⑶主機(jī)發(fā)送Set_Port_Feature(寫(xiě)端口狀態(tài))請(qǐng)求給集線器,要求它復(fù)位端口,請(qǐng)求集線器來(lái)重新設(shè)置端口。集線器使設(shè)備的USB數(shù)據(jù)線處于重啟(RESET)狀態(tài)至少10ms。

⑷主機(jī)使用Chirp K信號(hào)來(lái)了解全速設(shè)備是否支持高速運(yùn)行。

⑸主機(jī)發(fā)送另一個(gè)Get_Port_Status請(qǐng)求,確定設(shè)備是否已經(jīng)從復(fù)位狀態(tài)退出。返回的數(shù)據(jù)有一位表示設(shè)備仍然處于重啟狀態(tài)。當(dāng)集線器釋放了重啟狀態(tài),設(shè)備此時(shí)處于缺省狀態(tài),且已準(zhǔn)備好在零端點(diǎn)通過(guò)缺省通道響應(yīng)主機(jī)控制傳輸。缺省地址為00h,設(shè)備能從總線獲取高達(dá)100mA的電流。

⑹集線器檢測(cè)設(shè)備速度

集線器通過(guò)測(cè)定哪根信號(hào)線(D+或D-)在空閑時(shí)有更高的電壓來(lái)檢測(cè)設(shè)備是低速設(shè)備還是全速設(shè)備。全速和高速設(shè)備D+有上拉電阻,低速設(shè)備D-有上拉電阻。

⑺獲取最大數(shù)據(jù)包長(zhǎng)度(開(kāi)始第一次數(shù)據(jù)傳輸)

    主機(jī)向address 0發(fā)送Get_Device_Deor(讀設(shè)備描述符)的標(biāo)準(zhǔn)請(qǐng)求(這是一個(gè)控制傳輸?shù)?span style="text-decoration-line: underline;">建立過(guò)程),以取得缺省控制管道所支持的最大數(shù)據(jù)包長(zhǎng)度。設(shè)備在接收到該請(qǐng)求后,會(huì)按照主機(jī)請(qǐng)求的參數(shù),在數(shù)據(jù)過(guò)程將設(shè)備描述符返回給主機(jī)。主機(jī)在成功獲取到一個(gè)數(shù)據(jù)包的設(shè)備描述符,并確認(rèn)沒(méi)有錯(cuò)誤后,就會(huì)返回一個(gè)0長(zhǎng)度的確認(rèn)數(shù)據(jù)包(狀態(tài)過(guò)程)給設(shè)備,從而進(jìn)入接下來(lái)的設(shè)置地址階段。

  注意,第一次主機(jī)只會(huì)讀取一個(gè)數(shù)據(jù)包的設(shè)備描述符。標(biāo)準(zhǔn)的設(shè)備描述符具有18個(gè)字節(jié),有的USB設(shè)備的端點(diǎn)0大小不足18字節(jié)(但至少具有8字節(jié)),這種情況下USB主機(jī)也是只發(fā)送一次數(shù)據(jù)輸入請(qǐng)求,多余的數(shù)據(jù)將不會(huì)再次請(qǐng)求,即在第一次獲取設(shè)備描述符時(shí),只需返回一次數(shù)據(jù)即可。端點(diǎn)0的長(zhǎng)度包含在設(shè)備描述符的bMaxPacketSize0字段中,其地址偏移量為7,所以這時(shí)主機(jī)只需讀取該描述符的前8個(gè)字節(jié)之后,就知道端點(diǎn)0的最大長(zhǎng)度了,這是因?yàn)槎它c(diǎn)0最大包長(zhǎng)度剛好在設(shè)備描述符的第8字節(jié)處。注意,主機(jī)一次只能枚舉一個(gè)USB設(shè)備,所以同一時(shí)刻只能有一個(gè)USB設(shè)備使用缺省地址0。

例:主機(jī)向設(shè)備發(fā)送一個(gè)八字節(jié)請(qǐng)求:80 06 00 01 00 00 40 00,設(shè)備接收到請(qǐng)求后產(chǎn)生一個(gè)中斷,我們可以通過(guò)讀中斷寄存器知道中斷源,并且可以加讀最后狀態(tài)寄存器來(lái)確定第一個(gè)接到的包是否為一個(gè)Setup包。當(dāng)控制器處理程序判斷出它是一個(gè)Get_descriptor請(qǐng)求時(shí),把設(shè)備描述符的前16個(gè)字節(jié)發(fā)送到端點(diǎn)0緩沖區(qū)中。剩下的2個(gè)字節(jié)描述符第一次請(qǐng)求時(shí)不再發(fā)送。

第二步:

⑻主機(jī)分配一個(gè)新的地址給設(shè)備

    主機(jī)對(duì)設(shè)備又一次復(fù)位,這時(shí)就進(jìn)入到了設(shè)置地址階段。主機(jī)通過(guò)向地址0發(fā)送一個(gè)Set_Address請(qǐng)求來(lái)分配一個(gè)唯一的地址給設(shè)備(控制傳輸?shù)慕⑦^(guò)程),新的設(shè)備地址包含在建立過(guò)程的數(shù)據(jù)包中。設(shè)備在受到這個(gè)建立過(guò)程之后,直接進(jìn)入到狀態(tài)過(guò)程,因?yàn)檫@個(gè)控制傳輸沒(méi)有數(shù)據(jù)過(guò)程。設(shè)備在等待主機(jī)請(qǐng)求狀態(tài)返回(一個(gè)輸入令牌包),收到令牌包后,設(shè)備就返回0長(zhǎng)度的狀態(tài)數(shù)據(jù)包。如果主機(jī)確認(rèn)該狀態(tài)包已經(jīng)正常收到,就會(huì)發(fā)送應(yīng)答包ACK給設(shè)備,設(shè)備在收到這個(gè)ACK之后,就會(huì)啟用新的設(shè)備地址,這樣設(shè)備就被分配到一個(gè)唯一的設(shè)備地址,從此開(kāi)始所有通信都使用這個(gè)新地址。

例:當(dāng)主機(jī)收到正確的前16字節(jié)描述符后,會(huì)給設(shè)備分配一個(gè)地址,我的PC分配的地址為:0x03(這個(gè)要看你的機(jī)子當(dāng)時(shí)的USB接口設(shè)備數(shù)目而定) Set_Address 請(qǐng)求所發(fā)送的數(shù)據(jù)為:00 05 03 00 00 00 00 00,其中的03就表示主機(jī)為設(shè)備分配的地址為0x03,在以后的通信里設(shè)備就只對(duì)0x03地址作出應(yīng)答。當(dāng)設(shè)備產(chǎn)生一個(gè)接收中斷后,根據(jù)所分配的地址設(shè)置設(shè)備的地址寄存器相應(yīng)位。

第三步

主機(jī)再次獲取設(shè)備描述符,主機(jī)會(huì)向新地址重新發(fā)送Get_Device_Deor命令,此次讀取其設(shè)備描述符的全部字段,以了解該設(shè)備的總體信息,如VID,PID,這是會(huì)存在多次的請(qǐng)求數(shù)據(jù)輸入(即主機(jī)會(huì)發(fā)送多個(gè)IN令牌包)。

例:主機(jī)發(fā)送設(shè)備描述符標(biāo)準(zhǔn)請(qǐng)求Get_descriptor:80 06 00 01 00 00 12 00,此次將要求把18個(gè)字節(jié)全部發(fā)送完。所以主機(jī)要分兩次來(lái)讀取。第一次讀取16個(gè)字節(jié),第二次讀取兩個(gè)字節(jié),最后主機(jī)發(fā)送0表示發(fā)送完畢的應(yīng)答。

第四步

主機(jī)獲取配置描述符,配置描述符總共9字節(jié),主機(jī)在獲取配置描述符后,會(huì)根據(jù)描述符中所描述的配置集合總長(zhǎng)度,獲得配置集合。主機(jī)會(huì)向設(shè)備循環(huán)發(fā)送Get_Device_Configuration命令,要求USB設(shè)備回答,以讀取全部配置信息。配置集合包括配置描述符、接口描述符、類特殊描述符(如果有)、端點(diǎn)描述符等。

⑾主機(jī)發(fā)送Get_Device_String命令,獲得字符集描述(unicode)(如果有),比如產(chǎn)商、產(chǎn)品描述、型號(hào)等等。此時(shí)主機(jī)將會(huì)彈出窗口,展示發(fā)現(xiàn)新設(shè)備的信息,產(chǎn)商、產(chǎn)品描述、型號(hào)等。

     根據(jù)Device_Deor和Device_Configuration應(yīng)答,PC判斷是否能夠提供USB的Driver,一般win2k能提供幾大類的設(shè)備,如游戲操作桿、存儲(chǔ)、打印機(jī)、掃描儀等,操作就在后臺(tái)運(yùn)行。但是Win98卻不可以,所以在此時(shí)將會(huì)彈出對(duì)話框,索要USB的Driver。

⑿主機(jī)分配并加載設(shè)備驅(qū)動(dòng)程序,這時(shí)就可能作應(yīng)用中的數(shù)據(jù)傳輸了。

⒀主機(jī)發(fā)送Set_Configuration(x)(寫(xiě)配置)命令請(qǐng)求為該設(shè)備選擇一個(gè)合適的配置(x代表非0的配置值)。如果配置成功,USB設(shè)備進(jìn)入"配置"狀態(tài),并可以和客戶軟件進(jìn)行數(shù)據(jù)傳輸。此時(shí),常規(guī)的USB完成了其必須進(jìn)行的配置和連接工作,至此設(shè)備應(yīng)當(dāng)可以開(kāi)始使用。不過(guò),USB協(xié)議還提供了一些用戶可選的協(xié)議,設(shè)備如果不應(yīng)答,也不會(huì)出錯(cuò),但是會(huì)影響到系統(tǒng)的功能。

⒁主機(jī)為復(fù)合設(shè)備接口分配驅(qū)動(dòng)程序。如果集線器檢測(cè)到有過(guò)流現(xiàn)象,或者主機(jī)要求集線器關(guān)閉電源,則USB總線切斷設(shè)備供電電源。在這種情況下,設(shè)備與主機(jī)無(wú)法通信,但設(shè)備處于連接狀態(tài)。

4.3 USB枚舉實(shí)例

    對(duì)2440的USB HOST進(jìn)行初始化完畢(主要包括對(duì)符合OHCI規(guī)范的寄存器的初始化—總線復(fù)位、中斷使能、清除中斷標(biāo)志、電源管理、內(nèi)存指針寄存器的初始化,各種數(shù)據(jù)結(jié)構(gòu)的初始化等),等待USB設(shè)備的插入,當(dāng)2440檢測(cè)到有設(shè)備插入,就要對(duì)設(shè)備進(jìn)行枚舉了。起始枚舉就相當(dāng)于主機(jī)和設(shè)備建立連接的過(guò)程(接頭),Host向Device詢問(wèn)一些東西,Device將自身的設(shè)備類型,如何進(jìn)行通信報(bào)告給Host,這樣Host就知道怎么對(duì)Device進(jìn)行操作了。

    枚舉的過(guò)程實(shí)際上用到而且只用到了總線的"控制傳輸(Control Transfer)"。這種傳輸方式通常用于配置/命令/狀態(tài)等情形,其中的設(shè)置操作setup和狀態(tài)操作status過(guò)程的數(shù)據(jù)包具有USB協(xié)議定義的數(shù)據(jù)結(jié)構(gòu),因此,控制傳輸只能通過(guò)消息管道進(jìn)行。

    一個(gè)完整的控制傳輸包括三個(gè)過(guò)程:

  • 建立連接。

  • 數(shù)據(jù)過(guò)程(可選) 。

  • 狀態(tài)過(guò)程。

     建立連接的過(guò)程都是由Host發(fā)起,它開(kāi)始于一個(gè)Setup令牌包,后面緊跟一個(gè)DATA0包。如果是控制輸入傳輸,數(shù)據(jù)過(guò)程則為輸入數(shù)據(jù),若是控制輸出傳輸,則數(shù)據(jù)過(guò)程是輸出數(shù)據(jù)。

    數(shù)據(jù)過(guò)程的可選型是指設(shè)置過(guò)程需要指定數(shù)據(jù)長(zhǎng)度,如果指定為0,則沒(méi)有數(shù)據(jù)過(guò)程。狀態(tài)過(guò)程跟在數(shù)據(jù)過(guò)程之后,狀態(tài)過(guò)程恰好和數(shù)據(jù)過(guò)程的數(shù)據(jù)傳輸方向相反,因?yàn)榇穗A段主要是用來(lái)確認(rèn)之前兩階段的所有數(shù)據(jù)都已經(jīng)正確傳輸了。

    好了,下面就結(jié)合我的這個(gè)實(shí)例來(lái)看看枚舉的詳細(xì)過(guò)程:

①控制2440向U盤(pán)發(fā)送第一個(gè)Setup包,內(nèi)容是80 06 00 01 00 00 08 00,其中最后的00 08表示得到DEVICE_DCESCRIPTOR的前8個(gè)字節(jié),因?yàn)檫@個(gè)包的主要目的是要獲得USB Device中端點(diǎn)0的最大包的大小(第8個(gè)字節(jié)),所以只需要8個(gè)字節(jié)就可以了。USB Device返回的設(shè)備標(biāo)識(shí)符為12 01 10 01 00 00 00 40,下面我們需要把0x40記錄下來(lái),將其放到Endpoint Descriptor數(shù)據(jù)結(jié)構(gòu)的DWORD0的MPS(bit16~bit32)塊中去。

②接下來(lái)2440發(fā)送第二個(gè)Setup包,內(nèi)容是00 05 01 00 00 00 00 00,這一次的作用是為USB設(shè)備分配地址。如果USB Device接收并接受了此地址設(shè)置包,會(huì)返回一個(gè)長(zhǎng)度為0的數(shù)據(jù)包。主機(jī)接收到長(zhǎng)度為0的狀態(tài)包之后就會(huì)返回一個(gè)ACK給Device,Device再接收到這個(gè)ACK之后,就可以啟用新地址了。這樣Device就得到了一個(gè)唯一的設(shè)備地址,作為主機(jī)通信的唯一表示。

③發(fā)送第三個(gè)Setup包,內(nèi)容是80 06 00 02 00 00 09 00,這次是為了獲取配置描述符集合的大小,此位位于讀回?cái)?shù)據(jù)的第三個(gè)字節(jié)。U盤(pán)返回的數(shù)據(jù)為09 02 20 00 01 01 00 80 32,即描述符集合總大小為0x20。

④發(fā)送第四個(gè)Setup包,內(nèi)容是80 06 00 02 00 00 09 00,和上次不同的僅僅是,這次要讀回來(lái)的數(shù)據(jù)是整個(gè)配置描述符區(qū)域。U盤(pán)返回來(lái)的數(shù)據(jù)是09 02 20 00 01 01 00 80 32 09 04 00 00 02 08 06 50 00 07 05 82 02 40 00 00 07 05 02 02 40 00 00。這時(shí)候我們就可以知道該設(shè)備是什么類型的設(shè)備,支持什么樣的操作了。

    上述這兩個(gè)過(guò)程也有的程序就是直接讀取0xff個(gè)字符大小,當(dāng)然同樣可以達(dá)到讀回設(shè)備描述符集合的目的。至此,我們已經(jīng)得到了所需要的設(shè)備信息,之后就可以對(duì)設(shè)備進(jìn)行配置了。

⑤向設(shè)備發(fā)送第五個(gè)Setup包,數(shù)據(jù)為00 09 01 00 00 00 00 00,USB Device返回一個(gè)長(zhǎng)度為0的數(shù)據(jù)包,表明數(shù)據(jù)正確接收。至此,USB枚舉過(guò)程就完成了。初始設(shè)置步驟:就是一個(gè)由SET事務(wù)構(gòu)成的傳輸

    可選數(shù)據(jù)步驟:就是一個(gè)由IN或OUT事務(wù)構(gòu)成的傳輸,這個(gè)步驟是可選的,要看初始設(shè)置步驟有沒(méi)有要求讀/寫(xiě)數(shù)據(jù)(由SET事務(wù)的數(shù)據(jù)包階段發(fā)送的標(biāo)準(zhǔn)請(qǐng)求命令決定)。

    狀態(tài)信息步驟:這個(gè)步驟就是要獲取狀態(tài)信息,由IN或OUT事務(wù)構(gòu)成的傳輸,但是要注意這里的IN和OUT事務(wù)和之前的INT和OUT事務(wù)有兩點(diǎn)不同:

    1) 傳輸方向相反,通常IN表示設(shè)備往主機(jī)送數(shù)據(jù),OUT表示主機(jī)往設(shè)備送數(shù)據(jù);在這里,IN表示主機(jī)往設(shè)備送數(shù)據(jù),而OUT表示設(shè)備往主機(jī)送數(shù)據(jù),這是為了和可選數(shù)據(jù)步驟相結(jié)合;

    2) 在這個(gè)步驟里,數(shù)據(jù)包階段的數(shù)據(jù)包都是0長(zhǎng)度的,即SYNC+PID+CRC16。 

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
USB入門(mén)系列之六 —— USB設(shè)備的枚舉過(guò)程
USB的八個(gè)問(wèn)題和答案(適用初學(xué)者)--------轉(zhuǎn)帖??!謝謝原創(chuàng)者! 中國(guó)電子開(kāi)發(fā)網(wǎng)(...
我理解的USB接口通信的幾個(gè)關(guān)鍵點(diǎn)
USB協(xié)議
USB?設(shè)備枚舉的數(shù)據(jù)傳輸過(guò)程
【轉(zhuǎn)】USB的枚舉過(guò)程 與 USB基礎(chǔ)知識(shí)
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服