1. 程式人生 > >USB 之 USB2.0 規範詳解 第一部分

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相關規範。USB2.0 的下載頁面為http://www.usb.org/developers/docs/usb20_docs/。
USB
  其中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裝置和主機之間的連線模型

Bus Topology
以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 (可以在程式設計中設定)。
USB Cable
在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內接管來繼續驅動喚醒訊號
Resume

  • Suspend訊號:3ms以上的 J 狀態
  • SOP 訊號:從IDLE狀態切換到 K 狀態
  • EOP 訊號:持續2位時間的SE0訊號,後跟隨1位時間的J狀態

SOP_EOP

  • SYNC 訊號:3個 K、J 狀態切換,後跟隨2位時間的 K 狀態(看到的波形變化是總線上傳送0000 0001經過 NRZI 編碼後的波形)
    SYNC

規範中給出的各訊號電平如下圖所示:
訊號電平
規範中給出的DC 電氣特性如下圖所示:
DC 電氣特性

USB 通訊協議

  以下部分主要根據 USB 2.0 規範的第八章。資料在USB線裡傳送是由低位到高位傳送的。USB採用***NRZI(非歸零編碼)***對傳送的資料包進行編碼。即:輸入資料0,編碼成“電平翻轉”;輸入資料1,編碼成“電平不變”。
  USB採用不歸零取反來傳輸資料,當傳輸線上的差分資料輸入0時就取反,輸入1時就保持原值,為了確保訊號傳送的準確性,當在USB總線上傳送一個包時,***傳輸裝置就要進行位插入操作(即在資料流中每連續6個1後就插入一個0)***,從而強迫NRZI碼發生變化。接收方解碼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令牌不會導致任何接收函式生成返回資料包; 因此,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期間不允許有資料傳輸。 具體見上一節的訊號電平。
    Frame

注意:雖然高速USB匯流排和全速/低速USB匯流排的幀週期不一樣,但是SOF包中幀編號的增加速度是一樣的,因為在高速USB系統中,SOF包中幀編號實際上取得是計數器的高11位,最低三位作為微幀編號沒有使用,因此其幀編號的增加週期也為 1mS。

域(Field)

  域一個包被分為不同域,域是USB資料最小的單位,由若干位組成(多少位由具體的域決定)。根據不同型別的包,所包含的域是不一樣的。但都要***以同步域SYNC開始***,緊跟一個包識別符號PID,最終***以包結束符EOP*** 來結束這個包。
Packet

  • 同步域(SYNC): 所有的USB包都由SYNC開始,高速包的SYNC寬度為32bit,全速/低速包的SYNC段度為8bit。實際接收到的SYNC長度由於USB HUB的關係,可能會小於該值。八位的值固定為0000 0001,用於本地時鐘與輸入同步。
  • 標識域(PID): PID是用來標識一個包的型別的。它共有8位,只使用4(PID0 ~ PID3),另外4位是PID0 ~ PID3的取反,用來校驗PID。PID規定了四類包:令牌包資料包握手包特殊包。同類的包又各分為具體的四種包。
    PID

僅在幀首傳輸一次SOF包

  • 地址域(ADDR): 地址共佔11位,其中低7位是裝置地址,高4位是端點地址。
    ADDR
    • 地址域: 七位地址,代表了裝置在主機上的地址,地址000 0000被命名為零地址,是任何裝置第一次連線到主機時,在被主機配置、列舉前的預設地址,由此可以知道為什麼一個USB主機只能接127個裝置的原因。
    • 端點域(ENDP): 四位,由此可知一個USB裝置端點數量最大為16個。
  • 幀號: 佔11位,主機每發出一個幀,幀號都會自加1,當幀號達到0x7FF時,將歸零重新開始計數。幀號域最大容量0x800,對於同步傳輸有重要意義。
  • 資料: 根據傳輸型別的不同,資料域的資料長度從0到1024位元組不等。
    DATA
  • 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
      表示這個多項式的二進位制位模式是00101B。 如果所有令牌位元都沒有錯誤地被接收到,則接收器處的五位元殘差將是01100B。
  • Data CRCs
      資料CRC是應用在資料包的資料欄位上的16位多項式。 生成多項式是:G(X)=X16+X15+X2+1G(X) = X^{16} + X^{15} + X^2 + 1
      表示這個多項式的二進位制位模式是1000000000000101B。 如果接收到的所有資料和CRC位都沒有錯誤,則16位殘差將為1000000000001101B。

包(Packet)

  包(Packet)是USB系統中資訊傳輸的基本單元,所有資料都是經過打包後在總線上傳輸的。
  包是USB總線上資料傳輸的最小單位,不能被打斷或干擾,否則會引發錯誤。若干個資料包組成一次事務傳輸,一次事務傳輸也不能打斷,屬於一次事務傳輸的幾個包必須連續,不能跨幀完成。一次傳輸由一次到多次事務傳輸構成,可以跨幀完成。
  由域構成的包有四種類型,分別是令牌包、資料包、握手包和特殊包,前面三種是重要的包,不同包的域結構不同,介紹如下:

  • 令牌包: 分為輸入包、輸出包、設定包和幀起始包(注意這裡的輸入包是用於設定輸入命令的,輸出包是用來設定輸出命令的,而不是放資料的)其中輸入包、輸出包和設定包的格式都是一樣的:
    SYNC + PID + (ADDR + ENDP) + CRC5(五位的校驗碼)
    Token
    幀起始包的格式:
    SYNC + PID + 11位FRAM + CRC5(五位的校驗碼)
    SOF Packet
    • 輸出(OUT)令牌包:用來通知裝置將要輸出一個數據包
    • 輸入(IN)令牌包:用來通知裝置返回一個數據包
    • 建立(SETUP)令牌包:只用在控制傳輸中,和輸出令牌包作用一樣,也是通知裝置將要輸出一個數據包。
    • 幀起始包:在每幀(或微幀)開始時傳送,以廣播的形式傳送,所有USB全速裝置和高速裝置都可以接收到SOF包。
  • 資料包: 分為DATA0包和DATA1包。當USB傳送資料的時候,如果一次傳送的資料長度大於相應端點的容量時,就需要把資料包分為好幾個包,分批發送,DATA0 包和DATA1 包交替傳送,即如果第一個資料包是DATA0,那第二個資料包就是DATA1。但也有例外情況,在同步傳輸中(四類傳輸型別中之一),所有的資料包都是為 DATA0,格式如下:
    SYNC + PID + 0~1024位元組 + CRC16
    Data Packet

低速裝置允許的最大資料有效載荷大小為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
    Handshake Packet

事務(Transaction)

   在USB上資料資訊的一次接收或傳送的處理過程稱為事務處理(Transaction),分別有IN、OUT和SETUP三大事務。一個事務由一系統packet組成,具體由哪些packet組成,它取決於具體的事務。可能由如下包組成:

  • 一個token packet
  • 可選的data pcket
  • 可選的handshake packet
  • 可選的special packet

事務的三種類型如下(以下按三個階段來說明一個事務):

IN事務

   表示USB主機從總線上的某個USB裝置接收一個數據包的過程。
令牌包階段——主機發送一個PID為IN的輸入包給裝置,通知裝置要往主機發送資料;
資料包階段——裝置根據情況會作出三種反應(要注意:資料包階段也不總是傳送資料的,根據傳輸情況還會提前進入握手包階段)。

  • 【正常】的輸入事務處理:裝置往主機裡面發出資料包(DATA0與DATA1交替)
    IN Normal
  • 【裝置忙】時的輸入事務處理:無法往主機發出資料包就傳送NAK無效包,IN事務提前結束,到了下一個IN事務才繼續;
    IN Busy
  • 【裝置出錯】時的輸入事務處理:傳送錯誤包STALL包,事務也就提前結束了,匯流排進入空閒狀態。
    IN Error
    握手包階段——主機正確接收到資料之後就會向裝置傳送ACK包。

OUT 事務

  輸出事務處理:表示USB主機把一個數據包輸出到總線上的某個USB裝置接收的過程。
令牌包階段——主機發送一個PID為OUT的輸出包給裝置,通知裝置要接收資料;
資料包階段——比較簡單,就是主機會往裝置送資料,DATA0與DATA1交替
握手包階段——裝置根據情況會作出三種反應

  • 【正常】的輸出事務處理:裝置給主機返回ACK,通知主機可以傳送新的資料,如果資料包發生了CRC校驗錯誤,將不返回任何握手資訊;
    OUT Normal
  • 【裝置忙時】的輸出事務處理:無法給主機返回ACK,就傳送NAK無效包,通知主機再次傳送資料
    OUT Busy
  • 【裝置出錯】的輸出事務處理:傳送錯誤包STALL包,事務提前結束,匯流排直接進入空閒狀態
    OUT Error

SETUT 事務

令牌包階段——主機發送一個PID為SETUP的輸出包給裝置,通知裝置要接收資料;
資料包階段——比較簡單,就是主機往裝置送資料,注意,這裡只有一個固定為8個位元組的DATA0包,這8個位元組的內容就是標準的USB裝置請求命令。
握手包階段——裝置接收到主機的命令資訊後,返回ACK,此後匯流排進入空閒狀態,並準備下一個傳輸(在SETUP事務後通常是一個IN或OUT事務構成的傳輸)。

  • 【正常】的設定事務處理
    SETUP Normal
  • 【裝置忙時】的設定事務處理
    SETUP Busy
  • 【裝置出錯】的設定事務處理
    SETUP Error

傳輸(Transfers)

  以下部分主要根據 USB 2.0 規範的第五章和第八章 。USB系統中的資料傳輸,巨集觀看是在HOST和USB功能裝置之間進行。微觀看是在應用軟體的Buffer和USB功能裝置的端點之間進行。一般來說端點都有Buffer,可以認為USB通訊就是應用軟體Buffer和裝置端點Buffer之間的資料交換,交換的通道稱為管道。通常需要多個管道來完成資料交換,因為同一管道只支援一種型別的資料傳輸。用在一起來對裝置進行控制的若干管道稱為裝置的介面,這就是端點、管道和介面的關係。Host與Device之間的通訊檢視如下:
傳輸
  USB 採用“令牌包”-“資料包”-“握手包”的傳輸機制,在令牌包中指定資料包去向或者來源的裝置地址和端點(Endpoint),從而保證了只有一個裝置對被廣播的資料包/令牌包作出響應。握手包表示了傳輸的成功與否。
  USB 採用輪詢的廣播機制傳輸資料,所有的傳輸都由主機發起,任何時刻整個 USB 體系內僅允許一個數據包的傳輸,即不同物理傳輸線上看到的資料包都是同一被廣播的資料包。
  各種傳輸型別下,對於包長、速率限制如下:
SPEED
  傳輸由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包,或者不返回任何包。
    SETUP

  • 資料階段: 資料過程是可選的。一個數據過程包含一筆或者多筆資料事務。資料過程的第一個資料包必須是DATA1包,然後每次正確傳輸一個數據包就在DATA0和DATA1之間交替。
    Ctrl RW
    根據資料階段的資料傳輸的方向,控制傳輸又可分為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 位元組的資料。
  所謂單向傳輸,並不是說該傳輸只支援一個方向的傳輸。而是指在某個端點上該傳輸僅支援一個方向,或輸出、或輸入。如果需要在兩個方向上進行某種單向傳輸,需要佔用兩個端點,分別配置成不同的方向。可以擁有相同的端點編號。
  中斷傳輸由OUT事務和IN事務構成,用於鍵盤、滑鼠等HID裝置的資料傳輸。
  中斷傳輸在流程上除不支援PING之外,其他的跟批量傳輸是一樣的。他們之間的區別也僅在於事務傳輸發生的端點不一樣、支援的最大包長度不一樣、優先順序不一樣等這樣一些對使用者來說透明的東西。
  主機在排定中斷傳輸任務時,會根據對應中斷端點描述符中指定的查詢間隔發起中斷傳輸。中斷傳輸有較高的優先順序,僅次於同步傳輸。同樣中斷傳輸也採用 PID 翻轉的機制來保證收發端資料同步。
  中斷傳輸方式總是用於對裝置的查詢,以確定是否有資料需要傳輸。因此中斷傳輸的方向總是從USB裝置到主機。
  下圖為中斷傳輸的流程圖。
INT Trans

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

Bulk
  上圖(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)組成。

Bulk RW
  上圖(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

Isochronous Transfers
  同步傳輸不支援“handshake”和“重傳能力”,所以它是不可靠傳輸。
  同步傳輸適用於必須以固定速率抵達或在指定時刻抵達,可以容忍偶爾錯誤的資料上。實時傳輸一般用於麥克風、喇叭、UVC Camera等裝置。實時傳輸只需令牌與資料兩個資訊包階段,沒有握手包,故資料傳錯時不會重傳。
  除高速高頻寬同步端點外,一個微幀內僅允許一次同步事務傳輸,高速高頻寬端點最多可以在一個微幀內進行三次同步事務傳輸,傳輸高達 3072 位元組的資料。全速同步傳輸不得佔用超過 80%的幀時間,高速同步傳輸不得佔用超過90%的微幀時間。同步端點的訪問也和中斷端點一樣,有固定的時間間隔限制。
  同步傳輸是不可靠的傳輸,所以它沒有握手包,也不支援PID翻轉。主機在排定事務傳輸時,同步傳輸有最高的優先順序。

分離傳輸(Split Transaction)

  分離傳輸是在主機控制器和USB HUB之間的傳輸,它僅在主機控制器和HUB之間執行,通過分離傳輸,可以允許全速/低速裝置連線到高速主機。分離傳輸對於USB裝置來說是透明的、不可見的。
  分離傳輸,顧名思義就是把一次完整的事務傳輸分成兩個事務傳輸來完成。其出發點是高速傳輸和全速/低速傳輸的速度不相等,如果使用一次完整的事務來傳輸,勢必會造成比較長的等待時間,從而降低了高速USB匯流排的利用率。通過將一次傳輸分成兩次,將令牌(和資料)的傳輸與響應資料(和握手)的傳輸分開,這樣就可以在中間插入其他高速傳輸,從而提高匯流排的利用率。

參考

  • Universal Serial Bus Specification Revision 2.0
  • 國嵌相關資料

附件