AT32 USB主機協(xié)議庫
這部分主要介紹AT32 USB主機庫的結(jié)構(gòu)和庫的使用方法,AT32 USB支持全速和低速,不支持USB2.0高速設(shè)備。這里庫的作用是用來管理USB外設(shè)和實現(xiàn)USB的基本協(xié)議,使開發(fā)者能夠更快的上手開發(fā)。USB主機庫包含以下幾個模塊 如圖1:
- 用戶應用程序此部分為開發(fā)者根據(jù)應用具體需求開發(fā)應用程序。
- USB Core Driver和USB主機類USB Core Driver:此部分實現(xiàn)USB設(shè)備標準協(xié)議棧,標準請求等接口。USB主機類:此部分實現(xiàn)具體USB主機請求。
- USB主機硬件底層接口此部分實現(xiàn)硬件寄存器抽象接口
- USB/OTG外設(shè)
圖1. USB主機庫結(jié)構(gòu)
AT32 USB庫文件
如下是AT32 USB應用工程結(jié)構(gòu)圖:圖2. AT32工程結(jié)構(gòu)
Core Driver庫路徑:OTGFS-->middlewares\usb_driversHost Class庫路徑:middlewares\usbh_class如下是USB主機庫文件列表:表1. USB主機庫文件列表
表2. USB主機類文件列表
USB主機庫文件說明
USB庫實現(xiàn)USB主機枚舉標準請求,同時實現(xiàn)USB規(guī)格里面的4種傳輸類型(control,interrupt,bulk,isochronous)的函數(shù)接口。圖3 USB主機庫文件結(jié)構(gòu)
USB主機文件函數(shù)接口
usbh_int.c函數(shù)接口usbh_int.c主要處理底層中斷,包括設(shè)備連接,設(shè)備斷開等。表3 usbh_int函數(shù)接口
usbh_core.c函數(shù)接口usbh_core.c此文件封裝不同的usb主機函數(shù)接口用于不同的地方調(diào)用,包括一些接收,發(fā)送函數(shù)等。表4 usbh_core函數(shù)接口
usbh_ctrl.c函數(shù)接口usbh_ctrl.c此文件處理USB主機枚舉過程中的一些標準請求。表5 usbh_ctrl函數(shù)接口
支持的標準設(shè)備請求如下表:表6 標準設(shè)備請求
usbh_xx_class.c函數(shù)接口usbh_xx_class.c此文件為具體主機類型的數(shù)據(jù)處理,通過結(jié)構(gòu)體函數(shù)來實現(xiàn)不同主機類型數(shù)據(jù)的處理。開發(fā)者根據(jù)不同的主機類型,來實現(xiàn)下面函數(shù)結(jié)構(gòu)體中的函數(shù),達到不同應用結(jié)果。函數(shù)結(jié)構(gòu)體如下:表7 主機class函數(shù)結(jié)構(gòu)體
表8 主機class函數(shù)接口
usbh_user.c函數(shù)接口usbh_user.c此文件主要為一些給用戶處理事件的函數(shù)如復位,斷開連接等。表9 用戶事件函數(shù)結(jié)構(gòu)體
表10 用戶函數(shù)接口函數(shù)
其它參數(shù)函數(shù)的參數(shù)結(jié)構(gòu)體如下,USB主機庫中參數(shù)傳遞使用結(jié)構(gòu)體usbh_core_type,如下圖:圖4 全局結(jié)構(gòu)體
USB主機的狀態(tài)機如下圖:圖5 USB主機狀態(tài)機
USB返回值,USB函數(shù)接口使用如下函數(shù)返回值。圖6 函數(shù)返回值
通道FIFO分配
USB主機要正常收發(fā)數(shù)據(jù),在初始化時需要為通道分配FIFO,分配給所有通道FIFO大小的和不能超過系統(tǒng)分配給USB緩沖區(qū)的最大長度,具體USB的緩沖區(qū)大小參考RM上的描述。開發(fā)者可以參考例程usb_conf.h為通道自定義分配FIFO。OTGFS主機通道FIFO分配主機模式下,所有通道共享一個接收FIFO,通道發(fā)送FIFO分為非周期性發(fā)送FIFO和周期性發(fā)送FIFO。注意usb_conf.h中對端點分配的FIFO大小單位為word(Byte)。以hid_demo例程為例:
USB主機初始化
在使用USB主機功能時,需要對USB的寄存器做一些基本的初始化,通過調(diào)用USB主機的初始化函數(shù)完成這部分的操作。OTGFS外設(shè)初始化OTGFS初始化函數(shù)usbd_init包含5個參數(shù):
例程主機hid_demo的初始化如下:
USB主機中斷處理
USB主機中斷入口函數(shù)usbh_irq_handler處理所有USB主機中斷,包括連接狀態(tài),通道收發(fā)數(shù)據(jù),SOF,喚醒等中斷,下面介紹一些典型的中斷處理。圖7 USB主機中斷處理函數(shù)
通道中斷處理當USB主機與設(shè)備進行通信時,通道的收發(fā)狀態(tài)都在通道中斷中處理,通道的方向分為IN和OUT通過通道寄存器中的方向為進行判斷。中斷處理函數(shù):usbh_hch_handler代碼如下:
Wakeup 中斷處理當USB主機在掛起狀態(tài)時,檢測到設(shè)備觸發(fā)的遠程喚醒信號,將產(chǎn)生此中斷。此中斷會將當前主機狀態(tài)改為WAKEUP狀態(tài):中斷處理函數(shù):usbh_wakeup_handler代碼如下:
接收FIFO非空中斷此中斷表示當前接收FIFO有數(shù)據(jù),應用程序通過此中斷讀出接收到的數(shù)據(jù),并存放到對應通道的FIFO當中,當數(shù)據(jù)讀取完成之后,會產(chǎn)生對應的通道的中斷。中斷處理函數(shù):usbh_rx_qlvl_handler代碼如下:
主機端口中斷處理當USB主機斷開發(fā)生狀態(tài)改變時,會產(chǎn)生端口中斷,應用程序通過此中斷判斷連接設(shè)備的速度等。中斷處理函數(shù):usbh_port_handler
設(shè)備斷開連接中斷處理當連接的設(shè)備斷開是,會產(chǎn)生斷開連接中斷。中斷處理函數(shù):usbh_disconnect_handler代碼:
USB主機枚舉處理
USB主機狀態(tài)機在usbh_loop_handler函數(shù)中處理,對應的主機狀態(tài)機uhost->global_state,如下圖是設(shè)備連接到主機的狀態(tài)處理流程:圖8 設(shè)備連接狀態(tài)機流程
- USBH_IDLE:當USB啟動或者設(shè)備斷開連接之后在此狀態(tài)
- USBH_PORT_EN:USB主機端口使能之后在此狀態(tài)
- USBH_ATTACHED:USB設(shè)備連接穩(wěn)定之后
- USBH_ENUMERATION:USB設(shè)備標準的枚舉流程
- USBH_USER_HANDLER:枚舉完成之后,調(diào)用主機類的初始化函數(shù)
- USBH_CLASS_REQUEST:主機類初始化完成之后,進行主機類請求
- USBH_CLASS:所有枚舉完成,進行正常的數(shù)據(jù)處理。
USB主機枚舉流程當設(shè)備接到主機之后,通過控制端點(端點0)進行枚舉動作,USB主機的枚舉狀態(tài)如下:
如下是主機枚舉的狀態(tài)機流程:圖9 USB主機枚舉流程
- ENUM_GET_MIN_DESC:獲取8字節(jié)設(shè)備描述
- ENUM_GET_FULL_DESC:獲取18字節(jié)設(shè)備描述
- ENUM_SET_ADDR:設(shè)置設(shè)備地址
- ENUM_GET_CFG:獲取9字節(jié)配置描述
- ENUM_GET_FULL_CFG:獲取完整的配置描述
- ENUM_GET_MFC_STRING:獲取設(shè)備廠商信息
- ENUM_GET_PRODUCT_STRING:獲取設(shè)備產(chǎn)品信息
- ENUM_GET_SERIALNUM_STRING:獲取設(shè)備序列號信息
- ENUM_SET_CONFIG:SET CONFIGURE
- ENUM_COMPLETE:枚舉完成
USB控制傳輸過程包含SETUP-DATA-STATUS三個階段,如下是一個主機獲取設(shè)備信息的傳輸過程GET_DESCRIPTOR:
圖10 Get Descriptor
如下是USB主機庫一個SETUP-DATA-STATUS函數(shù)調(diào)用流程:圖11 USB主機SETUP函數(shù)調(diào)用
usbh_ctrl_transfer_loop函數(shù)中斷對控制請求的各個狀態(tài)階段進行處理:控制請求狀態(tài)機:
圖12 控制請求處理流程
USB主機類初始化在USB標準枚舉完成之后,會調(diào)用USB主機類的初始化,在初始化函數(shù)中解析當前枚舉的設(shè)備是否支持,調(diào)用函數(shù)uhost->class_handler->init_handler(uhost)。初始化代碼例:
USB主機類請求USB主機類初始化之后,可以發(fā)送主機類控制請求,根據(jù)不同的設(shè)備類,需要實現(xiàn)不同的設(shè)備類請求。調(diào)用函數(shù)uhost->class_handler->request_handler((void*)uhost);主機類請求例:
USB主機數(shù)據(jù)處理所有枚舉完成之后,將進行主機數(shù)據(jù)處理主機數(shù)據(jù)處理例:
USB主機類型例程
本章將說明使用AT32 USB主機庫實現(xiàn)不同的主機類型的例程。目前實現(xiàn)的主機類例程如下:
- hid(mouse,keyboard)
- mass storage(msc_only_fat32)
- two_otg_host_demo(僅AT32F435/437支持)
HID例程
HID類支持鼠標和鍵盤設(shè)備,開發(fā)者可修改此例程用以實現(xiàn)支持其它HID類設(shè)備。HID類:
HID類例程初始化當USB設(shè)備標準枚舉完成之后,會進行初始化,調(diào)用uhost_init_handler,調(diào)用此函數(shù)將解析接到主機上的設(shè)備類型,是鼠標還是鍵盤或者其它設(shè)備。通過設(shè)備的配置描述信息進行如下流程解析:
- 查找HID接口
- 判斷接口是鼠標還是鍵盤
- 查找對應接口的端點號
- 初始化對應通道
代碼如下:
HID類請求HID類請求實現(xiàn)一些HID設(shè)備的標準請求,調(diào)用函數(shù)uhost_request_handler
- SET_IDLE
- SET_PROTOCOL
- GET_REPORT
代碼如下:
HID類數(shù)據(jù)處理HID枚舉設(shè)置完成之后,USB主機可以請求設(shè)備數(shù)據(jù),通過調(diào)用uhost_process_handler來處理。
- 通過usbh_interrupt_recv函數(shù)給設(shè)備發(fā)送IN請求
- 通過usbh_get_urb_status(puhost, phid->chin); 獲取IN請求的狀態(tài)
- 通過phid->in_poll判斷多長時間發(fā)送一次IN請求
- 通過phid->protocol判斷是鼠標還是鍵盤
代碼如下:

MSC例程
msc_only_fat32實現(xiàn)一個簡單的mass storage主機類,僅支持FAT32格式。MSC類:
MSC 類初始化當USB設(shè)備標準枚舉完成之后,會進行初始化,調(diào)用uhost_init_handler,調(diào)用此函數(shù)將解析接到主機上的設(shè)備類型,判斷是否是MSC類型。通過設(shè)備的配置描述信息進行如下流程解析:
- 查找MSC接口
- 查找對應接口的端點號
- 初始化對應通道
- 初始化bulk-only和SCSI狀態(tài)機
代碼如下:
MSC類請求MSC類請求實現(xiàn)一些MSC設(shè)備的標準請求,調(diào)用函數(shù)uhost_request_handler
- GET_MAX_LUN
代碼如下:
MSC類數(shù)據(jù)處理HID枚舉設(shè)置完成之后,USB主機可以請求設(shè)備數(shù)據(jù),通過調(diào)用uhost_process_handler來處理。實現(xiàn)如下命令:
- INQUIRY
- TEST_UNIT_READY
- READ_CAPACITY10
- REQUEST_SENSE
代碼如下:
MSC讀寫數(shù)據(jù)MSC讀寫數(shù)據(jù)在通過FATFS接口進行實現(xiàn),在usbh_msc_diskio.c中實現(xiàn)讀寫函數(shù)。讀函數(shù):
寫函數(shù):
CDC例程
cdc實現(xiàn)一個簡單的虛擬串口類。CDC類:
CDC類例程初始化當USB設(shè)備標準枚舉完成之后,會進行初始化,調(diào)用uhost_init_handler,調(diào)用此函數(shù)將解析接到主機上的設(shè)備類型。通過設(shè)備的配置描述信息進行如下流程解析:
- 查找CDC接口
- 判斷接口是否為虛擬串口
- 查找對應接口的端點號
- 初始化對應通道
代碼如下:
CDC類請求CDC類請求實現(xiàn)一些CDC設(shè)備的標準請求,調(diào)用函數(shù)uhost_request_handler
- GET_LINECODING
代碼如下:
CDC類數(shù)據(jù)處理CDC枚舉設(shè)置完成之后,USB主機可以請求設(shè)備數(shù)據(jù),通過調(diào)用uhost_process_handler來處理。
- 通過set_linecoding和get_linecoding配置linecoding
- 通過cdc_process_reception(puhost)函數(shù)給設(shè)備發(fā)送IN請求
- 通過cdc_process_transmission(puhost)函數(shù)發(fā)送數(shù)據(jù)給設(shè)備
代碼如下:

two_otg_host_demo例程
AT32F435/437存在兩個OTGFS,此例程說明同時使用兩個OTGFS實現(xiàn)兩個host功能。
- 實現(xiàn)功能:
OTGFS1實現(xiàn)MSC主機(參考MSC例程)OTGFS2實現(xiàn)HID主機(參考HID例程)配置與實現(xiàn)在usb_conf.h中配置OTGFS1和OTGFS2:
在main中初始化:
關(guān)于雅特力雅特力科技于2016年成立,是一家致力于推動全球市場32位微控制器(MCU)創(chuàng)新趨勢的芯片設(shè)計公司,專注于ARM Cortex-M4/M0+的32位微控制器研發(fā)與創(chuàng)新,全系列采用55nm先進工藝及ARM Cortex-M4高效能或M0+低功耗內(nèi)核,締造M4業(yè)界最高主頻288MHz運算效能,并支持工業(yè)級別芯片工作溫度范圍(-40°~105°)。雅特力目前已累積相當多元的終端產(chǎn)品成功案例:如微型打印機、掃地機、光流無人機、熱成像儀、激光雷達、工業(yè)縫紉機、伺服驅(qū)控、電競周邊市場、斷路器、ADAS、T-BOX、數(shù)字電源、電動工具等終端設(shè)備應用,廣泛地覆蓋5G、物聯(lián)網(wǎng)、消費、商務及工控等領(lǐng)域。
-
mcu
+關(guān)注
關(guān)注
147文章
18935瀏覽量
398573 -
usb
+關(guān)注
關(guān)注
60文章
8441瀏覽量
284634
發(fā)布評論請先 登錄
AT32F011 系列快速使用指南
AT32硬件除法器應用指南
如何使用AT32 EdgeAI Sensor EV Board
AT32開源鴻蒙開發(fā)環(huán)境搭建
擺脫主機束縛:SCP4000 USB射頻微波功率計如何便攜的體驗功率測量
國產(chǎn)MCU替代優(yōu)選!雅特力AT32系列憑高性能+高兼容,橫掃工控/消費/AIoT多場景
快速上手FRDM-KE17Z512開發(fā)板:開啟高效MCU開發(fā)之旅
EZ-USB? FX2G3 DVK快速上手:開啟硬件開發(fā)新體驗
雅特力AT32 MCU推動低空經(jīng)濟發(fā)展
SPI主機/從機接收發(fā)送都開啟DMA通信
AT32 MCU如何使用IAP
AT32 IAP using the USART
AT32的ERTC與RTC的區(qū)別
雅特力AT32 OTGHS應用筆記
雅特力AT32F402/F405入門使用指南
AT32講堂043 | 如何使用AT32 MCU主機庫快速開發(fā)USB相關(guān)應用
評論