STM32-USB學習筆記(一) USB基礎

USB基礎知識掃盲

前言

本文將從USB的 插入檢測身份識別數據傳輸三個方面對USB通信整個過程掃盲,其中有些知識點的詳細信息會放在文章最下面的附錄中供查看,從而保證文章的總體簡潔。在進入主題以前,首先了解一下USB的一些基礎知識

USB的分類 學習

  • 按接口類型分spa

    • 控制器/主機(controller/host)
    • 設備(peripheral)
    • OTG(on-the-go),經過id線肯定做爲主機仍是做爲設備
  • 按照USB速度分3d

    • 低速(low speed)
    • 全速(full speed)
    • 高速(high speed)

1、USB插入檢測

USB接口通常是4根線,VCC GND DM(D-) DP(D+)
  • A:USB是如何檢測到設備插入的
  • Q:主機端將DM DP接入下拉電阻;設備端根據不一樣速度,將DM DP的某一根接上拉電阻,插入時經過壓差便可斷定是否插入code

    • 低速設備:在DM線上接入上拉
    • 全速設備:在DP線上接入上拉
    • 高速設備:在DP線上接入上拉,在主機對設備進行復位後進一步的確認,詳情

2、USB身份識別

對於插入的USB設備,主機須要發送比較短的請求來確認設備的身份、類型、速度等信息,這個過程稱之爲 枚舉

2.1 描述符

設備的「身份」信息存儲在描述符中。每一個USB設備中都有以下描述符。須要注意的是blog

  • 一個USB設備只能有一個設備描述符
  • 其餘描述符均可以有多個,對應複合設備,例如USB鍵鼠
  • 設備描述符(device description)索引

    • 配置描述符(config description)接口

      • 接口描述符 (interface description)圖片

        • 端點描述符 (endpoint description)
        • 端點描述符
      • 接口描述符事務

        • 端點描述符
    • 配置描述符ip

      • 接口描述符

        • 端點描述符

2.2 枚舉過程

  1. 等待穩定:主機經過電平差檢測到設備,等待100ms讓設備電平趨於穩定
  2. 首次復位:HUB發起復位,讓設備進入初始的地址0模式
  3. 首次查詢設備描述符:GET_DESCRIPTOR 主機查詢設備描述符,只要前8字節 ==> 80 06 01 00 00 00 12 00
  4. 二次復位:在接收到設備描述符前8個字節後,再次重啓設備
  5. 設置地址:SET_ADDRESS 主機下發設置地址命令,設備獲取新地址 ==> 00 05 01 00 00 00 00 00
  6. 二次查詢設備描述符:GET_DEVICE_DESCRPTOR獲取整個18字節的設備描述符 ==> 80 06 01 00 00 00 12 00
  7. 獲取配置描述符:GET_CONFIGURATION 獲取9字節配置描述符 ==> 80 06 02 00 00 00 09 00
  8. 完成配置:SET_CONFIGURATION,

2.3 描述符詳解

搞懂了描述符,調好了枚舉,就完成了USB通信的一大半,下面就對描述符進行詳細的探索
設備描述符 18 配置描述符 9 接口描述符 9 終點描述符 7
bLength 1 bLength 1 bLength 1 bLength 1
bDescriptorType 1 bDescriptorType 1 bDescriptorType 1 bDescriptorType 1
bcdUSB 2 wTotalLength 2 bNumInterfaces 1 bEndpointAddress 1
bDeviceClass 1 bNumInterfaces 1 bAlterateSetting 1 bmAttributes 1
bDeviceSubClass 1 bConfigurationValue 1 bNumEndpoints 1 wMaxPacketSize 2
bDeviceProtocol 1 iConfiguration 1 bInterfaceClass 1 bInterval 1
bMaxPackeerSize0 1 bmAttributes 1 bInterSubfaceClass 1
idVendor 2 bMaxPower 1 bInterfaceProtocol 1
idProduct 2 iInterface 1
bcdDevice 2
iManufacturer 1
iProduct 1
iSerialNumber 1
iNumConfigurations 1

附錄

F一、USB通信協議詳解

學習協議我我的以爲應該仍是從總體流程向下詳細到具體協議,上來就看最基本單元/協議會讓人一頭霧水,這段附錄的大致流程也是如此。傳輸概念->傳輸流程->基礎傳輸單元->傳輸流程控制->

F1.1 USB通信概念

  1. 在USB的通信中,有傳輸(transfer),事務(Transaction),包(packet)三級。包是最基礎的傳輸單元,與TCP/IP協議中的MAC層協議做用相同。
  2. 在一次傳輸中,由屢次事務組成,每次的事務又由多個包組成
  3. 與衆多協議相同,較高級別的協議的報文是基於/內嵌在低級協議的報文當中的,在USB中也不例外,例如,包中預留了DATA位,其目的就是填寫報文
  • 傳輸(transfer): 控制(control)、中斷(interrupt)、批量(bulk),同步(Isochronous)

    • 事務(transaction):傳輸方向、流程控制

      • 包(packet):

        1. 令牌(Token):IN、OUT、SETUP、SOF,前導包,用於確認本次事務的方向、目的等,是每次事務必需要有的包。
        2. 數據(data):DATA0、DATA一、DATA二、MDATA,夾帶數據
        3. 握手(handshake):ACK、NAK、STALL、NYSET,做爲應答、狀態回覆

F1.2 一次完整傳輸過程

下圖爲一次完整的獲取設備描述符的過程

  • 傳輸:獲取設備描述符

    • 設置事務:主機向設備下發 -> 80 06 00 01 00 00 40 00

      • 令牌包 --> :SETUP類型
      • 數據包 --> :因爲令牌是SETUP類型,因此主機緊接着下發數據包,DATA0類型
      • 握手包 <-- :設備收到數據包,回覆應答
    • 輸入事務:設備向主機上發 -> 12 01 00 01 DC 00 00 10 71 04 F0 FF 00 01 00 00

      • 令牌包 --> :IN類型,主機準備好,設備能夠上發數據
      • 數據包 <-- :DATA1類型:DATA0與DATA1在發送數據時須要交替,DATA中夾帶設備描述符
      • 握手包 --> :主機收到回覆,向設備應答
    • 輸出事務:無

      • 令牌包 --> :OUT類型
      • 數據包 --> :DATA0類型,再一次切換爲DATA0,沒有須要發送給設備的
      • 握手包 <-- :設備收到數據包,回覆應答

F1.3 基礎傳輸單元:傳輸基本單元 -- 包(packet)

不一樣包的組成部分以下表所示,數字爲每個字段所表明位數。結合上面的完整流程能夠更輸入的理解包的概念。
Token 令牌包 SYNC PID ADDR ENDP CRC5
8/32 8 7 4 5
Data 數據包 SYNC PID DATA CRC16
8/32 8 0-1023 16
Handshake 握手包 SYNC PID
8/32 8
SOF 起始包 SYNC Frame Number CRC5
8/32 11 5
  1. SYNC字段:爲固定,FS/LS爲8位,HS爲32位
  2. PID字段:決定了該包的類型,例如Token包的SETUP,IN,OUT,數據包的DATA0,DATA1,握手包的ACK,NAK等
  3. ADDR字段/ENDP字段:前面說過,一個設備只有一個設備描述符和多個終點描述符,這兩個字段就能夠在多個設備中準確的找到目標設備以及設備中的目標終點,相似TCP/IP中的IP與PORT
  4. SOF包:在Token包以前發送,Frame Number爲主機內部自增序列號,不斷循環

    • FS/LS:每1ms發送一次
    • HS:每125us發送一次
  5. EOF:EOF不屬於字段或者數據,而是在每一個包最後加上2個數據位寬的SE0信號(DM DP都爲低),用於表示包的結束

F1.4 傳輸流程控制 -- 事務(Transaction)

在分析那個設備描述符的流程時會發現,必須在每次事務的開始,要使用Token(令牌包)確認該次事務的傳輸「基調」。緣由在於,USB是半雙工,DM DP並不是獨立工做,因此採用"三段式"通信,保證總線不會衝突

  • 令牌包(Token):主機發起
  • 數據包(Data):根據令牌包中的方向,由主機發起(OUT/SETUP)或者設備發起(IN)數據包
  • 握手包(Handshake):數據包接收方發起握手包,返回狀態,包含ACK NAK STALL狀態等。

圖片描述

  1. 不能中斷:USB的每次事務是「堵塞」,必須該事務完整後才能作其餘事務
  2. 狀態判斷:以前的舉例當中,每次傳輸都是成功的回覆了ACK,能夠看到,上圖中,事務發起了三次IN的Token包,設備才發送了下一幀數據。不會由於設備忙就退出事務。
  3. 流程控制: 下發/接收數據、控制進出方向、確認回覆

F1.5 傳輸(Transfer)

終於說到頂層部分了,有點耐心立刻就說完了,首先傳輸分爲如下幾種方式,對應不一樣需求
傳輸方式 令牌包 數據包 握手包 特色及醫用 特殊性
控制 枚舉過程當中使用 屢次事務,簡單的下發命令+回覆須要2次事務6個包
批量 數據量大,要求準確性,經常使用於U盤等設備 屢次事務,DATA0/DATA1交替
中斷 數據量小,要求固定頻率,經常使用於USB鍵盤鼠標 與批量類似,主機會按照固定間隔向設備發令牌包
同步 × 數據量大,要求低延遲,經常使用於USB攝像頭、聲卡 無握手包的批量傳輸

F1.5.1 控制傳輸(Control Transfer)

控制傳輸經常使用於USB枚舉階段,讀取設備描述符、設置地址等少許頻繁的工做。上面舉的獲取完整設備描述符就是一個很是典型的控制傳輸過程,分爲如下幾個階段
  1. 創建階段:SETUP事務,發下指定命令,設備應答
  2. 數據過程:設備等待主機發起IN事務,並將數據上傳,主機回覆應答
  3. 狀態過程:確認完成,這個階段傳輸方向必須與數據傳輸階段相反,數據傳輸是IN,確認就應該用OUT。

圖片描述

F1.5.2 批量傳輸(Bulk Transfer)

  • 區分方向,有批量讀與批量寫,不能同時執行
  • 一次批量傳輸由屢次事務組成
  • 傳輸過程當中數據包類型DATA0/DATA1不斷切換,若是發生錯誤,則主機會要求重傳

圖片描述

F1.5.3 中斷傳輸(Interrupt Transfer)

中斷傳輸在數據傳輸方面與批量傳輸相同,重點在於,主機對中斷傳輸設備必須 保持固定掃描間隔,在設備描述符中標註了該掃面間隔。USB總線即便被其餘設備批量傳輸佔用,也會在完成中間抽空向中斷傳輸設備下發令牌

F1.5.4 同步傳輸(Isochronous Transfer)

由於要求實時性,對數據準確性不是很敏感,因此同步傳輸中的事務是沒有握手包的,以下圖

圖片描述

F2 USB通信請求 Request

命令 bmRequestType bRequest wValue wIndex wLength Data
GET_STATUS 0
CLEAR_FEATURE 1
SET_FEATURE 3
SET_ADDRESS 5 設備地址 0 0
GET_DESCRIPTOR 80H 6 描述符類型+索引 0/languageID 描述符長度 描述符
SET_DESCRIPTOR 7
GET_CONFIGURATION 8
SET_CONFIGURATION 00H 9 00xxH 配置值,高字節固定00 0 0
GET_INTERFACE 10
SET_INTERFACE 11
GET_STATUS 12

bmRequest字段

D7 D6-D5 D4-D0
0:OUT
1:IN
00:標準請求
01:類請求
10:用戶自定義
00:設備01:接02:端03:其餘
相關文章
相關標籤/搜索