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