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

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

3天内不再提示

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

0739hhbb 来源:AT32 MCU 雅特力科技 2023-01-14 10:56 次阅读

这部分主要介绍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主机库结构

poYBAGPCGemACMLgAADBBRHtVaQ745.png

AT32 USB库文件

如下是AT32 USB应用工程结构图:

图2. AT32工程结构

poYBAGPCGeqAXXdLAADxrvw-9jk830.png

Core Driver库路径:OTGFS-->middlewaresusb_drivers

Host Class库路径:middlewaresusbh_class

如下是USB主机库文件列表:

表1. USB主机库文件列表

pYYBAGPCGemAF-R2AACTDLIsQFo579.png

表2. USB主机类文件列表

3c9cce1c-934b-11ed-bfe3-dac502259ad0.png

USB主机库文件说明

USB库实现USB主机枚举标准请求,同时实现USB规格里面的4种传输类型(control,interrupt,bulk,isochronous)的函数接口。

图3 USB主机库文件结构

poYBAGPCGemAS1EQAAGVXOfzbcA656.png

USB主机文件函数接口

usbh_int.c函数接口

usbh_int.c主要处理底层中断,包括设备连接,设备断开等。

表3 usbh_int函数接口

pYYBAGPCGeqAM1uwAAEvEOwRYeY234.png

usbh_core.c函数接口

usbh_core.c此文件封装不同的usb主机函数接口用于不同的地方调用,包括一些接收,发送函数等。

表4 usbh_core函数接口

poYBAGPCGeqAIDJWAAK2RShex2M859.png

usbh_ctrl.c函数接口

usbh_ctrl.c此文件处理USB主机枚举过程中的一些标准请求。

表5 usbh_ctrl函数接口

3d4b8510-934b-11ed-bfe3-dac502259ad0.png

支持的标准设备请求如下表:

表6 标准设备请求

3d7f24d8-934b-11ed-bfe3-dac502259ad0.png

usbh_xx_class.c函数接口

usbh_xx_class.c此文件为具体主机类型的数据处理,通过结构体函数来实现不同主机类型数据的处理。 开发者根据不同的主机类型,来实现下面函数结构体中的函数,达到不同应用结果。

函数结构体如下:

表7 主机class函数结构体

poYBAGPCGemAKU6RAACpk2uKepA591.png

表8 主机class函数接口

3db5842e-934b-11ed-bfe3-dac502259ad0.png

usbh_user.c函数接口

usbh_user.c此文件主要为一些给用户处理事件的函数如复位,断开连接等。

表9 用户事件函数结构体

3e167dc4-934b-11ed-bfe3-dac502259ad0.png

表10 用户函数接口函数

pYYBAGPCGemABQxyAAE4uY0UDjU994.png

其它参数

函数的参数结构体如下,USB主机库中参数传递使用结构体usbh_core_type,如下图:

图4 全局结构体

poYBAGPCGemASQY0AAGsbWv117c677.png

USB主机的状态机如下图:

图5 USB主机状态机

pYYBAGPCGeqABfpsAAGqKum1DWs090.png

USB返回值,USB函数接口使用如下函数返回值。

图6 函数返回值

poYBAGPCGeqAW49mAAB3-t9oGG8025.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例程为例:

pYYBAGPCGeqAeYgxAAB-YvQaXks727.png

USB主机初始化

在使用USB主机功能时,需要对USB的寄存器做一些基本的初始化,通过调用USB主机的初始化函数完成这部分的操作。

OTGFS****外设初始化

OTGFS初始化函数usbd_init包含5个参数:

3efe3aa6-934b-11ed-bfe3-dac502259ad0.png

例程主机hid_demo的初始化如下:

3f0a4558-934b-11ed-bfe3-dac502259ad0.png

USB主机中断处理

USB主机中断入口函数usbh_irq_handler处理所有USB主机中断,包括连接状态,通道收发数据,SOF,唤醒等中断,下面介绍一些典型的中断处理。

图7 USB主机中断处理函数

pYYBAGPCGeqADgvtAAC9kP6dSa4629.png

通道中断处理

当USB主机与设备进行通信时,通道的收发状态都在通道中断中处理,通道的方向分为IN和OUT通过通道寄存器中的方向为进行判断。

中断处理函数:usbh_hch_handler

代码如下:

pYYBAGPCGemAaSVBAADX2-j2Vm4391.png

Wakeup 中断处理

当USB主机在挂起状态时,检测到设备触发的远程唤醒信号,将产生此中断。 此中断会将当前主机状态改为WAKEUP状态:

中断处理函数:usbh_wakeup_handler

代码如下:

pYYBAGPCGemAKIRdAAAzb1rbiiY826.png

接收FIFO非空中断

此中断表示当前接收FIFO有数据,应用程序通过此中断读出接收到的数据,并存放到对应通道的FIFO当中,当数据读取完成之后,会产生对应的通道的中断。

中断处理函数:usbh_rx_qlvl_handler

代码如下:

poYBAGPCGeqAHA_fAAHcCEnRYZI217.png

主机端口中断处理

当USB主机断开发生状态改变时,会产生端口中断,应用程序通过此中断判断连接设备的速度等。

中断处理函数:usbh_port_handler

poYBAGPCGemAdbJSAAIqz4dfpOo907.png

设备断开连接中断处理

当连接的设备断开是,会产生断开连接中断。

中断处理函数:usbh_disconnect_handler

代码:

3fda294e-934b-11ed-bfe3-dac502259ad0.png

USB主机枚举处理

USB主机状态机在usbh_loop_handler函数中处理,对应的主机状态机uhost->global_state,如下图是设备连接到主机的状态处理流程:

图8 设备连接状态机流程

pYYBAGPCGeqAedtxAADPB8920Ng011.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主机的枚举状态如下:

4029d7e6-934b-11ed-bfe3-dac502259ad0.png

如下是主机枚举的状态机流程:

图9 USB主机枚举流程

poYBAGPCGemALC-AAAEh3jWDVoc133.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:设置配置

ENUM_COMPLETE:枚举完成

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

图10 获取描述符

poYBAGPCGemAbp_KAALyieWrtAM860.png

如下是USB主机库一个SETUP-DATA-STATUS函数调用流程:

图11 USB主机SETUP函数调用

poYBAGPCGemAVsrtAAClR2qRLKQ661.png

usbh_ctrl_transfer_loop函数中断对控制请求的各个状态阶段进行处理:

控制请求状态机:

poYBAGPCGeqACl07AAGKan53f-8701.png

图12 控制请求处理流程

pYYBAGPCGeqAQfufAAHp0pVDoJQ041.png

USB主机类初始化

在USB标准枚举完成之后,会调用USB主机类的初始化,在初始化函数中解析当前枚举的设备是否支持,调用函数uhost->class_handler->init_handler(uhost)。

初始化代码例:

pYYBAGPCGeqAeSWdAANPFeA8_HE302.png

USB主机类请求

USB主机类初始化之后,可以发送主机类控制请求,根据不同的设备类,需要实现不同的设备类请求。 调用函数uhost->class_handler->request_handler((void*)uhost);

主机类请求例:

pYYBAGPCGeqAOWhEAAIgaGEtjsY303.png

USB主机数据处理

所有枚举完成之后,将进行主机数据处理

主机数据处理例:

poYBAGPCGeqAXomsAAIz4vO6FBU200.png

USB主机类型例程

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

隐藏(鼠标,键盘)

大容量存储(msc_only_fat32)

two_otg_host_demo(仅AT32F435/437支持)

HID例程

HID类支持鼠标和键盘设备,开发者可修改此例程用以实现支持其它HID类设备。

HID类:

4218eede-934b-11ed-bfe3-dac502259ad0.png

HID类例程初始化

当USB设备标准枚举完成之后,会进行初始化,调用uhost_init_handler, 调用此函数将解析接到主机上的设备类型,是鼠标还是键盘或者其它设备。

通过设备的配置描述信息进行如下流程解析:

查找HID接口

判断接口是鼠标还是键盘

查找对应接口的端点号

初始化对应通道

代码如下:

poYBAGPCGeqAYjPCAANPmGMn9c8574.png

HID类请求

HID类请求实现一些HID设备的标准请求,调用函数uhost_request_handler

SET_IDLE

SET_PROTOCOL

GET_REPORT

代码如下:

poYBAGPCGeqAFjE1AAIgDGgtepU537.png

HID****类数据处理

HID枚举设置完成之后,USB主机可以请求设备数据,通过调用uhost_process_handler来处理。

通过usbh_interrupt_recv函数给设备发送IN请求

通过usbh_get_urb_status(puhost, phid->chin); 获取IN请求的状态

通过phid->in_poll判断多长时间发送一次IN请求

通过phid->protocol判断是鼠标还是键盘

代码如下:

pYYBAGPCGemABjTjAAIx4pg9MMU705.png

MSC例程

msc_only_fat32实现一个简单的mass storage主机类,仅支持FAT32格式。

MSC类:

42d238ee-934b-11ed-bfe3-dac502259ad0.png

MSC 类初始化

当USB设备标准枚举完成之后,会进行初始化,调用uhost_init_handler,调用此函数将解析接到主机上的设备类型,判断是否是MSC类型。

通过设备的配置描述信息进行如下流程解析:

查找MSC接口

查找对应接口的端点号

初始化对应通道

初始化bulk-only和SCSI状态机

代码如下:

42ec0846-934b-11ed-bfe3-dac502259ad0.png

MSC类请求

MSC类请求实现一些MSC设备的标准请求,调用函数uhost_request_handler

GET_MAX_LUN

代码如下:

pYYBAGPCGemASFiLAAIBxVAZTy0606.png

MSC类数据处理

HID枚举设置完成之后,USB主机可以请求设备数据,通过调用uhost_process_handler来处理。

实现如下命令:

查询

TEST_UNIT_READY

READ_CAPACITY10

REQUEST_SENSE

代码如下:

poYBAGPCGeqASnnsAATE6wP31UI178.png

MSC读写数据

MSC读写数据在通过FATFS接口进行实现,在usbh_msc_diskio.c中实现读写函数。

读函数:

pYYBAGPCGemAPac7AACwdLvP8-A457.png

写函数:

43ae30c4-934b-11ed-bfe3-dac502259ad0.png

CDC例程

cdc实现一个简单的虚拟串口类。

CDC类:

43c9ea3a-934b-11ed-bfe3-dac502259ad0.png

CDC类例程初始化

当USB设备标准枚举完成之后,会进行初始化,调用uhost_init_handler, 调用此函数将解析接到主机上的设备类型。

通过设备的配置描述信息进行如下流程解析:

查找CDC接口

判断接口是否为虚拟串口

查找对应接口的端点号

初始化对应通道

代码如下:

43dfb892-934b-11ed-bfe3-dac502259ad0.png

CDC类请求

CDC类请求实现一些CDC设备的标准请求,调用函数uhost_request_handler

GET_LINECODING

代码如下:

poYBAGPCGemAW50gAAB0jJKksv4010.png

CDC类数据处理

CDC枚举设置完成之后,USB主机可以请求设备数据,通过调用uhost_process_handler来处理。

通过set_linecoding和get_linecoding配置linecoding

通过cdc_process_reception(puhost)函数给设备发送IN请求

通过cdc_process_transmission(puhost)函数发送数据给设备

代码如下:

441a1d84-934b-11ed-bfe3-dac502259ad0.png

two_otg_host_demo例程

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

实现功能:

OTGFS1实现MSC主机(参考MSC例程)

OTGFS2实现HID主机(参考HID例程)

配置与实现

在usb_conf.h中配置OTGFS1和OTGFS2:

pYYBAGPCGeqAe7UsAAWCozQX2p8715.png

在main中初始化:

pYYBAGPCGemAM8BZAAIMqWI16Z8295.png

审核编辑:汤梓红

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

    关注

    146

    文章

    17123

    浏览量

    350995
  • 接口
    +关注

    关注

    33

    文章

    8575

    浏览量

    151023
  • usb
    usb
    +关注

    关注

    60

    文章

    7937

    浏览量

    264485
  • 主机
    +关注

    关注

    0

    文章

    993

    浏览量

    35114
  • AT32
    +关注

    关注

    1

    文章

    113

    浏览量

    2090

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

文章出处:【微信号:AT32 MCU 雅特力科技,微信公众号:AT32 MCU 雅特力科技】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    MCU USB主机相关资料下载

    MCU USB主机
    发表于 11-03 07:31

    AT32 MCU USB主机库应用说明

    AT32 MCU USB Host Library Application Note主要描述AT32F4xx 系列USB 主机库的架构和使用
    发表于 10-25 07:02

    AT32 MCU USB设备库应用说明

    AT32 MCU USB Device Library Application Note主要描述AT32F4xx 系列USB 设备库的架构和使用方法,方便
    发表于 10-25 07:07

    使用Arduino IDE搭建AT32 MCU开发环境

    使用Arduino IDE搭建AT32 MCU开发环境旨在帮助使用Arduino IDE开发AT32的用户,
    发表于 10-26 07:48

    带VSCode EIDE的AT32 MCU

    AT32 MCU With VSCode EIDE描述了VSCode开发环境中,使用Embedded IDE管理AT32项目。
    发表于 10-26 07:38

    OTG IP主机库介绍(上)

    STM32单片机的OTG IP主机库介绍(上)
    发表于 11-25 14:50 0次下载

    介绍OTG IP主机库的特点(1)

    OTG IP主机库介绍(上)
    的头像 发表于 07-02 12:39 3509次阅读

    MCU USB主机

    MCU USB主机
    发表于 10-28 14:05 2次下载
    <b class='flag-5'>MCU</b> <b class='flag-5'>USB</b><b class='flag-5'>主机</b>

    雅特力AT32 MCU USB设备库的架构和使用方法

    这部分主要介绍AT32 USB设备库的结构和库的使用方法,AT32 USB是基于USB2.0全速设备,不支持
    的头像 发表于 02-22 10:09 2164次阅读

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

    开发者能够更快的上手开发USB主机库包含以下几个模块如图1:用户应用程序此部分为开发者根据应用具体需求
    的头像 发表于 01-16 11:05 2121次阅读
    <b class='flag-5'>AT32</b>讲堂043 | 如何使用<b class='flag-5'>AT32</b> <b class='flag-5'>MCU</b><b class='flag-5'>主机库</b><b class='flag-5'>快速</b><b class='flag-5'>开发</b><b class='flag-5'>USB</b><b class='flag-5'>相关</b>应用

    如何使用AT32 MCU WDT和WWDT?

    如何使用AT32 MCU WDT和WWDT?
    的头像 发表于 11-10 18:26 2035次阅读
    如何使用<b class='flag-5'>AT32</b> <b class='flag-5'>MCU</b> WDT和WWDT?

    关于AT32 MCU温度传感器的应用

    关于AT32 MCU温度传感器的应用
    的头像 发表于 10-27 09:44 712次阅读
    关于<b class='flag-5'>AT32</b> <b class='flag-5'>MCU</b>温度传感器的应用

    AT32 MCU如何使用USB MSD 进行IAP升级?

    AT32 MCU如何使用USB MSD 进行IAP升级?
    的头像 发表于 10-27 09:23 1154次阅读
    <b class='flag-5'>AT32</b> <b class='flag-5'>MCU</b>如何使用<b class='flag-5'>USB</b> MSD 进行IAP升级?

    AT32 MCU Develop with VSCode

    电子发烧友网站提供《AT32 MCU Develop with VSCode.pdf》资料免费下载
    发表于 09-19 15:22 2次下载
    <b class='flag-5'>AT32</b> <b class='flag-5'>MCU</b> Develop with VSCode

    STM32Cube USB主机库

    电子发烧友网站提供《STM32Cube USB主机库 .pdf》资料免费下载
    发表于 09-21 14:40 0次下载
    STM32Cube <b class='flag-5'>USB</b><b class='flag-5'>主机库</b>