USB 之一 USB2.0 规范详解 第一部分
注意
- 對于物理特性僅做簡單說明
- 主要是針對 USB 2.0 規范的前八章。后續見 第二部分
關于USB 2.0
??在USB官方網站( http://www.usb.org/ )包含了我們必需的所有的USB協議規范。目前官網最新規范為USB 3.2。默認打開官網的 Document 菜單,顯示的就是 USB 3.2 的相關規范文檔,在 Document 菜單下有USB2.0相關規范。USB 2.0 的下載頁面為http://www.usb.org/developers/docs/usb20_docs/。
??其中 USB 規范定義了各種 USB Class,具體看見http://www.usb.org/developers/docs/devclass_docs/。該頁面下面就是每個類對應的文檔。
簡介
??USB(Universal Serial Bus) 是一種支持熱插拔的高速串行傳輸總線,它使用 差分信號 來傳輸數據。在 USB 1.0和 USB 1.1 版本中,只支持 1.5Mb/s 的低速(low-speed)模式和 12Mb/s 的全速(full-speed)模式,在 USB 2.0 中,又加入了480Mb/s 的高速模式,USB 3.0(super speed),傳輸速率最大5Gbps。USB 2.0 被設計成為向下兼容的模式,當有全速(USB 1.1)或者低速(USB 1.0)設備連接到高速(USB 2.0)主機時,主機可以通過分離傳輸來支持它們。一條USB 總線上,可達到的最高傳輸速度等級由該總線上最慢的“設備”決定。
由于USB是主從模式的結構,設備與設備之間、主機與主機之間不能互連,為解決這個問題,擴大USB的應用范圍,出現了USB規范的擴展部分USB OTG(ON The Go)。USB OTG 同一個設備,在不同的場合下可行在主機和從機之間切換。
??以下部分主要根據 USB 2.0 規范的第四章,USB 體系包括 USB host(主機) 、USB device(設備) 以及 物理連接(USB interconnect) 三個部分。其中,設備(USB device) 又分為 USB function 和 USB Hub。
- USB host: 任何USB系統中只有一個主機。 主機系統的USB接口被稱為主機控制器。 主機控制器可以以硬件,固件或軟件的組合來實現。 根集線器集成在主機系統內以提供一個或多個連接點。
- USB device: 可以分為
- USB Hub: USB HUB提供了一種低成本、低復雜度的USB接口擴展方法。HUB的上行PORT面向HOST,下行PORT面向設備(HUB或功能設備)。在下行PORT上,HUB提供了設備連接檢測和設備移除檢測的能力,并給各下行PORT供電。HUB可以單獨使能各下行PORT。不同PORT可以工作在不同的速度等級(高速/全速/低速)。
(1)一個 USB HOST 最多可以同時支持128 個地址,地址0 作為默認地址,只在設備枚舉期間臨時使用,而不能被分配給任何一個設備,因此一個USB HOST 最多可以同時支持127 個地址,如果一個設備只占用一個地址,那么可最多支持127 個USB 設備。在實際的USB 體系中,如果要連接127 個USB設備,必須要使用USB HUB,而USB HUB 也是需要占用地址的,所以實際可支持的USB 功能設備的數量將小于127。
(2)ROOT HUB 是一個特殊的USB HUB,它集成在主機控制器里,不占用地址。ROOT HUB 不但實現了普通USB HUB 的功能,還包括其他一些功能。
(3)“復合設備(Compound Device)”可以占用多個地址。所謂復合設備其實就是把多個功能設備通過內置的USB HUB 組合而成的設備,比如帶錄音話筒的USB 攝像頭等。
- USB function: 能夠通過總線傳輸或接收數據或控制信息的設備,在USB2.0標準中,別成為Class,規范中有詳細的章節進行定義。主要有以下三類:
- A human interface device such as a mouse, keyboard, tablet, or game controller
- An imaging device such as a scanner, printer, or camera
- A mass storage device such as a CD-ROM drive, floppy drive, or DVD drive
- USB interconnect: USB設備連接到主機并與之通信的方式。主要由以下三部分:
- Bus Topology: USB上的設備通過分層的星形拓撲物理連接到主機,如下圖所示。 USB連接點由稱為集線器的特殊類別的USB設備提供。 集線器提供的附加連接點稱為端口。 主機包括稱為根集線器的嵌入式集線器。 主機通過根集線器提供一個或多個連接點。 為主機提供附加功能的USB設備稱為功能。 為了防止循環附件,USB層的星形拓撲結構上采用了分層排序。USB設備和主機之間的連接模型
以HOST-ROOT HUB為起點,最多支持7 層(Tier),也就是說任何一個
USB 系統中最多可以允許5個USB HUB 級聯。一個復合設備(Compound Device)將同時占據兩層或更多的層。
- Inter-layer Relationships: 就功能堆棧而言,是系統中每層執行的USB任務。
- Data Flow Models: 數據在生產者和消費者之間通過USB在系統中移動的方式。
管道(Pipe)是主機和設備端點之間數據傳輸的模型,共有兩種類型的管道:無格式的流管道(Stream Pipe) 和 有格式的信息管道(Message Pipe) 。任何USB 設備一旦上電就存在一個信息管道,即默認的控制管道,USB 主機通過該管道來獲取設備的描述、配置、狀態,并對設備進行配置。
- USB Schedule: USB 提供共享互連。 為了支持同步數據傳輸并消除仲裁開銷,計劃訪問互連。
USB電器特性
??該部分主要針對USB 2.0規范的第六章和第七章。在USB 2.0系統中要求USB傳輸線使用屏蔽雙絞線。USB 支持“總線供電”和“自供電”兩種供電模式。在總線供電模式下,設備最多可以獲得500mA 的電流。一條USB傳輸線分別由地線、電源線、D+ 和 D- 四條線構成,D+ 和 D- 是差分輸入線。它使用的是 3.3V 的電壓(與 CMOS 的 5V 電平不同),而電源線和地線可向設備提供 5V 電壓,最大電流為 500mA (可以在編程中設置)。
在 USB2.0 規范中,定義了以下一些電平信號:
- 差分信號1:D+>2.8V,D-<0.3V;
- 差分信號0:D->2.8V,D+<0.3V。
- J 狀態和 K 狀態
??低速下:D+ 為“0”,D- 為“1”是為“J”狀態,“K”狀態相反;
??全速下:D+ 為“1”,D- 為“0”是為“J”狀態,“K”狀態相反;
??高速同全速。 - SE0 狀態:D+為“0”,D- 為“0”
- IDLE 狀態
??低速下空閑狀態為“K”狀態;
??全速下空閑狀態為“J”狀態;
??高速下空閑狀態為“SE0”狀態。
針對低速 / 全速模式,有以下幾個重要信號:
- Reset 信號: 主機在要和設備通信之前會發送Reset信號來把設備配置到默認的未配置狀態。即 SE0 狀態保持10ms。
- Resume 信號: 20ms 的 K 狀態 + 低速 EOP
(1)主機在掛起設備后可通過翻轉數據線上的極性并保持20ms來喚醒設備,并以低速EOP信號結尾。
(2)帶遠程喚醒功能的設備還可自己發起該喚醒信號;前提是設備已進入idle狀態至少5ms,然后發出喚醒K信號,維持1ms到15ms并由主機在1ms內接管來繼續驅動喚醒信號
- Suspend 信號: 3ms 以上的 J 狀態
- SOP 信號: 從IDLE狀態切換到 K 狀態
- EOP 信號: 持續2位時間的SE0信號,后跟隨1位時間的J狀態
- SYNC 信號: 3個 K、J 狀態切換,后跟隨2位時間的 K 狀態(看到的波形變化是總線上發送0000 0001經過 NRZI 編碼后的波形)
規范中給出的各信號電平如下圖所示:
規范中給出的DC 電氣特性如下圖所示:
USB 通信協議
??以下部分主要根據 USB 2.0 規范的第八章。數據在USB線里傳送是由低位到高位發送的。USB采用 NRZI(非歸零編碼) 對發送的數據包進行編碼。即:輸入數據0,編碼成“電平翻轉”;輸入數據1,編碼成“電平不變”。
??USB采用不歸零取反來傳輸數據,當傳輸線上的差分數據輸入0時就取反,輸入1時就保持原值,為了確保信號發送的準確性,當在USB總線上發送一個包時,傳輸設備就要進行位插入操作(即在數據流中每連續 6 個 1 后就插入一個0) ,從而強迫 NRZI 碼發生變化。接收方解碼 NRZI 碼流,然后識別出填充位,并丟棄它們。這些是由專門硬件處理的。
USB 數據格式
??USB 數據是由二進制數字串構成的,首先 數字串組成域(有七種) , 域再組成包 , 包再組成事務(IN、OUT、SETUP) ,事務最后組成傳輸(中斷傳輸、并行傳輸、批量傳輸和控制傳輸) 。下面介紹一下域、包和事務。
??USB協議規定了四種傳輸(transfer)類型:批量傳輸、同步傳輸、中斷傳輸和控制傳輸。其中,批量傳輸、同步傳輸和中斷傳輸每傳輸一次數據都是一個事務,控制傳輸包括三個過程,建立過程和狀態過程分別是一個事務,數據過程則可能包含多個事務。
首先介紹幾個關鍵字:
- SOF: Start-of-(micro)Frame,是一個特殊的包,開始幀(SOF)數據包由主機以全速總線每1.00毫秒±0.0005毫秒和高速總線125微秒±0.0625微秒的標稱速率發出。 SOF數據包由一個PID指示數據包類型,后面跟著一個11位幀數字段,如下圖所示:
??SOF令牌包括僅用于令牌的事務處理,其以對應于每個幀的開始的精確時間間隔來分配SOF標記和伴隨幀號。 所有高速和全速功能(包括集線器)都會收到SOF數據包。 SOF令牌不會導致任何接收函數生成返回數據包; 因此,SOF交付給任何給定的功能不能得到保證。 - EOF: End-of-(micro)Frame,是一種電平狀態
- SOP: Start-of-Packet,定義為從IDLE狀態切換到K狀態的電平變化
- EOP: End-of-Packet,定義為持續2位時間的 SE0 信號,后跟隨1位時間的J狀態的電平變化
- 端點(Endpoint): 位于USB設備或主機上的一個數據緩沖區,是USB設備中可以進行數據收發的最小單元,支持單向或者雙向的數據傳輸,用來存放和發送USB的各種數據,每一個端點都有惟一的確定地址,有不同的傳輸特性(如輸入端點、輸出端點、配置端點、批量傳輸端點)。設備支持端點的數量是有限制的,除默認端點外低速設備最多支持2組端點(2 個輸入,2 個輸出),高速和全速設備最多支持15組端點。按照USB協議棧的層次劃分:
??一個 Host 可能有一個或者多個 Device
??一個 Device 可能有一個或者多個 Interface
??一個 Interface 可能有一個或者多個 Endpoint - 幀: 時間概念,在USB中,高速USB 總線的幀周期為 125us,全速以及低速 USB 總線的幀周期為 1ms,它是一個獨立的單元,包含了一系列總線動作,USB將1幀分為好幾份,每一份是一個USB的傳輸動作。
??幀的起始由一個特定的包(SOF 包)表示,幀尾為 EOF。EOF不是一個包,而是一種電平狀態,EOF期間不允許有數據傳輸。 具體見上一節的信號電平。
注意:雖然高速USB總線和全速/低速USB總線的幀周期不一樣,但是SOF包中幀編號的增加速度是一樣的,因為在高速USB系統中,SOF包中幀編號實際上取得是計數器的高11位,最低三位作為微幀編號沒有使用,因此其幀編號的增加周期也為 1mS。
域(Field)
??域一個包被分為不同域,域是USB數據最小的單位,由若干位組成(多少位由具體的域決定)。根據不同類型的包,所包含的域是不一樣的。但都要 以同步域SYNC開始 ,緊跟一個包標識符PID ,最終 以包結束符EOP 來結束這個包。
- 同步域(SYNC): 所有的USB包都由SYNC開始,高速包的SYNC寬度為32bit,全速/低速包的SYNC段度為8bit。實際接收到的SYNC長度由于USB HUB的關系,可能會小于該值。八位的值固定為0000 0001,用于本地時鐘與輸入同步。
- 標識域(PID): PID是用來標識一個包的類型的。它共有8位,只使用4(PID0 ~ PID3),另外4位是PID0 ~ PID3的取反,用來校驗PID。PID規定了四類包:令牌包、數據包、握手包和特殊包。同類的包又各分為具體的四種包。
僅在幀首傳輸一次 SOF 包
- 地址域(ADDR): 地址共占11位,其中低7位是設備地址,高4位是端點地址。
- 地址域: 七位地址,代表了設備在主機上的地址,地址 000 0000 被命名為零地址,是任何設備第一次連接到主機時,在被主機配置、枚舉前的默認地址,由此可以知道為什么一個USB主機只能接127個設備的原因。
- 端點域(ENDP): 四位,由此可知一個USB設備端點數量最大為16個。
- 幀號: 占11位,主機每發出一個幀,幀號都會自加1,當幀號達到 0x7FF 時,將歸零重新開始計數。幀號域最大容量0x800,對于同步傳輸有重要意義。
- 數據: 根據傳輸類型的不同,數據域的數據長度從0到1024字節不等。
- CRC: 對令牌包和數據包中非PID域進行校驗的一種方法,CRC校驗在通訊中應用很泛,是一種很好的校驗方法,CRC碼的除法是模2運算,不同于10進制中的除法。
- Token CRCs
??對于令牌(Token)使用5位CRC。涵蓋了IN,SETUP和OUT令牌的ADDR和ENDP字段 或 SOF令牌的時間戳字段。 PING和SPLIT特殊令牌也包括一個五位CRC字段。生成多項式如下:‘G(X)=X5+X2+1`G(X) = X^5 + X^2 + 1‘G(X)=X5+X2+1。
??表示這個多項式的二進制位模式是00101B。 如果所有令牌比特都沒有錯誤地被接收到,則接收器處的五比特殘差將是01100B。 - Data CRCs
??數據CRC是應用在數據包的數據字段上的16位多項式。 生成多項式是:G(X)=X16+X15+X2+1G(X) = X^{16} + X^{15} + X^2 + 1G(X)=X16+X15+X2+1
??表示這個多項式的二進制位模式是1000000000000101B。 如果接收到的所有數據和CRC位都沒有錯誤,則16位殘差將為1000000000001101B。
包(Packet)
??包(Packet)是USB系統中信息傳輸的基本單元,所有數據都是經過打包后在總線上傳輸的。
??包是USB總線上數據傳輸的最小單位,不能被打斷或干擾,否則會引發錯誤。若干個數據包組成一次事務傳輸,一次事務傳輸也不能打斷,屬于一次事務傳輸的幾個包必須連續,不能跨幀完成。一次傳輸由一次到多次事務傳輸構成,可以跨幀完成。
??由域構成的包有四種類型,分別是令牌包、數據包、握手包和特殊包,前面三種是重要的包,不同包的域結構不同,介紹如下:
- 令牌包: 分為輸入包、輸出包、設置包和幀起始包(注意這里的輸入包是用于設置輸入命令的,輸出包是用來設置輸出命令的,而不是放數據的)其中輸入包、輸出包和設置包的格式都是一樣的:
SYNC + PID + (ADDR + ENDP) + CRC5(五位的校驗碼)
幀起始包的格式:
SYNC + PID + 11位FRAM + CRC5(五位的校驗碼)
- 輸出(OUT)令牌包:用來通知設備將要輸出一個數據包
- 輸入(IN)令牌包:用來通知設備返回一個數據包
- 建立(SETUP)令牌包:只用在控制傳輸中,和輸出令牌包作用一樣,也是通知設備將要輸出一個數據包。
- 幀起始包:在每幀(或微幀)開始時發送,以廣播的形式發送,所有USB全速設備和高速設備都可以接收到SOF包。
- 數據包: 分為DATA0包和DATA1包。當USB發送數據的時候,如果一次發送的數據長度大于相應端點的容量時,就需要把數據包分為好幾個包,分批發送,DATA0 包和DATA1 包交替發送,即如果第一個數據包是DATA0,那第二個數據包就是DATA1。但也有例外情況,在同步傳輸中(四類傳輸類型中之一),所有的數據包都是為 DATA0,格式如下:
SYNC + PID + 0~1024字節 + CRC16
低速設備允許的最大數據有效載荷大小為8個字節。 全速設備的最大數據有效載荷大小為1023.高速設備的最大數據有效載荷大小為1024個字節。
- 握手包: 握手包包括 ACK、NAK、STALL以及NYET 四種,其中
- ACK 表示肯定的應答,成功的數據傳輸。對于IN事務,它將由host發出;對于OUT、SETUP和PING事務,它將由device發出。
- NAK 表示否定的應答,失敗的數據傳輸,要求重新傳輸。在數據階段,對于IN事務,它將由device發出;在握手階段,對于OUT和PING事務,它也將由device發出;host從不發送NAK包。
- STALL表示功能錯誤或端點被設置了STALL屬性。
- NYET表示尚未準備好,要求等待。結構最為簡單的包,格式如下:SYNC + PID
事務(Transaction)
?? 在USB上數據信息的一次接收或發送的處理過程稱為事務處理(Transaction),分別有IN、OUT和SETUP三大事務。一個事務由一系統packet組成,具體由哪些packet組成,它取決于具體的事務??赡苡扇缦掳M成:
- 一個token packet
- 可選的data pcket
- 可選的handshake packet
- 可選的special packet
事務的三種類型如下(以下按三個階段來說明一個事務):
IN事務
?? 表示USB主機從總線上的某個USB設備接收一個數據包的過程。
令牌包階段——主機發送一個PID為IN的輸入包給設備,通知設備要往主機發送數據;
數據包階段——設備根據情況會作出三種反應(要注意:數據包階段也不總是傳送數據的,根據傳輸情況還會提前進入握手包階段)。
- 【正?!康妮斎胧聞仗幚?#xff1a;設備往主機里面發出數據包(DATA0與DATA1交替)
- 【設備忙】時的輸入事務處理:無法往主機發出數據包就發送NAK無效包,IN事務提前結束,到了下一個IN事務才繼續;
- 【設備出錯】時的輸入事務處理:發送錯誤包STALL包,事務也就提前結束了,總線進入空閑狀態。
握手包階段——主機正確接收到數據之后就會向設備發送ACK包。
OUT 事務
??輸出事務處理:表示USB主機把一個數據包輸出到總線上的某個USB設備接收的過程。
令牌包階段——主機發送一個PID為OUT的輸出包給設備,通知設備要接收數據;
數據包階段——比較簡單,就是主機會往設備送數據,DATA0與DATA1交替
握手包階段——設備根據情況會作出三種反應
- 【正?!康妮敵鍪聞仗幚?#xff1a;設備給主機返回ACK,通知主機可以發送新的數據,如果數據包發生了CRC校驗錯誤,將不返回任何握手信息;
- 【設備忙時】的輸出事務處理:無法給主機返回ACK,就發送NAK無效包,通知主機再次發送數據
- 【設備出錯】的輸出事務處理:發送錯誤包STALL包,事務提前結束,總線直接進入空閑狀態
SETUT 事務
令牌包階段——主機發送一個PID為SETUP的輸出包給設備,通知設備要接收數據;
數據包階段——比較簡單,就是主機往設備送數據,注意,這里只有一個固定為8個字節的DATA0包,這8個字節的內容就是標準的USB設備請求命令。
握手包階段——設備接收到主機的命令信息后,返回ACK,此后總線進入空閑狀態,并準備下一個傳輸(在SETUP事務后通常是一個IN或OUT事務構成的傳輸)。
- 【正常】的設置事務處理
- 【設備忙時】的設置事務處理
- 【設備出錯】的設置事務處理
傳輸(Transfers)
??以下部分主要根據 USB 2.0 規范的第五章和第八章 。USB系統中的數據傳輸,宏觀看是在HOST和USB功能設備之間進行。微觀看是在應用軟件的Buffer和USB功能設備的端點之間進行。一般來說端點都有Buffer,可以認為USB通訊就是應用軟件Buffer和設備端點Buffer之間的數據交換,交換的通道稱為管道。通常需要多個管道來完成數據交換,因為同一管道只支持一種類型的數據傳輸。用在一起來對設備進行控制的若干管道稱為設備的接口,這就是端點、管道和接口的關系。Host與Device之間的通信視圖如下:
??USB 采用“令牌包”-“數據包”-“握手包”的傳輸機制,在令牌包中指定數據包去向或者來源的設備地址和端點(Endpoint),從而保證了只有一個設備對被廣播的數據包/令牌包作出響應。握手包表示了傳輸的成功與否。
??USB 采用輪詢的廣播機制傳輸數據,所有的傳輸都由主機發起,任何時刻整個 USB 體系內僅允許一個數據包的傳輸,即不同物理傳輸線上看到的數據包都是同一被廣播的數據包。
??各種傳輸類型下,對于包長、速率限制如下:
??傳輸由OUT、IN和SETUP事務構成,傳輸有四種類型,中斷傳輸、批量傳輸、同步傳輸、控制傳輸,其中中斷傳輸和批量傳輸的結構一樣,同步傳輸有最簡單的結構,而控制傳輸是最重要的也是最復雜的傳輸。
控制傳輸(Control Transfers)
??控制傳輸是一種可靠的雙向傳輸,是最重要也是最復雜的。一次控制傳輸分為三(或兩個)個階段:建立(Setup)、數據(DATA)(可能沒有)以及狀態(Status)。每個階段都由一次或多次(數據階段)事務傳輸組成(Transaction)。在USB設備初次接到主機后,主機通過控制傳輸來交換信息、設備地址和讀取設備的描述符,使得主機識別設備,并安裝相應的驅動程序,這是每一個USB開發者都要關心的問題。
??控制傳輸是雙向的傳輸,必須有IN和OUT兩個方向上的特定端點號的控制端點來完成兩個方向上的控制傳輸
-
建立階段: 主機從USB設備獲取配置信息,并設置設備的配置值。建立階段的數據交換包含了SETUP令牌封包、緊隨其后的DATA0數據封包以及ACK握手封包。它的作用是執行一個設置(概念含糊)的數據交換,并定義此控制傳輸的內容(即:在Data Stage中IN或OUT的data包個數,及發送方向,在Setup Stage已經被設定)。
??建立階段,Device 只能返回ACK包,或者不返回任何包。
-
數據階段: 數據過程是可選的。一個數據過程包含一筆或者多筆數據事務。數據過程的第一個數據包必須是DATA1包,然后每次正確傳輸一個數據包就在DATA0和DATA1之間交替。
根據數據階段的數據傳輸的方向,控制傳輸又可分為3種類型: -
控制讀取(讀取USB描述符): 是將數據從設備讀到主機上,讀取的數據USB設備描述符。該過程如上圖的【Control Read】所示。對每一個數據信息包而言,首先,主機會發送一個IN令牌信息包,表示要讀數據進來。然后,設備將數據通過DATA1/DATA0數據信息包回傳給主機。最后,主機將以下列的方式加以響應:當數據已經正確接收時,主機送出ACK令牌信息包;當主機正在忙碌時,發出NAK握手信息包;當發生了錯誤時,主機發出STALL握手信息包。
-
控制寫入(配置USB設備): 是將數據從主機傳到設備上,所傳的數據即為對USB設備的配置信息,該過程如上圖的【Control Wirte】所示。對每一個數據信息包而言,主機將會送出一個OUT令牌信息包,表示數據要送出去。緊接著,主機將數據通過DATA1/DATA0數據信息包傳遞至設備。最后,設備將以下列方式加以響應:當數據已經正確接收時,設備送出ACK令牌信息包;當設備正在忙碌時,設備發出NAK握手信息包;當發生了錯誤時,設備發出STALL握手信息包。
-
無數據控制: 如上圖
-
狀態階段: 用來表示整個傳輸的過程已完全結束。通過一次IN/OUT傳輸表明請求是否成功完成。
??狀態階段傳輸的方向必須與數據階段的方向相反,即原來是IN令牌封包,這個階段應為OUT令牌封包;反之,原來是OUT令牌封包,這個階段應為IN令牌封包。
??對于【控制讀取】而言,主機會送出OUT令牌封包,其后再跟著0長度的DATA1封包。而此時,設備也會做出相對應的動作,送ACK握手封包、NAK握手封包或STALL握手封包。
??相對地對于【控制寫入】傳輸,主機會送出IN令牌封包,然后設備送出表示完成狀態階段的0長度的DATA1封包,主機再做出相對應的動作:送ACK握手封包、NAK握手封包或STALL握手封包。
??控制傳輸通過控制管道在應用軟件和Device的控制端點之間進行,控制傳輸過程中傳輸的數據是有格式定義的,USB 設備或主機可根據格式定義解析獲得的數據含義。其他三種傳輸類型都沒有格式定義。控制傳輸對于最大包長度有固定的要求。對于高速設備該值為64Byte,對于低速設備該值為8,全速設備可以是8或16或32或64。
??最大包長度表征了一個端點單次接收/發送數據的能力,實際上反應的是該端點對應Buffer的大小。Buffer越大,單次可接收/發送的數據包越大,反之亦反。當通過一個端點進行數據傳輸時,若數據的大小超過該端點的最大包長度時,需要將數據分成若干個數據包傳輸。并保證除最后一個包外,所有的包長度均等于該最大包長度。這也就是說如果一個端點收到/發送了一個長度小于最大包長度的包,即意味著數據傳輸結束。
??控制傳輸在訪問總線時也受到一些限制,如高速端點的控制傳輸不能占用超過 20%的微幀,全速和低速的則不能超過 10%。在一幀內如果有多余的未用時間,并且沒有同步和中斷傳輸,可以用來進行控制傳輸。
??與批量傳輸相比,在流程上并沒有多大區別,區別只在于該事務傳輸發生的端點不一樣、支持的最大包長度不一樣、優先級不一樣等這樣一些對用戶來說透明的東西。
中斷傳輸(Interrupt Transfers)
??中斷傳輸是一種輪詢的傳輸方式,是一種單向的傳輸。HOST通過固定的間隔對中斷端點進行查詢,若有數據傳輸或可以接收數據則返回數據或發送數據。否則返回NAK,表示尚未準備好。中斷傳輸的延遲有保證,但并非實時傳輸,它是一種延遲有限的可靠傳輸,支持錯誤重傳。對于高速/全速/低速端點,最大包長度分別可以達到1024/64/8 Bytes。 高速中斷傳輸不得占用超過 80%的微幀時間,全速和低速不得超過90%。 中斷端點的輪詢間隔由在端點描述符中定義,全速端點的輪詢間隔可以是1 ~ 255mS。低速端點為10 ~ 255mS,高速端點為(2interval-1)*125uS,其中 interval 取 1到 16 之間的值。
??除高速高帶寬中斷端點外,一個微幀內僅允許一次中斷事務傳輸。高速高帶寬端點最多可以在一個微幀內進行三次中斷事務傳輸,傳輸高達 3072 字節的數據。
??所謂單向傳輸,并不是說該傳輸只支持一個方向的傳輸。而是指在某個端點上該傳輸僅支持一個方向,或輸出、或輸入。如果需要在兩個方向上進行某種單向傳輸,需要占用兩個端點,分別配置成不同的方向??梢該碛邢嗤亩它c編號。
??中斷傳輸由OUT事務和IN事務構成,用于鍵盤、鼠標等HID設備的數據傳輸。
??中斷傳輸在流程上除不支持PING之外,其他的跟批量傳輸是一樣的。他們之間的區別也僅在于事務傳輸發生的端點不一樣、支持的最大包長度不一樣、優先級不一樣等這樣一些對用戶來說透明的東西。
??主機在排定中斷傳輸任務時,會根據對應中斷端點描述符中指定的查詢間隔發起中斷傳輸。中斷傳輸有較高的優先級,僅次于同步傳輸。同樣中斷傳輸也采用 PID 翻轉的機制來保證收發端數據同步。
??中斷傳輸方式總是用于對設備的查詢,以確定是否有數據需要傳輸。因此中斷傳輸的方向總是從USB設備到主機。
??下圖為中斷傳輸的流程圖。
DATA0或DATA1中的包含的是中斷信息,而不是中斷數據
批量傳輸(Bulk Transfers)
??批量傳輸由OUT事務和IN事務構成,是一種可靠的單向傳輸,但延遲沒有保證,它盡量利用可以利用的帶寬來完成傳輸,適合數據量比較大的傳輸。低速USB設備不支持批量傳輸,高速批量端點的最大包長度為512,全速批量端點的最大包長度可以為8、16、32、64。
??用于傳輸大量數據,要求傳輸不能出錯,但對時間沒有要求,適用于打印機、存儲設備等
??批量傳輸在訪問USB總線時,相對其他傳輸類型具有最低的優先級,USB HOST總是優先安排其他類型的傳輸,當總線帶寬有富余時才安排批量傳輸。高速的批量端點必須支持PING操作,向主機報告端點的狀態。NYET表示否定應答,沒有準備好接收下一個數據包,ACK 表示肯定應答,已經準備好接收下一個數據包。
??它通過在硬件級執行“錯誤檢測”和“重傳”來確保host與device之間“準確無誤”地傳輸數據,即可靠傳輸。它由三種包組成(即IN事務或OUT事務):
- token
- data
- handshake
??上圖(USB2.0規范的8.5.2章節)中一個方框表示一個 Packet,灰色的包表示主機發出的包,白色的包表示Device發出的包。***批量傳輸是可靠的傳輸,需要握手包來表明傳輸的結果。***若數據量比較大,將采用多次批量事務傳輸來完成全部數據的傳輸,傳輸過程中數據包的PID按照 DATA0-DATA1-DATA0-…的方式翻轉,以保證發送端和接收端的同步。若成功則將錯誤次數計數器清0,否則累加該計數器。
- For IN Token (即:IN Transaction)
- ACK: 表示host正確無誤地接收到數據
- NAK: 指示設備暫時不能返回或接收數據 (如:設備忙)
- STALL:指示設備永遠停止,需要host軟件的干預 (如:設備出錯)
- For OUT Token (即:OUT Transaction)
如果接收到的數據包有誤,如:CRC錯誤,Device不發送任何handshake包 - ACK: Device已經正確無誤地接收到數據包,且通知Host可以按順序發送下一個數據包
- NAK: Device 已經正確無誤地接收到數據包,且通知Host重傳數據,由于Device臨時狀況(如buffer滿)
- STALL: 指示Device endpoint已經停止,且通知Host不再重傳
??USB 允許連續 3次以下的傳輸錯誤,錯誤時會重試該傳輸,若成功則將錯誤次數計數器清零,否則累加該計數器。超過三次后,HOST 認為該端點功能錯誤(STALL),放棄該端點的傳輸任務。
??一次批量傳輸(Transfer)由 1 次到多次批量事務傳輸(Transaction)組成。
??上圖(USB2.0規范的8.5.2章節)為批量讀寫時數據位和PID的變化情況。主機總是使用配置事件將總線傳輸的第一個事務初始化為 DATA0 PID。 第二個事務使用 DATA1 PID,并且在批量傳輸的其余部分中交替使用 DATA0 和 DATA1 傳輸數據。翻轉同步:發送端按照 DATA0-DATA1-DATA0-…的順序發送數據包,只有成功的事務傳輸才會導致PID翻轉,也就是說發送段只有在接收到ACK后才會翻轉PID,發送下一個數據包,否則會重試本次事務傳輸。同樣,若在接收端發現接收到的數據包不是按照此順序翻轉的,比如連續收到兩個DATA0,那么接收端認為第二個DATA0是前一個DATA0的重傳。
同步傳輸(Isochronous Transfers)
??同步傳輸是一種實時的、不可靠的傳輸,不支持錯誤重發機制。只有高速和全速端點支持同步傳輸,高速同步端點的最大包長度為1024,低速的為1023。由OUT事務和IN事務構成。有兩個特殊地方,第一,在同步傳輸的IN和OUT事務中是沒有返回包階段的;第二,在數據包階段所有的數據包都為DATA0。
它由兩種包組成:
- token
- data
??同步傳輸不支持“handshake”和“重傳能力”,所以它是不可靠傳輸。
??同步傳輸適用于必須以固定速率抵達或在指定時刻抵達,可以容忍偶爾錯誤的數據上。實時傳輸一般用于麥克風、喇叭、UVC Camera等設備。實時傳輸只需令牌與數據兩個信息包階段,沒有握手包,故數據傳錯時不會重傳。
??除高速高帶寬同步端點外,一個微幀內僅允許一次同步事務傳輸,高速高帶寬端點最多可以在一個微幀內進行三次同步事務傳輸,傳輸高達 3072 字節的數據。全速同步傳輸不得占用超過 80%的幀時間,高速同步傳輸不得占用超過90%的微幀時間。同步端點的訪問也和中斷端點一樣,有固定的時間間隔限制。
??同步傳輸是不可靠的傳輸,所以它沒有握手包,也不支持PID翻轉。主機在排定事務傳輸時,同步傳輸有最高的優先級。
分離傳輸(Split Transaction)
??分離傳輸是在主機控制器和USB HUB之間的傳輸,它僅在主機控制器和HUB之間執行,通過分離傳輸,可以允許全速/低速設備連接到高速主機。分離傳輸對于USB設備來說是透明的、不可見的。
??分離傳輸,顧名思義就是把一次完整的事務傳輸分成兩個事務傳輸來完成。其出發點是高速傳輸和全速/低速傳輸的速度不相等,如果使用一次完整的事務來傳輸,勢必會造成比較長的等待時間,從而降低了高速USB總線的利用率。通過將一次傳輸分成兩次,將令牌(和數據)的傳輸與響應數據(和握手)的傳輸分開,這樣就可以在中間插入其他高速傳輸,從而提高總線的利用率。
參考
- Universal Serial Bus Specification Revision 2.0
- 國嵌相關資料
附件
總結
以上是生活随笔為你收集整理的USB 之一 USB2.0 规范详解 第一部分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++之预处理命令
- 下一篇: Network 之二 Ethernet(