USB2.0协议原文阅读笔记
1. 前言
在了解一個(gè)協(xié)議時(shí),有幾點(diǎn)是十分重要的:
- 層次結(jié)構(gòu)
 - 應(yīng)用場(chǎng)景
 
不同的開發(fā)者,關(guān)心的協(xié)議層不一樣,不是所有的都需要掌握。
為了向下兼容的設(shè)計(jì)
 USB2.0是從USB1.0的基礎(chǔ)上發(fā)展而來的,能夠完美的向下兼容,USB1.0包含Low-Speed和Full-Speed模式,在USB2.0的時(shí)候引入了High-Speed模式,HS可以被看做FS的擴(kuò)展。USB3.x在USB2.0的基礎(chǔ)上又引入了Super-Speed。但是SS是單獨(dú)的一根通道了,直接改變了物理結(jié)構(gòu)。
冷知識(shí):在插入U(xiǎn)SB3.x的U盤時(shí),角度不對(duì)可能會(huì)被識(shí)別為2.0。
三部分:
- USB interconnect
 - USB Devices
 - USB Host
 
三種速度模式:
- high-Speed 480Mb/s HS
 - full-Speed 12M/s FS
 - low-Speed 1.5M/s LS
 
2. 電氣特性-物理層
物理層還是和USB1.0一樣,為四線串行,一根Vbus用于供電或者插拔檢測(cè),一根GND,兩根差分?jǐn)?shù)據(jù)線D+,D-用于數(shù)據(jù)傳遞。
差分線因?yàn)槠淇垢蓴_性得到了廣泛的應(yīng)用。
 
 USB設(shè)備對(duì)總線上數(shù)據(jù)線的電壓比較敏感,在不同的速度模式,D+和D-的關(guān)系表示不同的含義
USB供電的電壓范圍是4.4V-5.25V,電流范圍為500mA。每個(gè)USB設(shè)備必須在自己的配置描述符中申明其對(duì)Vbus上電流的要求。
(所以很多快充應(yīng)該都不是USB2.0的,最大功率才幾w)
在物理層上,USB收發(fā)器包括一個(gè)接收器和一個(gè)發(fā)送器。在低速和全速的模式下,數(shù)據(jù)使用電壓驅(qū)動(dòng),高速模式下使用電流驅(qū)動(dòng)
發(fā)送器包括:
- 全、低速驅(qū)動(dòng)器
 - 支持高速傳輸?shù)碾娏黩?qū)動(dòng)器
 
接收器包括
- 全、低速的差分接收器和兩個(gè)單端的接收器
 - 支持高速傳輸?shù)牟罘纸邮掌骱透咚僭O(shè)備連接斷開檢測(cè)器
 
D+,D-信號(hào)線上都有一個(gè)1.5k上拉電阻和一個(gè)15k的下拉電阻。在高速模式下,USB主機(jī)和設(shè)備端會(huì)掛載一個(gè)45Ω的電阻。通過改變信號(hào)線上的上下拉可以改變信號(hào)線電平,從而進(jìn)入不同的速度模式。
2.1 USB信號(hào)特性
三種狀態(tài):靜止態(tài),差分態(tài),單端態(tài)。
- 靜止態(tài):無驅(qū)動(dòng),僅僅由上下拉電阻控制,在低速和全速模式下,D+和D-會(huì)極性相反(J/K)。
 - 單端態(tài):D+和D-同時(shí)為低時(shí),SE0,在高速模式下D+和D-會(huì)被保持低電平(SE0)。
 - 差分態(tài):在低速和全速或者高速情況下,D+的電壓比D-高時(shí)表示差分信號(hào)1,D-的電壓比D+高時(shí)表示差分信號(hào)0,注意:高速要求的電壓差值更高,為360mV。在高速和全速模式下,J狀態(tài)代表差分信號(hào)1,K狀態(tài)代表差分信號(hào)0,低速模式下相反。高速狀態(tài)可以理解為一種特殊的全速模式。
 
注意:在高速模式下,還存在兩種差分狀態(tài):Chirp K和Chirp J相比J/K,電壓更高。
3. 傳輸層
3.1 數(shù)據(jù)編碼方式
由于USB無時(shí)鐘線,所以在傳輸信號(hào)時(shí),使用反向不歸零點(diǎn)編碼(NRZI)。即當(dāng)數(shù)據(jù)位為1時(shí),狀態(tài)不發(fā)生變化,數(shù)據(jù)位0時(shí),狀態(tài)翻轉(zhuǎn)。
3.2 傳輸層結(jié)構(gòu)
傳輸層用到的一些概念:
- USB Physical Device :位于USB電纜末端的一塊硬件,可以執(zhí)行一些有用的終端用戶功能
 - Client Software:在主機(jī)上執(zhí)行的軟件,對(duì)應(yīng)于一個(gè)USB設(shè)備。此客戶端軟件通常與操作系統(tǒng)一起提供,或與USB設(shè)備一起提供
 - USB System Software:在一個(gè)特定的操作系統(tǒng)中支持USB的軟件。USB系統(tǒng)軟件通常與操作系統(tǒng)一起提供,獨(dú)立于特定的USB設(shè)備或客戶端軟件
 - USB Host Controller (Host Side Bus Interface):允許將USB設(shè)備連接到主機(jī)上的硬件和軟件
 
包,事務(wù),傳輸?shù)母拍?/strong>
一次傳輸包含多次事務(wù),一個(gè)事務(wù)包含多個(gè)包
 
3.3 物理總線拓?fù)?/h3>
USB網(wǎng)絡(luò)可以通過USB Hub進(jìn)行擴(kuò)展,但是擴(kuò)展不是無限的。最多127個(gè)。
 
3.4 邏輯總線拓?fù)?/h3>
雖然物理上多個(gè)Hub連接了多個(gè)網(wǎng)絡(luò),但是,在邏輯上,所有的Logical Device都是掛載在Host下的,Hub對(duì)于Host來說是透明的。
 
 對(duì)于運(yùn)行在操作系統(tǒng)上的軟件來說,每個(gè)CSw對(duì)應(yīng)一個(gè)Function。
 
 Function通過接口(Interface)和管道(Pipe Bundle)進(jìn)行連接,管道又連接到Client SW上。
這些管道并不是物理上的,而是邏輯上的管道,一個(gè)Function對(duì)應(yīng)一個(gè)Interface對(duì)應(yīng)一個(gè)Pipe。一個(gè)Interface由多個(gè)Endpoint組成。
 
貼個(gè)原文以防翻譯不到位:
 
 每個(gè)Endpoint都是單向的,輸入或輸出,一個(gè)Device可以由多個(gè)Endpoint組成,每個(gè)Endpoint在連接時(shí)就會(huì)被設(shè)置唯一的地址和端點(diǎn)號(hào)
 
 Endpoint zero:
 端口0是一個(gè)特殊的端口,可以對(duì)所有設(shè)備進(jìn)行初始配置,輸入輸出模式。The USB System Software使用 a default control method來初始化和一般操作邏輯設(shè)備(例如,配置邏輯設(shè)備)作為默認(rèn)控制
4. 協(xié)議層內(nèi)容
4.1 數(shù)據(jù)包字段格式(token)
由于在實(shí)際傳輸中,數(shù)據(jù)包還需要經(jīng)過NRZI和位bit填充。為方便討論時(shí),不考慮上面兩項(xiàng)。
4.1.1 PID
(Packet Identifier)
 緊跟在SYNC上,8位,低四位代表包類型,高四位為低四位的取反
 
 Host和Function可以根據(jù)PID包的內(nèi)容確定包的類型。
| token | - | 
| E1 | OUT | 
| 69 | IN | 
| A5 | SOF | 
| 2D | SETUP | 
| data | - | 
| DATA0 | C3 | 
| DATA1 | 4B | 
| DATA2 | 87 | 
| MDATA | 0F | 
| handshake | - | 
| ACK | D2 | 
| NAK | 5A | 
| STALL | 1E | 
| NYET | 96 | 
| special | - | 
| PRE | 3C | 
| ERR | 3C(一樣的) | 
| SPLIT | 78 | 
| PING | B4 | 
| PID的含義可以查看下圖中的描述。 | 
4.1.2 地址字段
地址字段包括地址(7bit)和Endpoint number (4bit)
 Function address 字段指定特定的Function,根據(jù)PID的類型,表示原地址或者目的地址。
 下面這些類型的包會(huì)包含地址字段:
- SETUP
 - IN
 - OUT
 - PING
 - SPLIT
 
7bit可以表示至少128個(gè)地址,但是0地址要保留,每一個(gè)地址對(duì)應(yīng)一個(gè)Function,所以一共支持127個(gè)Function。
 在地址字段后還附帶了一個(gè)Endpoint字段,允許更靈活地尋址需要多個(gè)Endpoint的Function
 LS設(shè)備支持最多三個(gè)Pipe,FS,HS最多支持16個(gè)IN和OUT Pipe
 
4.1.3 幀數(shù)字段
幀數(shù)字段是一個(gè)11位的字段,由主機(jī)按每幀遞增。幀號(hào)字段在達(dá)到其最大值7FFH時(shí)滾動(dòng),并且僅在每個(gè)(微)幀開始時(shí)僅以SOF令牌發(fā)送。
4.1.4 data字段
數(shù)據(jù)字段的范圍從0-1024字節(jié),必須是字節(jié)的整數(shù)倍
 
4.1.5 CRC字段
Token(令牌包)的CRC為五位的
 
 Data(數(shù)據(jù)包)的CRC是十六位的
 
 計(jì)算方法:通過專用的CRC計(jì)算器即可:
http://www.ip33.com/crc.html
4.2 數(shù)據(jù)包結(jié)構(gòu)
4.2.1 令牌包(token)
 對(duì)于OUT和SETUP事務(wù),ADDR和ENDP字段標(biāo)識(shí)了后續(xù)DATA事務(wù)的地址,對(duì)于IN事務(wù),指定了哪個(gè)端點(diǎn)才能傳輸數(shù)據(jù)包。只有主機(jī)可以發(fā)送token令牌包。CRC5只校驗(yàn)ADDR和ENDP字段。
4.2.2 幀開始數(shù)據(jù)包(SOF)
全速總線由主機(jī)以每1.00ms±0.0005ms發(fā)出一次幀啟動(dòng)(SOF)包,高速總線為125μs±0.0625μs。SOF數(shù)據(jù)包由一個(gè)指示包類型的PID和一個(gè)11位幀號(hào)字段組成,如圖8-13所示。
 SOF令牌包括僅限令牌的事務(wù),該事務(wù)以與每個(gè)幀的開始相對(duì)應(yīng)的精確時(shí)間間隔分配一個(gè)SOF標(biāo)記和伴隨的幀號(hào)。所有的高速和全速功能,包括集線器,接收SOF數(shù)據(jù)包。
 
 
 幀與微幀是物理層的數(shù)據(jù)的表述吧。
 
4.2.2數(shù)據(jù)包(data)
低速設(shè)備允許的最大數(shù)據(jù)有效負(fù)載大小為8字節(jié)。全速設(shè)備的最大數(shù)據(jù)有效載荷大小為1023。高速設(shè)備的最大數(shù)據(jù)有效負(fù)載大小為1024字節(jié)
 
4.2.3握手包(handshake)
握手?jǐn)?shù)據(jù)包用于報(bào)告數(shù)據(jù)事務(wù)的狀態(tài),并可以返回指示數(shù)據(jù)的接收成功、命令接受或拒絕、流控制和停止條件的值。只有支持流控制的事務(wù)類型才能返回握手
在握手階段和數(shù)據(jù)階段會(huì)返回handshake包,handshake包后面一個(gè)字節(jié)必定跟隨一個(gè)EOP,如果沒有那則會(huì)被認(rèn)為無效。
 
- ACK表示在數(shù)據(jù)字段上接收到的數(shù)據(jù)包沒有比特內(nèi)容或CRC錯(cuò)誤,并且數(shù)據(jù)PID接收到正確
 - NAK表示Function無法接受來自主機(jī)(OUT)的數(shù)據(jù),或者Function沒有要傳輸?shù)街鳈C(jī)(IN)的數(shù)據(jù)
 - STALL由Function響應(yīng)IN令牌或在OUT的數(shù)據(jù)階段之后或響應(yīng)PING事務(wù)而返回
 - NYET是一種高速的握手,在兩種情況下返回。它由一個(gè)HS Endpoint 作為PING協(xié)議的一部分返回。當(dāng)FS/LS transaction尚未完成或Hub無法處理拆分交易時(shí),Hub也可以返回NYET以響應(yīng)拆分交易
 - ERR是一種高速的握手,它返回來允許高速集線器在全/低速總線上報(bào)告錯(cuò)誤
 
4.2.4 SYNC
因?yàn)閁SB總線無單獨(dú)的時(shí)鐘信號(hào),所以數(shù)據(jù)的跨時(shí)鐘域同步只能通過特定的字段實(shí)現(xiàn)。需要通過在數(shù)據(jù)包的前面都以同步包(SYNC)開始,被將輸入數(shù)據(jù)與本地時(shí)鐘對(duì)齊。
4.2.5 Split Transaction Special Token Packets
還有幾種特殊的包在分離傳輸時(shí)候使用。以后用到了再系統(tǒng)的學(xué)一下。
 
 
 
4.3 包傳輸過程
4.3.1 批量事務(wù)( Bulk Transactions)
 當(dāng)主機(jī)準(zhǔn)備好傳輸批量數(shù)據(jù)時(shí),它首先發(fā)出一個(gè)OUT令牌包,然后是一個(gè)數(shù)據(jù)包(或PING特殊令牌包)。
 如果數(shù)據(jù)接收函數(shù)沒有錯(cuò)誤,它將返回三個(gè)(或四個(gè)包括NYET,設(shè)備高速運(yùn)行)握手。
如果接收到的數(shù)據(jù)包存在CRC或比特內(nèi)容錯(cuò)誤,則不返回握手。
 
 從DATA0開始,DATA0和DATA1交替?zhèn)鬏敗?/p> 
4.3.2 控制傳輸( Control Transfers)
 控制事務(wù)最少有兩個(gè)傳輸階段:Setup and Status
 在Setup and Status和之間可能包含DATA階段
 接收到SETUP正常回復(fù)ACK,如果數(shù)據(jù)損壞則丟棄,不回復(fù)。
Data階段可能包含多個(gè)數(shù)據(jù),數(shù)據(jù)傳輸規(guī)則與批量傳輸一致。
 
4.3.3 中斷事務(wù)(Interrupt Transactions)
 如果有中斷被掛起,Function將中斷信息作為數(shù)據(jù)包返回。
 如果Endpoint沒有要返回的新的中斷信息(即,沒有掛起的中斷),則該Function將在數(shù)據(jù)階段返回一個(gè)NAK握手。
 如果為中斷Endpoint設(shè)置了Halt功能,則該函數(shù)將返回一個(gè)STALL握手。
4.3.4 同步事務(wù)(Isochronous Transactions)
 同步事務(wù)僅有Token和Data階段,無handshake階段。同步事務(wù)不支持握手階段或重試功能
 注意:FS設(shè)備或Host控制器應(yīng)該能夠接受數(shù)據(jù)包中的DATA0或DATA1 PID,但是只能發(fā)送DATA0。
 HS主機(jī)控制器必須能夠接受和發(fā)送數(shù)據(jù)包中的DATA0、DATA1、DATA2或MDATA PID。
4.3.5 數(shù)據(jù)切換同步和重試 (Data Toggle Synchronization and Retry)
USB提供了一種機(jī)制,以保證跨多個(gè)事務(wù)的數(shù)據(jù)發(fā)送器和接收器之間的數(shù)據(jù)序列同步。這種機(jī)制提供了一種保證發(fā)射機(jī)和接收機(jī)都能正確地解釋事務(wù)的握手階段的方法。
同步是通過使用DATA0和DATA1 PID 以及 數(shù)據(jù)發(fā)射器和接收器使用的獨(dú)立的數(shù)據(jù)切換序列位來實(shí)現(xiàn)的。
只有當(dāng)接收方能夠接收數(shù)據(jù)并接收到具有正確數(shù)據(jù)PID的無錯(cuò)誤數(shù)據(jù)包時(shí),接收器序列位才會(huì)切換。
 僅當(dāng)數(shù)據(jù)發(fā)射器接收到有效的ACK握手時(shí),發(fā)射器序列位才會(huì)切換。
 數(shù)據(jù)發(fā)射器和接收器必須在事務(wù)開始時(shí)同步它們的序列位。所使用的同步機(jī)制隨事務(wù)類型而異。同步傳輸不支持?jǐn)?shù)據(jù)切換同步。
 可以直接看圖。
在數(shù)據(jù)傳輸之間,會(huì)有token傳輸用來初始化序列位:首先Tx和Rx都處于一個(gè)未知狀態(tài),當(dāng)Tx給Rx發(fā)送DATA0后,Rx從x變?yōu)?
 
當(dāng)Rx收到DATA0數(shù)據(jù)時(shí),序列位從0變?yōu)?,Rx發(fā)送ACK,TX收到ACK后,序列位從0變?yōu)?,接下來發(fā)送DATA1數(shù)據(jù),Rx收到后序列位變?yōu)?,并發(fā)送ACK,Tx從1變?yōu)?。如果不滿足這個(gè)情況,將被認(rèn)為錯(cuò)誤。
4.3.6 錯(cuò)誤檢測(cè)和補(bǔ)救(Error Detection and Recovery)
5. 后言
這次的整體架構(gòu)是由FPGA實(shí)現(xiàn)的USB2.0控制器通過PCIe掛載在CPU上,USB2.0控制器通過UTMI總線與PHY芯片相連,主要由PHY芯片構(gòu)成的轉(zhuǎn)接板與外部USB設(shè)備相連。本實(shí)驗(yàn)打算主要在UTMI總線上分析USB包行為。可能前期理解會(huì)有問題,不斷更新中。
總結(jié)
以上是生活随笔為你收集整理的USB2.0协议原文阅读笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 计算机网络习题:网络层部分
 - 下一篇: Android中两个textview重叠