【STM32F407】第4章 ThreadX USBX協議棧基礎知識
教程更新中:http://www.armbbs.cn/forum.php?mod=viewthread&tid=108546
第4章 ThreadX USBX協議棧基礎知識
本章節為大家講解USB基礎知識點,學習USB前,非常有必要有個系統的認識。
4.1初學者重要提示
4.2 USB歷史
4.3 USB架構
4.4 USB硬體
4.5 USB電流
4.6 USB傳輸速度
4.7 USB通訊(重要)
4.8 USB描述符
4.9 USB類
4.10 總結
4.1 初學者重要提示
1、 USB1.1和USB2.0規格書以及Cypress做的中文版USB文件,非常推薦大家學習:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=100698
2、 USB初學 -- 入門篇 (USB基礎知識速覽)
http://www.armbbs.cn/forum.php?mod=viewthread&tid=100687 。
3、 文獻參考:
https://en.wikipedia.org/wiki/USB
https://zh.wikipedia.org/wiki/USB
https://en.wikipedia.org/wiki/USB_hardware
4.2 USB歷史
1994年,由七個公司組成的小組開始開發USB:Compaq,DEC,IBM,Intel,Microsoft,NEC和Nortel。目標是通過替換PC背面的眾多聯結器,解決現有介面的可用性問題以及簡化所有連線到USB裝置的軟體配置,從根本上簡化外部裝置連線至PC,並且可以為外部裝置提供更高的資料速率。 阿杰·巴特(Ajay Bhatt)和他的團隊在英特爾制定該標準。第一批積體電路支援USB的產品由英特爾於1995年生產。
最初的USB 1.0規範於1996年1月推出,它定義了1.5 Mbit / s 低速和12 Mbit / s全速的資料傳輸速率 。12 Mbit / s適用於印表機和軟盤驅動器等高速裝置,1.5 Mbit / s適用於鍵盤,滑鼠和操縱桿等低資料速率裝置。Microsoft Windows 95,OSR 2.1在1997年8月為裝置提供了OEM支援。USB的第一個廣泛使用的版本是1998年9月釋出的1.1。蘋果的iMac是第一個帶有USB的主流產品,而iMac的成功推廣了USB本身。在蘋果公司決定從iMac上刪除所有相容埠之後,許多PC製造商開始構建相容版PC,這導致使用USB成為PC市場標準。
USB 2.0規範於2000年4月釋出,並在2001年底被USB-IF批准。惠普,英特爾,朗訊科技(現為諾基亞),NEC和飛利浦共同領導了該計劃。開發更高的資料傳輸速率,從而使規範達到480 Mbit / s,是原始USB 1.1規範的40倍。
USB 3.0規範釋出於2008年11月12日,其主要目標是提高資料傳輸速率(高達5 Gbit / s),減少電力消耗,提高輸出功率,並且向後相容USB 2.0。USB 3.0包括與USB 2.0匯流排類似的新型高速匯流排SuperSpeed。因此,新版本也稱為SuperSpeed。首批配備USB 3.0的裝置於2010年1月推出。截止到2008年,全球市場上大約有60億個USB埠和介面,每年大約銷售20億個。
USB 3.1規範於2013年7月釋出。2014年12月,USB-IF向IEC(TC100–音訊,視訊和多媒體系統和裝置)提交了USB 3.1,USB Power Delivery 2.0和USB-C規範,以納入國際標準IEC 62680(通用序列匯流排介面,用於資料和電源),目前基於USB 2.0。
USB 3.2規範於2017年9月釋出。
USB4規範於2019年8月29日由USB-IF釋出。
4.3 USB架構
系統中只能有一個主機,並且與裝置進行的通訊是從主機的角度進行的。主機是“上行” 元件,裝置則是“下行” 元件,資料從主機轉移到外設的操作是 OUT 傳輸。資料從外設轉移到主機的操作是 IN 傳輸。主機(尤其是主控制器)控制著所有通訊並向裝置發出指令。共有三種常見的 USB 主控制器:
- 通用主控制器介面(UHCI): 由 Intel 生產,適用於 USB 1.0 和 USB 1.1。使用 UHCI 時需要得到 Intel 的許可。該控制器支援低速模式和全速模式。
- 開放主控制器介面(OHCI): 由 Compaq、 Microsoft 和 National Semiconductor 生產, 適用於 USB 1.0 和 1.1。該控制器支援低速模式和全速模式, 並且它的效率比 UHCI 更高, 因為可以執行更多硬體功能。
- 擴充套件型主控制器介面(EHCI): 在 USB-IF 要求釋出單一主控制器規範後,已經生產了該控制器,它適用於 USB2.0。 EHCI 僅支援高速傳輸,並且將低速和全速傳輸委託給 OHCI 或 UHCI 控制器執行。
可以將一個或多個裝置連線至一個主機。每個裝置均有一個地址,並且會對定址它的主機指令做出響應。裝置預計具有某種形式的功能,並不簡單作為一個被動元件。裝置具有一個上行埠。埠是裝置上的 USB 物理連線點。集線器是一個專用裝置,允許主機同總線上的多個外設進行通訊。與 USB 外設(例如滑鼠)具有實際功能不同,集線器裝置是透明的,並且作為直通連線使用。集線器也作為主機和裝置間的通道。集線器具有多個連線點,從而可以將多個裝置連線到一個主機上。一個集線器可以將與下行裝置進行的通訊,重複使用到一個上行埠和最多七個下行埠。但集線器並沒有主機功能。
通過使用集線器最多能夠將 127 個裝置連線至主控制器上。連線裝置的數目限制由 USB 協議決定,它限制裝置地址為 7 位。另外,由於集線器的時間限制和電纜傳播的延遲,因此最多隻能將五個集線器連結在一起。下圖顯示的是 USB 層次系統的框圖,它表示集線器和裝置的連結限制。大家可以看到,隨著集線器的連結限制,層次系統也限制為七層。
USB裝置分為以下幾個類別:
- Hubs
Hubs集線器(USB擴充套件裝置)提供了附加的連線點,並從使用者角度簡化了USB連線。每個集線器將單個連線點轉換為多個連線點,稱為埠。
- Functions
Functions為系統提供了傳送或接收資料和控制資訊的功能。每個功能都包含描述裝置功能和資源要求的配置資訊。
- Composite Devices
複合裝置是實現多種功能幷包括嵌入式集線器的物理程式包。複合裝置在主機上看起來像是帶有一個或多個不可移動USB裝置的集線器。複合裝置支援不止一種類別,因此為主機提供了不止一種功能。
對於以主機為中心的開發,USB連線看起來像是星形網路。集線器不會引起任何程式設計複雜性,並且對程式設計師而言是透明的。無論是直接連線到根集線器還是通過中間集線器連線,USB裝置的工作方式都相同。在該主/從網路中,所有USB裝置都可用作可定址節點。只有主機可以在網路中啟動資料傳輸。
注意:
- 任何USB系統中僅存在一個主機。
- 在第7層中,只能啟用功能。
- 符合裝置佔據兩層。
4.4 USB硬體
市場是上USB連機器種類非常多,常用的如下:
Type A,Type B是四個引腳,對於的引腳定義如下:
Mini 和 Micro 聯結器具有五個(而不是 4 個)引腳。額外引腳是 ID 引腳,用於識別 OTG 應用中的主機和裝置,此引腳接地表示主機,未連線表示裝置。
更多的USB介面如下:
4.5 USB電流
USB2.0和USB3.0支援的電壓範圍和最大電流如下:
注:BC1.2是Battery Charging (BC) 1.2,PD是Power Delivery。
4.6 USB傳輸速度
不同USB版本的速度如下:
4.7 USB通訊(重要)
USB是輪詢匯流排,USB主機發起所有資料交換。資料往返於USB裝置中的端點。USB主機中的客戶端將資料儲存在緩衝區中,但沒有端點。USB主機和外圍USB裝置具有不同的層,如下圖所示。層之間的連線是每個層之間的裝置介面。在連線之間,使用Pipes傳輸資料。
USB資料是由二進位制數字串構成的,首先數字串構成域,域再構成包Packet(令牌包、資料包、握手包),包再構成事務Transaction(IN、OUT、SETUP),事務再構成傳輸Transfer(中斷傳輸、同步傳輸、批量傳輸和控制傳輸),傳輸最後再構成管道Pipe。下圖可以形象的展示它們之間的關係:
4.7.1 管道(Pipes)
管道是主機與裝置端點資料傳輸的連線通道,代表了主機的資料緩衝區與裝置端點之間交換資料的能力。管道包括資料流管道和訊息管道。
- Message Pipes:訊息管道具有定義的USB格式,並且受主機控制。訊息管道允許資料雙向流動,並且僅支援控制傳輸。
- Stream Pipes:流管道沒有定義的USB格式,可以由主機或裝置控制。資料流具有預定義的方向,即IN或OUT。流管道支援中斷傳輸,同步傳輸和批量傳輸。
將USB裝置連線到USB匯流排並由USB主機配置後,大多數管道就存在了。管道源自主機客戶端中的資料緩衝區,並在USB裝置端點的內部終止。
4.7.2 傳輸(Transfers)
傳輸(資料流型別管道)可以包含一個或多個事務,管道支援以下傳輸型別之一:
- 控制傳輸通常用於設定USB裝置。它們始終使用IN / OUT端點0。
- 中斷傳輸可用於定期傳送資料的地方,例如用於狀態更新。
- 同步傳輸傳輸實時資料,例如音訊和視訊。它們具有固定頻寬,但沒有錯誤檢測。
- 批量傳輸可用於時間不重要的資料傳送,例如印表機。
4.7.3 控制傳輸(Control Transfers)
控制傳輸是雙向傳輸,供主機使用,以便主機使用IN和OUT端點0向裝置傳送和從裝置請求配置資訊。每個控制轉移包括兩個及其事務。控制端點資料的最大資料包大小:
- 低速USB是8個位元組。
- 全速USB是8,16,32或者64位元組。
- 高速USB是64位元組。
通常,應用程式軟體不使用這種型別的傳輸。控制傳輸的三個階段:
1、SETUP階段攜帶8個位元組被稱為設定包,定義請求,以及指定多少資料應在資料階段被轉移。
2、該資料階段是可選的。如果存在,它將始終從包含DATA1資料包的事務開始。然後,事務型別在DATA0和DATA1之間交替,直到所有必需的資料都已傳輸。
3、STATUS階段是含有零長度分組DATA1事務。如果DATA階段為IN,則STATUS階段為OUT,反之亦然。
4.7.4 中斷傳輸(Interrrupt Transfers)
中斷傳輸與裝置之間的延遲有限。在USB中,中斷傳輸或中斷管道具有以下定義的輪詢速率:
- 全速和低速分別為1ms和255ms。
- 高速端點為125μs至4096ms。
中斷端點資料的最大包大小為:
- 全速USB最大64位元組。
- 高速USB最大1024位元組。
開發人員可以定義主機多久請求裝置進行資料傳輸。例如,對於滑鼠,可以保證每10 ms的資料傳輸速率。但是,定義輪詢速率並不能保證每10毫秒傳輸一次資料,而是保證交易將發生在第十幀內的某個位置。因此,USB事務有一定的抖動。
通常,中斷傳輸資料由事件通知,字元和來自裝置的座標組成。
4.7.5 同步傳輸(Isochronous Transfers)
同步傳輸用於傳輸實時資訊,例如音訊和視訊資料,並且必須以恆定的速率傳送。為USB等時資料流分配了USB頻寬的專用部分,確保按所需的速率傳送資料。同步管道在每個幀中傳送一個新的資料包,而不管最後一個包的成功或失敗。
等時端點資料的最大資料包大小為:
- 全速最大1023位元組。
- 高速最大1024位元組。
同步傳輸沒有錯誤檢測。電氣傳輸中的任何錯誤均無法糾正。同步傳輸也受定時抖動的影響。
4.7.6 批量傳輸(Bulk Transfers)
批量傳輸用於控制,中斷和同步傳輸以外的資料。使用錯誤檢測可以在硬體級別上確保可靠的資料交換。
資料的傳輸方式與中斷傳輸的方式相同,但是沒有定義輪詢速率。批量傳輸佔用了其他傳輸完成後的所有可用頻寬。如果匯流排非常繁忙,則批量傳輸可能會延遲。
批量端點資料的最大資料包大小為:
- 全速USB支援8、16、32或64位元組。
- 高速USB支援512位元組。
對於低速和全速端點,以下內容有效:如果匯流排空閒,則可以在單個1ms幀中進行多個批量傳輸(中斷和同步傳輸限制為每幀最多一個數據包)。
例如,批量傳輸將資料傳送到印表機。只要在合理的時間範圍內列印資料,確切的傳輸速率就不重要。
4.7.7 事務(Transaction)
事務:分別有IN事務、OUT事務和SETUP事務三大事務,每一種事務都由令牌包、資料包、握手包三個階段構成:
- 令牌包(Token Packet)是定義事務型別,方向,裝置地址和端點。
- 資料在資料包(Data Packet)中傳輸。
- 事務的最終狀態在握手資料包(Handshake Packet)中確認。
在事務中,資料從USB主機傳輸到USB裝置,反之亦然。傳輸方向在USB主機發送的令牌包中指定。然後,傳送端傳送一個數據包或指示它沒有要傳輸的資料。通常,目的地以握手包作為響應,指示傳輸是否成功。
4.7.8 包(Packets)
每個資料包以當前傳輸速率傳輸整數個位元組。資料包以同步模式開始,然後是資料包的資料位元組,最後以資料包結束(EOP)訊號結束。
所有USB資料包模式都首先發送最低有效位。在資料包之前和之後,匯流排處於空閒狀態。
特殊的資料包是幀開始資料包(SOF),它將USB匯流排分為多個時間段。每個管道在每個幀中分配一個插槽。幀開始資料包在全速鏈路上每1ms傳送一次。高速時,將1ms幀分為8個每幀125μs的微幀。在每個微幀的開頭使用相同的幀號傳送幀開始資料包。幀號每1ms增加一次。
4.7.9 域(field)
域是USB資料最小的單位,由若干位組成,域可分為七種型別:
- 同步域(SYNC),8位,值固定為0000 0001,用於本地時鐘與輸入同步,標誌一個包的起始。
- 標識域(PID),由四位識別符號+四位識別符號反碼構成,表明包的型別和格式,可以計算出USB的標識碼有16種。
- 地址域(ADDR):七位地址,代表了裝置在主機上的地址,地址000 0000被命名為零地址,是任何一個裝置第一次連線到主機時,在被主機配置、列舉前的預設地址,因此一個USB主機只能接127個裝置。
- 端點域(ENDP),4位,由此可知一個USB裝置有的端點數量最大為16個。
- 幀號域(FRAM),11位,每一個幀都有一個特定的幀號,幀號域最大容量0x800,幀號連續增加,到0x7ff後從自動0開始,對於同步傳輸有重要意義。
- 資料域(DATA):長度為0~1023位元組,在不同的傳輸型別中,資料域的長度各不相同,但必須為整數個位元組的長度。
- 校驗域(CRC):對令牌包(CRC5)和資料包(CRC16)中非PID域進行校驗的一種方法,CRC校驗在通訊中應用很泛,是一種很好的校驗方法,至於具體的校驗方法請查閱相關資料,只須注意CRC碼的除法是模2運算,不同於10進制中的除法。
4.7.10 端點(Endpoints)
端點,實際上是裝置硬體上具有一定大小的資料緩衝區。USB系統中,每一個端點都有唯一的地址,是有裝置地址和端點號給出的。預設設定端點0用作控制傳輸端點,其他端點必須在裝置被主機配置後才能使用。
端點可以描述為資料來源或接收器,並且僅存在於USB裝置中。可以從USB主機接收或等待將其儲存在端點上的資料。可以將端點配置為USB規範中定義的四種傳輸型別(控制傳輸,中斷傳輸,同步傳輸和批量傳輸)。在硬體限制內,可以使用USB協議棧配置端點(例如,將端點限制為某種傳輸型別)。
端點充當一種緩衝區。例如,USB主機的客戶端可以將資料傳送到端點1。來自USB主機的資料將傳送到OUT端點1。準備就緒後,微控制器上的程式將立即讀取資料。由於程式無法自由訪問USB匯流排(USB匯流排由USB主機控制),因此必須將返回資料寫入IN端點1。IN端點1中的資料將保留在那裡,直到主機向端點1傳送一個IN資料包以請求資料為止。
這些規則適用於所有微控制器裝置:
- 一個裝置最多可以有16個OUT和16個IN端點。
- 每個端點只能有一個傳輸方向。
- 端點 0僅用於控制傳輸,不能分配任何其他功能。
- OUT始終是指從主機指向裝置的方向。
- IN始終指指向主機的方向。
注意:
- 端點的總數和每個端點支援的功能由硬體定義。
4.8 USB描述符
USB裝置使用描述符報告其屬性,描述符是具有定義格式的資料結構。每個描述符開頭位元組是此描述符的位元組數,之後是描述符型別欄位。
將USB裝置連線到USB匯流排時,主機通過列舉來識別和配置裝置。裝置插入USB主機後,USB主機立即傳送設定請求。系統將指示該裝置選擇配置和介面,以匹配USB主機上執行的應用程式。選擇配置和介面後,裝置必須為活動的端點提供服務,以此與USB主機交換資料。
常用的描述符如下:
- 裝置描述符。
- 配置描述符。
- 介面描述符。
- 一個或多個端點描述符。
具體各種描述符的定義,在後面章節為大家說明。
4.9 USB類
常用的USB類如下:
其中HID,CDC,Audio,MSC等類,將在後續章節詳細說明。
4.10 總結
本章就為大家介紹這麼多,涉及到的知識點比較多,需要大家看本章開頭提供的參考文件地址來進一步的熟悉。
微信公眾號:armfly_com 安富萊論壇:www.armbbs.cn 安富萊淘寶:https://armfly.taobao.com