0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

AT32讲堂043 | 如何使用AT32 MCU主机库快速开发USB相关应用

雅特力 AT32 MCU 2023-01-16 11:05 次阅读

AT32 USB主机协议库

这部分主要介绍AT32 USB主机库的结构和库的使用方法,AT32 USB支持全速和低速,不支持USB2.0高速设备。这里库的作用是用来管理USB外设和实现USB的基本协议,使开发者能够更快的上手开发。USB主机库包含以下几个模块 如图1:

  • 用户应用程序此部分为开发者根据应用具体需求开发应用程序。
  • USB Core Driver和USB主机类USB Core Driver:此部分实现USB设备标准协议栈,标准请求等接口。USB主机类:此部分实现具体USB主机请求。
  • USB主机硬件底层接口此部分实现硬件寄存器抽象接口
  • USB/OTG外设

图1. USB主机库结构2bfc3e84-9419-11ed-ad0d-dac502259ad0.png

AT32 USB库文件

如下是AT32 USB应用工程结构图:图2. AT32工程结构2c0b85f6-9419-11ed-ad0d-dac502259ad0.pngCore Driver库路径:OTGFS-->middlewares\usb_driversHost Class库路径:middlewares\usbh_class如下是USB主机库文件列表:表1. USB主机库文件列表2c2aa4b8-9419-11ed-ad0d-dac502259ad0.png表2. USB主机类文件列表2c429b0e-9419-11ed-ad0d-dac502259ad0.png

USB主机库文件说明

USB库实现USB主机枚举标准请求,同时实现USB规格里面的4种传输类型(control,interrupt,bulk,isochronous)的函数接口。图3 USB主机库文件结构2c611dc2-9419-11ed-ad0d-dac502259ad0.png

USB主机文件函数接口

usbh_int.c函数接口usbh_int.c主要处理底层中断,包括设备连接,设备断开等。表3 usbh_int函数接口2c91da02-9419-11ed-ad0d-dac502259ad0.pngusbh_core.c函数接口usbh_core.c此文件封装不同的usb主机函数接口用于不同的地方调用,包括一些接收,发送函数等。表4 usbh_core函数接口2cb0c5d4-9419-11ed-ad0d-dac502259ad0.pngusbh_ctrl.c函数接口usbh_ctrl.c此文件处理USB主机枚举过程中的一些标准请求。表5 usbh_ctrl函数接口2cbe4e84-9419-11ed-ad0d-dac502259ad0.png支持的标准设备请求如下表:表6 标准设备请求2ce1ff3c-9419-11ed-ad0d-dac502259ad0.pngusbh_xx_class.c函数接口usbh_xx_class.c此文件为具体主机类型的数据处理,通过结构体函数来实现不同主机类型数据的处理。开发者根据不同的主机类型,来实现下面函数结构体中的函数,达到不同应用结果。函数结构体如下:表7 主机class函数结构体2d0c3b76-9419-11ed-ad0d-dac502259ad0.png表8 主机class函数接口2d27eeca-9419-11ed-ad0d-dac502259ad0.pngusbh_user.c函数接口usbh_user.c此文件主要为一些给用户处理事件的函数如复位,断开连接等。表9 用户事件函数结构体2d346916-9419-11ed-ad0d-dac502259ad0.png表10 用户函数接口函数2d4e8ed6-9419-11ed-ad0d-dac502259ad0.png其它参数函数的参数结构体如下,USB主机库中参数传递使用结构体usbh_core_type,如下图:图4 全局结构体2d81047e-9419-11ed-ad0d-dac502259ad0.pngUSB主机的状态机如下图:图5 USB主机状态机2da7701e-9419-11ed-ad0d-dac502259ad0.pngUSB返回值,USB函数接口使用如下函数返回值。图6 函数返回值2dc321b0-9419-11ed-ad0d-dac502259ad0.png

通道FIFO分配

USB主机要正常收发数据,在初始化时需要为通道分配FIFO,分配给所有通道FIFO大小的和不能超过系统分配给USB缓冲区的最大长度,具体USB的缓冲区大小参考RM上的描述。开发者可以参考例程usb_conf.h为通道自定义分配FIFO。OTGFS主机通道FIFO分配主机模式下,所有通道共享一个接收FIFO,通道发送FIFO分为非周期性发送FIFO和周期性发送FIFO。注意usb_conf.h中对端点分配的FIFO大小单位为word(Byte)。以hid_demo例程为例:2dd82600-9419-11ed-ad0d-dac502259ad0.png

USB主机初始化

在使用USB主机功能时,需要对USB的寄存器做一些基本的初始化,通过调用USB主机的初始化函数完成这部分的操作。OTGFS外设初始化OTGFS初始化函数usbd_init包含5个参数:2dee41a6-9419-11ed-ad0d-dac502259ad0.png例程主机hid_demo的初始化如下:2e0e61d4-9419-11ed-ad0d-dac502259ad0.png

USB主机中断处理

USB主机中断入口函数usbh_irq_handler处理所有USB主机中断,包括连接状态,通道收发数据,SOF,唤醒等中断,下面介绍一些典型的中断处理。图7 USB主机中断处理函数2e265ce4-9419-11ed-ad0d-dac502259ad0.png通道中断处理当USB主机与设备进行通信时,通道的收发状态都在通道中断中处理,通道的方向分为IN和OUT通过通道寄存器中的方向为进行判断。中断处理函数:usbh_hch_handler代码如下:2e5682a2-9419-11ed-ad0d-dac502259ad0.pngWakeup 中断处理当USB主机在挂起状态时,检测到设备触发的远程唤醒信号,将产生此中断。此中断会将当前主机状态改为WAKEUP状态:中断处理函数:usbh_wakeup_handler代码如下:2e7aae84-9419-11ed-ad0d-dac502259ad0.png接收FIFO非空中断此中断表示当前接收FIFO有数据,应用程序通过此中断读出接收到的数据,并存放到对应通道的FIFO当中,当数据读取完成之后,会产生对应的通道的中断。中断处理函数:usbh_rx_qlvl_handler代码如下:2e91bf48-9419-11ed-ad0d-dac502259ad0.png主机端口中断处理当USB主机断开发生状态改变时,会产生端口中断,应用程序通过此中断判断连接设备的速度等。中断处理函数:usbh_port_handler2ec54eb2-9419-11ed-ad0d-dac502259ad0.png设备断开连接中断处理当连接的设备断开是,会产生断开连接中断。中断处理函数:usbh_disconnect_handler代码:2ee67862-9419-11ed-ad0d-dac502259ad0.png

USB主机枚举处理

USB主机状态机在usbh_loop_handler函数中处理,对应的主机状态机uhost->global_state,如下图是设备连接到主机的状态处理流程:图8 设备连接状态机流程2ef96a4e-9419-11ed-ad0d-dac502259ad0.png

  • USBH_IDLE:当USB启动或者设备断开连接之后在此状态
  • USBH_PORT_EN:USB主机端口使能之后在此状态
  • USBH_ATTACHED:USB设备连接稳定之后
  • USBH_ENUMERATION:USB设备标准的枚举流程
  • USBH_USER_HANDLER:枚举完成之后,调用主机类的初始化函数
  • USBH_CLASS_REQUEST:主机类初始化完成之后,进行主机类请求
  • USBH_CLASS:所有枚举完成,进行正常的数据处理。

USB主机枚举流程当设备接到主机之后,通过控制端点(端点0)进行枚举动作,USB主机的枚举状态如下:2f246668-9419-11ed-ad0d-dac502259ad0.png如下是主机枚举的状态机流程:图9 USB主机枚举流程2f4a8ef6-9419-11ed-ad0d-dac502259ad0.png

  • ENUM_GET_MIN_DESC:获取8字节设备描述
  • ENUM_GET_FULL_DESC:获取18字节设备描述
  • ENUM_SET_ADDR:设置设备地址
  • ENUM_GET_CFG:获取9字节配置描述
  • ENUM_GET_FULL_CFG:获取完整的配置描述
  • ENUM_GET_MFC_STRING:获取设备厂商信息
  • ENUM_GET_PRODUCT_STRING:获取设备产品信息
  • ENUM_GET_SERIALNUM_STRING:获取设备序列号信息
  • ENUM_SET_CONFIG:SET CONFIGURE
  • ENUM_COMPLETE:枚举完成

USB控制传输过程包含SETUP-DATA-STATUS三个阶段,如下是一个主机获取设备信息的传输过程GET_DESCRIPTOR:

图10 Get Descriptor2f832d60-9419-11ed-ad0d-dac502259ad0.png如下是USB主机库一个SETUP-DATA-STATUS函数调用流程:图11 USB主机SETUP函数调用2fa394a6-9419-11ed-ad0d-dac502259ad0.pngusbh_ctrl_transfer_loop函数中断对控制请求的各个状态阶段进行处理:控制请求状态机:2fc051ea-9419-11ed-ad0d-dac502259ad0.png图12 控制请求处理流程2fdf8a7e-9419-11ed-ad0d-dac502259ad0.pngUSB主机类初始化在USB标准枚举完成之后,会调用USB主机类的初始化,在初始化函数中解析当前枚举的设备是否支持,调用函数uhost->class_handler->init_handler(uhost)。初始化代码例:300d84a6-9419-11ed-ad0d-dac502259ad0.pngUSB主机类请求USB主机类初始化之后,可以发送主机类控制请求,根据不同的设备类,需要实现不同的设备类请求。调用函数uhost->class_handler->request_handler((void*)uhost);主机类请求例:30642ad6-9419-11ed-ad0d-dac502259ad0.pngUSB主机数据处理所有枚举完成之后,将进行主机数据处理主机数据处理例:3091ca36-9419-11ed-ad0d-dac502259ad0.png

USB主机类型例程

本章将说明使用AT32 USB主机库实现不同的主机类型的例程。目前实现的主机类例程如下:

  • hid(mouse,keyboard)
  • mass storage(msc_only_fat32)
  • two_otg_host_demo(仅AT32F435/437支持)

HID例程

HID类支持鼠标和键盘设备,开发者可修改此例程用以实现支持其它HID类设备。HID类:309e486a-9419-11ed-ad0d-dac502259ad0.pngHID类例程初始化当USB设备标准枚举完成之后,会进行初始化,调用uhost_init_handler,调用此函数将解析接到主机上的设备类型,是鼠标还是键盘或者其它设备。通过设备的配置描述信息进行如下流程解析:

  • 查找HID接口
  • 判断接口是鼠标还是键盘
  • 查找对应接口的端点号
  • 初始化对应通道

代码如下:

30be888c-9419-11ed-ad0d-dac502259ad0.pngHID类请求HID类请求实现一些HID设备的标准请求,调用函数uhost_request_handler

  • SET_IDLE
  • SET_PROTOCOL
  • GET_REPORT

代码如下:

30ced458-9419-11ed-ad0d-dac502259ad0.pngHID类数据处理HID枚举设置完成之后,USB主机可以请求设备数据,通过调用uhost_process_handler来处理。

  • 通过usbh_interrupt_recv函数给设备发送IN请求
  • 通过usbh_get_urb_status(puhost, phid->chin); 获取IN请求的状态
  • 通过phid->in_poll判断多长时间发送一次IN请求
  • 通过phid->protocol判断是鼠标还是键盘

代码如下:

30e4029c-9419-11ed-ad0d-dac502259ad0.png

MSC例程

msc_only_fat32实现一个简单的mass storage主机类,仅支持FAT32格式。MSC类:3103776c-9419-11ed-ad0d-dac502259ad0.pngMSC 类初始化当USB设备标准枚举完成之后,会进行初始化,调用uhost_init_handler,调用此函数将解析接到主机上的设备类型,判断是否是MSC类型。通过设备的配置描述信息进行如下流程解析:

  • 查找MSC接口
  • 查找对应接口的端点号
  • 初始化对应通道
  • 初始化bulk-only和SCSI状态机

代码如下:

31191efa-9419-11ed-ad0d-dac502259ad0.pngMSC类请求MSC类请求实现一些MSC设备的标准请求,调用函数uhost_request_handler

  • GET_MAX_LUN

代码如下:

314c23ea-9419-11ed-ad0d-dac502259ad0.pngMSC类数据处理HID枚举设置完成之后,USB主机可以请求设备数据,通过调用uhost_process_handler来处理。实现如下命令:

  • INQUIRY
  • TEST_UNIT_READY
  • READ_CAPACITY10
  • REQUEST_SENSE

代码如下:

31661444-9419-11ed-ad0d-dac502259ad0.pngMSC读写数据MSC读写数据在通过FATFS接口进行实现,在usbh_msc_diskio.c中实现读写函数。读函数:31c74bce-9419-11ed-ad0d-dac502259ad0.png写函数:31ebfd5c-9419-11ed-ad0d-dac502259ad0.png

CDC例程

cdc实现一个简单的虚拟串口类。CDC类:3218514a-9419-11ed-ad0d-dac502259ad0.pngCDC类例程初始化当USB设备标准枚举完成之后,会进行初始化,调用uhost_init_handler,调用此函数将解析接到主机上的设备类型。通过设备的配置描述信息进行如下流程解析:

  • 查找CDC接口
  • 判断接口是否为虚拟串口
  • 查找对应接口的端点号
  • 初始化对应通道

代码如下:

32375eaa-9419-11ed-ad0d-dac502259ad0.pngCDC类请求CDC类请求实现一些CDC设备的标准请求,调用函数uhost_request_handler

  • GET_LINECODING

代码如下:

326f7a92-9419-11ed-ad0d-dac502259ad0.pngCDC类数据处理CDC枚举设置完成之后,USB主机可以请求设备数据,通过调用uhost_process_handler来处理。

  • 通过set_linecoding和get_linecoding配置linecoding
  • 通过cdc_process_reception(puhost)函数给设备发送IN请求
  • 通过cdc_process_transmission(puhost)函数发送数据给设备

代码如下:

3284cadc-9419-11ed-ad0d-dac502259ad0.png

two_otg_host_demo例程

AT32F435/437存在两个OTGFS,此例程说明同时使用两个OTGFS实现两个host功能。

  • 实现功能:

OTGFS1实现MSC主机(参考MSC例程)OTGFS2实现HID主机(参考HID例程)配置与实现在usb_conf.h中配置OTGFS1和OTGFS2:32c1bf64-9419-11ed-ad0d-dac502259ad0.png在main中初始化:33270270-9419-11ed-ad0d-dac502259ad0.png

关于雅特力雅特力科技于2016年成立,是一家致力于推动全球市场32位微控制器(MCU)创新趋势的芯片设计公司,专注于ARM Cortex-M4/M0+的32位微控制器研发与创新,全系列采用55nm先进工艺及ARM Cortex-M4高效能或M0+低功耗内核,缔造M4业界最高主频288MHz运算效能,并支持工业级别芯片工作温度范围(-40°~105°)。雅特力目前已累积相当多元的终端产品成功案例:如微型打印机、扫地机、光流无人机、热成像仪、激光雷达、工业缝纫机、伺服驱控、电竞周边市场、断路器、ADAS、T-BOX、数字电源、电动工具等终端设备应用,广泛地覆盖5G物联网、消费、商务及工控等领域。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    17135

    浏览量

    351029
  • usb
    usb
    +关注

    关注

    60

    文章

    7939

    浏览量

    264512
收藏 人收藏

    评论

    相关推荐

    DVEVM上的主机USB支持

    电子发烧友网站提供《DVEVM上的主机USB支持.pdf》资料免费下载
    发表于 10-15 10:04 0次下载
    DVEVM上的<b class='flag-5'>主机</b><b class='flag-5'>USB</b>支持

    STM32转AT32代码转换

    GD32等等。本文主要介绍一款ST32转AT32的工具AT32SmartCodeTransfer.exe,可以快速实现芯片的更换,提高开发效率。1.1.软件功能本软
    的头像 发表于 09-28 08:09 321次阅读
    STM32转<b class='flag-5'>AT32</b>代码转换

    usb主机模式怎么打开

    USB主机模式(USB Host Mode)是指设备(如智能手机、平板电脑或某些类型的计算机)能够连接到USB设备(如键盘、鼠标、存储设备等),并作为
    的头像 发表于 09-25 09:08 1261次阅读

    usb主机模式和设备模式的区别

    USB(通用串行总线)是一种广泛使用的接口威廉希尔官方网站 ,用于连接计算机和外部设备。USB主机模式和设备模式是USB通信中的两种不同角色,它们定义了设备和计算机之间的通信方式。以下是对这两种模式
    的头像 发表于 09-25 09:06 803次阅读

    AT32讲堂088 | 雅特力AT32F402/F405时钟配置

    简介时钟是芯片正确高效运行的基础,正确的时钟配置是芯片能正确运行的必要条件,其重要性不言而喻。AT32各系列产品的时钟配置部分可能存在细微的差异和需要注意的事项,本文档就着重针对各系列的情况来详细
    的头像 发表于 09-15 08:08 485次阅读
    <b class='flag-5'>AT32</b><b class='flag-5'>讲堂</b>088 | 雅特力AT32F402/F405时钟配置

    AT32讲堂087 | 雅特力AT32 IDE快速入门指南

    新建项目新项目向导AT32ID提供支持雅特力MCU的C语言项目模板,方便用户快速创建项目。菜单栏【File】>【New】>【CProject】。新建项目向导的对话框将出现。在对
    的头像 发表于 09-15 08:08 436次阅读
    <b class='flag-5'>AT32</b><b class='flag-5'>讲堂</b>087 | 雅特力<b class='flag-5'>AT32</b> IDE<b class='flag-5'>快速</b>入门指南

    雅特力AT32 MCU的随机数生成

    概述产品和生态系统安全性的需求比以往任何时候都更加重要。真随机数是所有安全系统的核心,其质量会影响设计的安全性。因此在没有内置硬件TRNG的AT32的微控制器系列中,如何提高随机数的有效,来符合
    的头像 发表于 08-30 12:26 543次阅读
    雅特力<b class='flag-5'>AT32</b> <b class='flag-5'>MCU</b>的随机数生成

    AT32讲堂085 | 雅特力AT32 MCU HICK时钟校准

    简介AT32系列MCU内部都有提供适合运行的内部高速时钟(HICK),其本质就是内置于芯片的RC振荡器。在25℃下,其典型值频率8MHz的精度由工厂校准到±1%,在-40到105℃,该内部高速时钟
    的头像 发表于 08-30 12:26 613次阅读
    <b class='flag-5'>AT32</b><b class='flag-5'>讲堂</b>085 | 雅特力<b class='flag-5'>AT32</b> <b class='flag-5'>MCU</b> HICK时钟校准

    如何在雅特力AT32 MCU上创建IAP应用程序

    概述AT32CANIAP快速使用方法使用CAN进行IAP升级,此示例使用PC上位软件(IAP_Programmer.exe)通过一个USB转CAN的桥接设备和目标板进行通信,IAPDemo和桥接设备
    的头像 发表于 05-20 08:15 1124次阅读
    如何在雅特力<b class='flag-5'>AT32</b> <b class='flag-5'>MCU</b>上创建IAP应用程序

    USB嵌入式主机堆栈

    USB标准下,USB设备之间不能直接通信。它们只能与控制一个或多个设备通信的总线的 USB 主机通信。常见的 USB
    发表于 05-03 09:13 188次阅读
    <b class='flag-5'>USB</b>嵌入式<b class='flag-5'>主机</b>堆栈

    想用ST MC电机库进行BLDC开发,电机无法快速切换正反转怎么解决?

    想用ST MC电机库进行BLDC开发,实际要求电机可以快速切换正反转,但实际实验过程中却无法实现,两方向切换过程中必须要延时一些时间,否则反向无法正常启动。感觉就像是要“缓一下”才行,但这缓 的时间
    发表于 04-18 06:46

    雅特力AT32 MCU与SEGGER携手合作,开发量产事半功倍

    近日,雅特力与SEGGER共同宣布J-Link仿真调试器与Flasher在线烧录器全面支持AT32 MCU产品,SEGGER工具链的加持使AT32 MCU
    的头像 发表于 02-23 10:27 410次阅读

    雅特力AT32 MCU与SEGGER携手合作,开发量产事半功倍

    近日,雅特力与SEGGER共同宣布J-Link仿真调试器与Flasher在线烧录器全面支持AT32MCU产品,SEGGER工具链的加持使AT32MCU开发如虎添翼。雅特力自2018年对外销售以来
    的头像 发表于 02-22 08:13 479次阅读
    雅特力<b class='flag-5'>AT32</b> <b class='flag-5'>MCU</b>与SEGGER携手合作,<b class='flag-5'>开发</b>量产事半功倍

    AT32 定时器配置中pr和div的作用

    AT32定时器是51系列单片机中的一种定时器,可以实现多种定时功能。在AT32定时器中,pr和div是两个相关的参数,用于配置定时器的工作参数。 首先,需要了解pr和div分别代表什么含义。pr
    的头像 发表于 01-08 10:12 1301次阅读

    雅特力AT32 MCU HOGP开发指南

    。HID角色在HID中,以及在HOGP的延伸中,定义了两个角色,这些角色是HID主机和HID设备。HID设备一次只能主动连接到单个HID主机;然而一个HID主机可以连接
    的头像 发表于 12-30 08:14 647次阅读
    雅特力<b class='flag-5'>AT32</b> <b class='flag-5'>MCU</b> HOGP<b class='flag-5'>开发</b>指南