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

2023-03-04 AT32 MCU 雅特力科技公众号
MCU,AT32,雅特力 MCU,AT32,雅特力 MCU,AT32,雅特力 MCU,AT32,雅特力

本文主要介绍雅特力MCU AT32 USB设备库的结构和库的使用方法,AT32 USB是基于USB2.0全速设备,不支持USB2.0高速设备。这里库的作用是用来管理USB外设和实现USB的基本协议,使开发者能够更快的上手开发。


USB Deivce库包含以下几个模块如图1:

  • 用户应用程序

此部分为开发者根据应用具体需求开发应用程序。

  • USB Core Driver和USB设备类

USB Core Driver:此部分实现USB设备标准协议栈,标准请求等接口。

USB设备类:此部分实现一个具体USB设备的描述和设备请求。

  • USB硬件底层接口

此部分实现硬件寄存器抽象接口

  • USB/OTG外设

图1. USB库结构


AT32 USB库文件

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

图2. AT32工程结构

Core Driver库路径:OTGFS-->middlewares\usb_drivers

USBFS-->middlewares\usbd_drivers

Device Class库路径:middlewares\usbd_class

如下是USB库文件列表:

表1. USB库文件列表

表2. USB设备类型文件列表

USB设备库文件说明

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

图3. USB库文件结构

USB设备文件函数接口


usbd_int.c函数接口

usbd_int.c主要处理底层中断,不同USB外设,此部分会根据外设不同而有所改变。AT32系列芯片USB外设存在USBFS和OTGFS两种外设,此部分函数接口基本相同。

表3. usbd_int函数接口

usbd_core.c函数接口

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

表4. usbd_core函数接口

usbd_sdr.c函数接口

usbd_sdr.c此文件处理USB一些标准请求。

表5. usbd_sdr函数接口


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

表6. 标准设备请求

usbd_xx_class.c函数接口

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

函数结构体如下:

表7. 设备class函数结构体

表8. 设备class函数接口

usbd_xx_desc.c函数接口

usbd_xx_desc.c此文件为设备描述文件,设备描述信息都通过此文件的函数接口返回给主机。

表9. 设备描述函数结构体

表10. 设备描述接口函数

其它参数函数的参数结构体如下,USB设备库中参数传递使用结构体usbd_core_type,如下图:

图4. 全局结构体

USB设备的连接状态如下图:连接状态包含:

  • 默认状态

  • 地址状态

  • 配置状态

  • 挂起状态

可使用usbd_connect_state_get函数查询当前USB设备的连接状态。

图5. USB设备连接状态

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

图6. 函数返回值

端点FIFO分配

USB要正常收发数据,在初始化时需要为每个端点分配发送/接收的FIFO,FIFO的大小可以根据端点上传输的最大包长度确认。注意,分配给所有端点FIFO大小的和不能超过系统分配给USB缓冲区的最大长度,具体USB的缓冲区大小参考RM上的描述。开


发者可以参考例程usb_conf.h为每个端点自定义分配FIFO。另外使用USBFS和OTGFS两种不同的外设时,usb_conf.h中对端点FIFO分配稍有不同。

USBFS外设端点FIFO分配

USBFS外设端点分配实现了两种分配方式,一种自动分配,一种是用户自定义分配。

  • 自动分配:

1. 通过打开usb_conf.h中USB_EPT_AUTO_MALLOC_BUFFER宏开启自动分配功能

2. 在调用打开端点函数(usbd_ept_open)时自动根据传入的最大包长度自动分配FIFO

3. 如果使用双缓冲模式(同步端点,双缓冲Bulk)时,在打开端点前先调用(usbd_ept_dbuffer_enable)表示使用双缓冲模式,可参考audio例程。

4. 自动分配audio例程配置如下:

usb_conf.h

audio_class.c:端点打开

自定义分配:

1. 关闭usb_conf.h中USB_EPT_AUTO_MALLOC_BUFFER宏开启自定义分配

2. 在调用打开端点函数(usbd_ept_open)时调用usbd_ept_buf_custom_define函数自定义为端点分配FIFO,参考vcp_loopback例程。

3. vcp_loopback例程自定义分配配置usb_conf.h:

cdc_class.c端点打开:

OTGFS外设端点FIFO分配

OTGFS对于端点的接收缓冲是共享的,因此对于所有的OUT端点,只需要分配一个接收FIFO。对发送缓冲区则需要为每个发送端点分配一块自己专用的FIFO。支持的端点个数请参考对应型号的RM。OTGFS的端点分配都需要开发者根据端点支持的最大包长度进行分配,注意usb_conf.h中对端点分配的FIFO大小单位为word(Byte)。

以vcp_loopback例程为例:

USB设备初始化

在使用USB时,需要对USB的寄存器做一些基本的初始化,通过调用USB的初始化函数完成这部分的操作,对于外设USBFS和OTGFS在初始化时所调用的函数一定的区别。


USBFS外设初始化USBFS初始化

函数usbd_core_init包含5个参数:

例程vcp_loopback的初始化如下:

usbd_core_init(&usb_core_dev, USB, &class_handler, &desc_handler, 0);

OTGFS外设初始化

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

例程vcp_loopback的初始化如下:

USB设备中断处理

USB中断入口函数usbd_irq_handler处理所有USB中断,包括Reset,端点收发数据,SOF,挂起,唤醒等中断,下面介绍一些典型的中断处理。

图7. USB中断处理函数

Reset中断处理

当USB设备在总线上检测到Reset信号时,将产生Reset中断。软件在收到Reset中断时,需要做基本的初始化,用于后面的枚举处理。


Reset中断处理函数usbd_reset_handler:

  • 端点FIFO初始化

  • 设备地址设置为0

  • 端点0初始化

  • 调用设备类的事件函数udev->class_handler->event_handler(udev, USBD_RESET_EVENT);


端点中断处理

当USB端点收发数据完成时,将产生对应的端点完成中断,端点完成中断处理发送和接收的数据。

中断处理函数:usbd_xeptx_handler


SOF中断处理

打开SOF中断之后,USB设备在每收到一个主机发送的SOF就会产生SOF中断。

中断处理函数:usbd_sof_handler

  • 中断处理函数会调用设备类的SOF处理函数udev->class_handler->sof_handler(udev);


Suspend中断处理

当总线满足挂起条件时,USB设备会产生一个挂起中断,开发者可根据此中断判断是否需要进入低功耗模式。

中断处理函数:usbd_suspend_handler

  • 连接状态设置为挂起状态

  • 设置设备进入挂起状态

  • 调用设备类的事件处理函数udev->class_handler->event_handler(udev, USBD_SUSPEND_EVENT);


Wakeup中断处理

当设备在挂起状态时,如果总线上有wakeup信号,USB设备将产生wakeup中断。

中断处理函数:usbd_wakeup_handler

  • 设备退出挂起状态

  • 连接状态设置为进入挂起之前的状态

  • 调用设备类事件处理函数udev->class_handler->event_handler(udev, USBD_WAKEUP_EVENT);


USB设备端点数据处理流程

USB设备在收到主机发送的数据包之后,对应端点0的数据(IN/OUT/SETUP)会做单独处理,其它端点的数据会调用设备类的IN/OUT handler进行数据处理。

如下图所示数据的处理过程:

图8. 端点数据处理流程

图9. Setup处理流程

USB控制端点枚举流程

当设备接到主机之后,通过控制端点(端点0)进行枚举动作,典型的枚举流程图如下:

图10. USB枚举流程

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

图11 Get Descriptor

如下是USB库处理上图Get Descriptor的流程:

图12. USB库处理Get Descriptor调用流程

USB设备请求格式(Setup请求)

图13. Setup请求格式

USB应用端点处理流程应用端点指客户实际应用使用到的非0端点,包括Bulk,interrupt,ISO等端点类型,这些端点的数据通回调函数in_handler和out_handler进行处理。开发者只需要在xxx_class.c中class_in_handler和class_out_handler里面实现具体端点的数据处理即可。

IN端点数据处理:

图14. IN端点数据处理

OUT端点数据处理:

图15. OUT端点数据处理

USB设备类型例程

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

  • Audio

  • custom_hid

  • keyboard

  • mouse

  • msc(mass strorage)

  • printer

  • vcp_loopback

  • virtual_msc_iap

  • composite_vcp_keyboard

  • hid_iap


Audio例程

Audio例程使用audio V1.0的协议实现一个Speaker和Microphone,传输Audio数据使用同步传输,Speaker使用同步OUT传输,Microphone使用同步IN传输。


Audio的例程运行在AT-START评估板上,Audio Speaker和Mircophone是基于Audio Arduino Demo Board进行实现,实验过程中需要连接AT-START和Audio Arduino Board,更多开发板信息请参考《UM_Audio Arduino Daughter Board_V1.0/V2.0》,Audio协议请参数《Universal Serial Bus Device Class Define for Audio Device V1.0》。


实现功能

实现一个Speaker和Microphone的Audio复合设备,可以同时进行音频播放和录音。

Speaker功能:

  • 支持16K,48K采样率

  • 支持采样率切换

  • 支持16bit采样

  • 支持静音

  • 支持音量调节

  • 支持feedback功能

  • 支持双通道

Microphone功能:

  • 支持16K,48K采样率

  • 支持采样率切换

  • 支持16bit采样

  • 支持静音

  • 支持音量调节

  • 支持双通道


外设资源使用

USB外设:

  • 端点0 IN/OUT:用于USB枚举以及Audio部分控制。

  • 端点1 IN:用于Microphone录音数据

  • 端点1 OUT:用于Speaker播放数据

  • 端点2 IN:用于Feedback数据

I2C:

  • 使用I2C发送控制信息到音频Board

I2S:

  • 使用I2S1发送数据到音频board(speaker)

  • 使用I2S2从音频board接收数据(microphone)

DMA:

  • 使用DMA1通道3传输I2S1的数据

  • 使用DMA1通道4传输I2S2的数据

TIMER:

  • 使用TIMER产生Codec所需要的时钟


Audio设备实现

USB Audio设备类实现源文件在audio_class.c和audio_desc.c中,外部codec的控制以及音频数据的处理都在audio_codec.c中实现,根据主机的请求设置会调用到audio_codec.c中具体的设置函数。另外需要特别注意关于USB设备端点FIFO大小的分配在usb_conf.h中配置,此部分根据具体端点传输的最大包长度进行分配。


1、设备描述:(audio_desc.c/h)

  • Audio设备的描述(g_usbd_descriptor)

  • Audio设备的配置描述信息(g_usbd_configuration)AC interface Mricrophone Streaming interface Microphone Terminal INPUT/OUTPUT Microphone Feature Unit Microphone Endpoint Speaker Streaming interface Speaker Terminal INPUT/OUTPUT Speaker Feature Unit Speaker Endpoint Feedback Endpoint

  • Lang id (g_string_lang_id)

  • 序列号(g_string_serial)

  • 厂商产品ID(audio_desc.h)

  • 制造商、产品名、配置描述、接口描述(audio_desc.h)


2、数据处理部分(audio_class.c/h audio_codec.c/h)

  • 端点初始化(class_init_handler)

  • 端点清除(class_clear_handler)

  • Audio控制请求(class_setup_handler)实现如下audio控制请求:


  • Audio音量、静音、采样率设置(class_ept0_rx_handler)此函数用于接收完主机发送的设置数据之后进行处理,包括设置音量,静音,以及采样率的设置。

  • Microphone和Feedback数据传输(class_in_handler)

  • Speaker数据接收(class_out_handler)

  • audio_codec.c中实现codec具体的控制以及数据处理,需要实现如下函数:

以上函数可根据例程里的方式进行实现,也可以根据开发者实际使用的codec来进行修改,对于codec的初始化部分,在这里将不再讲述。

  • audio例程功能配置audio_conf.h中可以对当前audio例程进行配置,例如:是否需要speaker功能,支持采样率等,有如下选项配置:


如何根据Audio例程进行开发

本章将简单描述如何修改audio例程的代码来进行开发,根据应用具体的需求来修改代码。

  • 根据功能需求修改audio配置(audio_conf.h)

  • 根据功能需求修改设备描述信息(audio_desc.c, audio_desc.h)设备描述信息(g_usbd_descriptor)设备配置描述信息(g_usbd_configuration)其它描述

  • 根据功能修改要使用端点(audio_class.c, audio_class.h)端点定义(audio_class.h)端点初始化(class_init_handler,class_clear_handler)

  • 修改使用的Audio控制请求 控制请求修改(class_setup_handler)控制请求设置处理(class_ept0_rx_handler)

  • Audio数据处理修改IN数据处理(class_in_handler)OUT数据处理(class_out_handler)

  • 根据需求修改端点FIFO大小分配(usb_conf.h)

  • 根据具体需求实现codec函数接口(audio_codec.c)


custom_hid例程

custom_hid实现一个HID(human interface device)功能,与上位机(Artery_UsbHid_Demo)通信完成一些简单的交互操作,HID使用中断传输与上位机通信,例程在AT-START开发板上运行,上位机可在官网下载,关于HID协议参考《Human Interface Devices (HID) V1.11》。

实现功能

  • 上位机显示按键状态

  • 通过上位机控制开发板LED等开关状态

  • HID数据回环功能


外设资源使用

USB外设:

  • 端点0 IN/OUT:用于USB枚举

  • 端点1 IN:用于数据发送

  • 端点1 OUT:用于数据接收


custom_hid设备实现

custom_hid设备类实现源代码主要在custom_hid_class.c和custom_hid_desc.c中,这两个源文件实现了对设备的描述和设备的处理。
1、设备描述:(custom_hid_desc.c/h)

  • custom hid设备描述(g_usbd_descriptor)

  • custom hid设备配置描述(g_usbd_configuration)HID interface HID Endpoint

  • custom hid report描述(g_usbd_hid_report)HID_REPORT_ID_2(LED2) HID_REPORT_ID_3(LED3)HID_REPORT_ID_4(LED4)HID_REPORT_ID_5(BUTTON)HID_REPORT_ID_6(LOOPBACK DATA)

  • Lang id(g_string_lang_id)

  • 序列号(g_string_serial)

  • 厂商产品ID(custom_hid_desc.h

制造商、产品名、配置描述、接口描述(custom_hid_desc.h)

2. 数据处理部分(custom_hid_class.c/h)

  • 端点初始化(class_init_handler)

  • 端点清除(class_clear_handler)

  • HID设备类请求(class_setup_handler)实现如下请求:

SET_PROTOCOLGET_PROTOCOLSET_IDLEGET_IDLESET_REPORT代码如下:

Custom_HID发送数据

Custom_HID接收数据

数据处理

如何根据custom hid例程进行开发

本章将简单描述如何修改custom_hid例程的代码来进行开发,根据应用具体的需求来修改代码。

·根据功能需求修改设备描述信息(custom_hid_desc.c, custom_hid_desc.h)设备描述信息(g_usbd_descriptor)设备配置描述信息(g_usbd_configuration)设备报告描述符(g_usbd_hid_report)其它描述

·根据功能修改要使用端点(custom_hid_class.c, custom_hid_class.h)端点定义(custom_hid_class.h)端点初始化(class_init_handler,class_clear_handler)

·修改使用的custom_hid控制请求控制请求修改(class_setup_handler)控制请求设置处理(class_ept0_rx_handler)

·custom_hid发送接收数据处理修改IN数据处理(class_in_handler)OUT数据处理(class_out_handler)

·根据需求修改端点FIFO大小分配(usb_conf.h)

·修改数据处理部分


keyboard例程

keyboard实现一个键盘功能,使用中断传输与上位机通信,例程在AT-START开发板上运行,通过按键发送字符串到主机。
实现功能:通过按键发送字符串(”Keyboard Demo”)到主机


外设资源使用

·USB外设:端点0 IN/OUT:用于USB枚举

·端点1 IN:用于数据发送


keyboard设备实现keyboard设备类实现源代码主要在keyboard_class.c和keyboard_desc.c中,这两个源文件实现了对设备的描述和设备的处理。
1. 设备描述:(keyboard_desc.c/h)

·keyboard设备描述(g_usbd_descriptor)

·keyboard设备配置描述(g_usbd_configuration)

·keyboard interface

·keyboard endpoint

·keyboard report描述(g_usbd_hid_report)

·Lang id(g_string_lang_id)

·序列号(g_string_serial)

·厂商产品ID(keyboard_desc.h)

·制造商、产品名、配置描述、接口描述(keyboard_desc.h)

2. 数据处理部分(keyboard_class.c/h)

·端点初始化(class_init_handler)

·端点清除(class_clear_handler)

·HID设备类请求(class_setup_handler)实现如下请求:

SET_PROTOCOLGET_PROTOCOLSET_IDLEGET_IDLESET_REPORT

·keyboard发送数据

·keyboard字符数据处理

如何根据keyboard例程进行开发

本章将简单描述如何修改keyboard例程的代码来进行开发,根据应用具体的需求来修改代码。

·根据功能需求修改设备描述信息(keyboard_desc.c, keyboard_desc.h)设备描述信息(g_usbd_descriptor)设备配置描述信息(g_usbd_configuration)设备报告描述符(g_usbd_hid_report)其它描述

·根据功能修改要使用端点(keyboard_class.c, keyboard_class.h)端点定义(keyboard_class.h)端点初始化(class_init_handler,class_clear_handler)

·修改使用的keyboard控制请求控制请求修改(class_setup_handler)控制请求设置处理(class_ept0_rx_handler)

·keyboard发送接收数据处理修改IN数据处理(class_in_handler)OUT数据处理(class_out_handler)

·根据需求修改端点FIFO大小分配(usb_conf.h)

·修改数据处理部分


Mouse例程

实现功能

mouse实现一个简单的鼠标功能,使用中断传输与上位机通信,例程在AT-START开发板上运行,通过开发板上的按键发送鼠标右键功能。

图16. 鼠标传输格式

鼠标d通常是通过设置X和Y值来控制PC鼠标移动。


外设资源使用

USB外设:

·端点0 IN/OUT:用于USB枚举

·端点1 IN:用于数据发送


mouse设备实现mouse设备实现源代码主要在mouse_class.c和mouse_desc.c中,这两个源文件实现了对设备的描述和设备的处理。
1. 设备描述:(mouse_desc.c/h)

·mouse设备描述(g_usbd_descriptor)

·mouse设备配置描述(g_usbd_configuration)

·mouseinterface

·mouseendpoint

·mouse report描述(g_usbd_hid_report)

·Lang id(g_string_lang_id)

·序列号(g_string_serial)

·厂商产品ID(mouse_desc.h)

·制造商、产品名、配置描述、接口描述(keyboard_desc.h)

2. 数据处理部分(mouse_class.c/h)

·端点初始化(class_init_handler)

·端点清除(class_clear_handler)

·HID设备类请求(class_setup_handler)实现如下请求:

SET_PROTOCOLGET_PROTOCOLSET_IDLEGET_IDLESET_REPORT

keyboard发送数据

mouse数据处理

如何根据mouse例程进行开发

本章将简单描述如何修改mouse例程的代码来进行开发,根据应用具体的需求来修改代码。

·根据功能需求修改设备描述信息(mouse_desc.c, mouse_desc.h)设备描述信息(g_usbd_descriptor设备配置描述信息(g_usbd_configuration)设备报告描述符(g_usbd_hid_report)其它描述

·根据功能修改要使用端点(mouse_class.c, mouse_class.h)端点定义(mouse_class.h)端点初始化(class_init_handler,class_clear_handler)

·修改使用的mouse控制请求控制请求修改(class_setup_handler)控制请求设置处理(class_ept0_rx_handler)

·mouse发送接收数据处理修改IN数据处理(class_in_handler)OUT数据处理(class_out_handler)

·根据需求修改端点FIFO大小分配(usb_conf.h)

·修改数据处理部分


msc例程

msc(mass storage)例程展示如何通过USB BULK传输,进行PC主机和AT-START通信,该例程支持BOT(Bulk only transfer)协议和SCSI(small computer system interface)指令。

图17. BOT 命令/数据/状态 流程

图18. BOT命令格式

图19. BOT状态格式

实现功能

·将内部FLASH虚拟成一个磁盘

·实现bulk-only传输协议

·实现subclass SCSI传输命令

MSC_CMD_INQUIRYMSC_CMD_START_STOPMSC_CMD_MODE_SENSE6MSC_CMD_MODE_SENSE10MSC_CMD_ALLOW_MEDIUM_REMOVALMSC_CMD_READ_10MSC_CMD_READ_CAPACITYMSC_CMD_REQUEST_SENSEMSC_CMD_TEST_UNITMSC_CMD_VERIFYMSC_CMD_WRITE_10MSC_CMD_READ_FORMAT_CAPACITY


外设资源使用

USB外设:

·端点0 IN/OUT:用于USB枚举

·端点1 IN:用于数据发送


msc设备实现

1. 设备描述:(mouse_desc.c/h)

·msc设备描述(g_usbd_descriptor)

·msc设备配置描述(g_usbd_configuration)msc interfacemsc endpoint

·Lang id(g_string_lang_id)

·序列号(g_string_serial)

·厂商产品ID(custom_hid_desc.h)

制造商、产品名、配置描述、接口描述(msc_desc.h)

2. 数据处理部分(msc_class.c/h)

·端点初始化(class_init_handler)

·端点清除(class_clear_handler)

·MSC设备请求(class_setup_handler)GET_MAX_LUN    BO_RESET代码如下:

·IN传输处理

·OUT传输处理(接收数据)

3. BOT和SCSI命令处理

Bulk-only transfer和SCSI的命令处理在库文件msc_bot_scsi.c/h中。

表11. msc_bot_scsi函数列表

4. diskio处理

此部分主要处理与存储设备间接口,例程里面以内部flash的存储控制作为说明,msc_diskio.c/h根据开发者使用存储不同,只需要实现对应存储的读写函数即可。

表12. inquiry描述

表13 diskio操作函数

如何根据msc例程进行开发

本章将简单描述如何修改msc例程的代码来进行开发,根据应用具体的需求来修改代码。

·根据功能需求修改设备描述信息(msc_desc.c, msc_desc.h)设备描述信息(g_usbd_descriptor)设备配置描述信息(g_usbd_configuration)其它描述

·根据功能修改要使用端点(msc_class.c, msc_class.h)端点定义(msc_class.h)端点初始化(class_init_handler,class_clear_handler)

·修改使用的msc控制请求控制请求修改(class_setup_handler)控制请求设置处理(class_ept0_rx_handler)

·msc发送接收数据处理修改IN数据处理(class_in_handler)OUT数据处理(class_out_handler)

·根据需求修改端点FIFO大小分配(usb_conf.h)

·修改diskio部分,实现表13里面的函数(msc_diskio.c/h)


printer例程

Printer例程展示了使用USB Device作为打印机设备,此demo可在PC端识别到一个打印机设备并且可应答PC端发送的关于printer类的状态请求命令(例如打印机的有纸/无纸状态)

实现功能:

实现一个打印机设备


外设资源使用USB外设:

·端点0 IN/OUT:用于USB枚举

·端点1 IN:用于数据发送

·端点1 OUT:用于数据接收


printer设备实现

1. 设备描述(printer_desc.c/h)

·printer设备描述(g_usbd_descriptor)

·printer设备配置描述(g_usbd_configuration)printer interfaceprinter endpoint

·Lang id(g_string_lang_id)

·序列号(g_string_serial)

·厂商产品ID(custom_hid_desc.h)

制造商、产品名、配置描述、接口描述(msc_desc.h)


2. 数据处理(printer_class.c/h)

·端点初始化(class_init_handler)

·端点清除(class_clear_handler)

·printer设备请求(class_setup_handler)GET_DEVICE_IDPORT_STATUSSOFT_RESET代码如下:

·IN传输处理

·OUT传输处理(接收数据)


如何根据printer例程进行开发

本章将简单描述如何修改printer例程的代码来进行开发,根据应用具体的需求来修改代码。

·根据功能需求修改设备描述信息(printer_desc.c, printer_desc.h)设备描述信息(g_usbd_descriptor)设备配置描述信息(g_usbd_configuration)其它描述

·根据功能修改要使用端点(printer_class.c, printer_class.h)端点定义(printer_class.h)端点初始化(class_init_handler,class_clear_handler)

·修改使用的printer控制请求控制请求修改(class_setup_handler)控制请求设置处理(class_ept0_rx_handler)

·printer发送接收数据处理修改IN数据处理(class_in_handler)OUT数据处理(class_out_handler)

·根据需求修改端点FIFO大小分配(usb_conf.h)


vcp loopback例程

在现代PC中,USB是和绝大部分外设通信的标准接口。尽管如此,大部分的工业软件依旧使用COM接口(UART)通信。vcp_loopback例程提供使用USB设备模拟COM接口方法,解决了该问题, vcp_loopback例程展示了如何通过CDC协议进行USB数据收发。改例程需要使用虚拟串口驱动,可在官网下载。

实现功能:

实现一个虚拟串口


外设资源使用USB外设:

·端点0 IN/OUT:用于USB枚举

·端点1 IN:用于数据发送

·端点1 OUT:用于数据接收

·端点2 IN:监控中断传输


vcp_loopback设备实现

1. 设备描述(cdc_desc.c/h)

·cdc设备描述(g_usbd_descriptor)

·cdc设备配置描述(g_usbd_configuration)cdc interfacecdc endpoint

·Lang id(g_string_lang_id)

·序列号(g_string_serial)

·厂商产品ID(custom_hid_desc.h)

制造商、产品名、配置描述、接口描述(msc_desc.h)

2. 数据处理(cdc_class.c/h)

·端点初始化(class_init_handler)

·端点清除(class_clear_handler)

·cdc设备请求(class_setup_handler)SET_LINE_CODINGGET_LINE_CODING代码如下:

·IN传输处理

·OUT传输处理(接收数据)

如何根据vcp_loopback例程进行开发

本章将简单描述如何修改cdc例程的代码来进行开发,根据应用具体的需求来修改代码。

·根据功能需求修改设备描述信息(cdc_desc.c, cdc_desc.h)设备描述信息(g_usbd_descriptor)设备配置描述信息(g_usbd_configuration)其它描述

·根据功能修改要使用端点(cdc_class.c, cdc_class.h)端点定义(cdc_class.h)端点初始化(class_init_handler,class_clear_handler)

·修改使用的cdc控制请求控制请求修改(class_setup_handler)控制请求设置处理(class_ept0_rx_handler)

·cdc发送接收数据处理修改IN数据处理(class_in_handler)OUT数据处理(class_out_handler)

·根据需求修改端点FIFO大小分配(usb_conf.h)


virtual_msc_iap例程

virtual msc iap实现一个升级功能的设备,不依赖上位机,当接入PC之后,通过将固件拷贝到磁盘以达到升级目的。


实现功能

·将flash虚拟成磁盘进行升级

·Iap保留使用20K byte空间

·升级完成之后reset usb设备返回升级状态

·支持下载地址设置

·支持升级完成之后跳转到APP运行

·支持bin文件升级


外设资源使用USB外设:

·端点0 IN/OUT:用于USB枚举

·端点1 IN:用于数据发送

·端点1 OUT:用于数据接收


virtual_msc_iap设备实现

1. 设备描述(msc_desc.c/h)参考3.5.3.1
2. 数据处理部分(msc_class.c/h)参考3.5.3.2
3. BOT和SCSI命令处理参考3.5.3.3
4. diskio处理参考3.5.3.4
5. flash升级部分(flash_fat16.c/h)

·升级状态

当连接Host之后,在响应磁盘上通过TXT文档显示当前状态准备升级状态(Ready.TXT)升级成功(Success.TXT)升级失败(Failed.TXT)未知文件或错误(Unkonwn.TXT)升级文件大于FLASH大小(Large.TXT)

·FAT16分区表描述

·升级接口函数

如何根据virtual_msc_iap例程进行开发

本章将简单描述如何修改virtual_msc_iap例程的代码来进行开发,根据应用具体的需求来修改代码。

·根据功能需求修改设备描述信息(msc_desc.c, msc_desc.h)设备描述信息(g_usbd_descriptor)设备配置描述信息(g_usbd_configuration)其它描述

·根据功能修改要使用端点(msc_class.c, msc_class.h)端点定义(msc_class.h)端点初始化(class_init_handler,class_clear_handler)

·修改使用的msc控制请求控制请求修改(class_setup_handler)控制请求设置处理(class_ept0_rx_handler)

·msc发送接收数据处理修改IN数据处理(class_in_handler)OUT数据处理(class_out_handler)

·根据需求修改端点FIFO大小分配(usb_conf.h)

·修改diskio部分,实现表13里面的函数(msc_diskio.c/h)

·修改flash_fat16.c/h升级参数,包括APP起始地址,IAP占用空间等,要保证IAP和APP地址不重合。


composive_vcp_keyboard例程

复合设备定义如下:拥有多个相互独立接口的设备被称为复合设备。当使用该设备时,该设备上拥有多个组合的功能。例如,Composite vcp keyboard demo 提供的复合设备包含HID和CDC功能(键盘和串口通信)
实现功能

·实现一个USB虚拟串口(参考3.7)

·实现一个USB键盘设备(参考3.3)


外设资源使用USB外设:

·端点0 IN/OUT:用于USB枚举

·端点1 IN:用于数据发送端点1 OUT:用于数据接收

·端点2 IN:CDC命令中断传输

·端点3 IN:Keyboard发送数据


composite_vcp_keyboard设备实现

  1. 设备描述(cdc_keyboard_desc.c/h)

    ·cdc_keyboard设备描述(g_usbd_descriptor)

    ·cdc_keyboard设备配置描述(g_usbd_configuration)cdc interfacecdc endpointkeyboard interfacekeyboard endpoint

    ·Lang id(g_string_lang_id)

    ·序列号(g_string_serial)

    ·厂商产品ID(custom_hid_desc.h)


    ·制造商、产品名、配置描述、接口描述(msc_desc.h)


2. 数据处理(cdc_keyboard_class.c/h)
·端点初始化(class_init_handler)

·端点清除(class_clear_handler)

·设备请求(class_setup_handler)cdc设备类请求:SET_LINE_CODINGGET_LINE_CODIN

Keyboard hid设备类请求:SET_PROTOCOLGET_PROTOCOLSET_IDLEGET_IDLESET_REPORT代码如下:

·IN传输处理

·OUT传输处理(接收数据)

如何根据composite_vcp_keyboard例程进行开发

本章将简单描述如何修改composite_vcp_keyboard例程的代码来进行复合设备开发,根据应用具体的需求来修改代码。

·根据功能需求修改设备描述信息(cdc_keyboard_desc.c, cdc_keyboard_desc.h)设备描述信息(g_usbd_descriptor)设备配置描述信息(g_usbd_configuration)其它描述

·根据功能修改要使用端点(cdc_keyboard_class.c, cdc_keyboard_class.h)端点定义(cdc_class.h)端点初始化(class_init_handler,class_clear_handler)

·修改使用的cdc控制请求控制请求修改(class_setup_handler)控制请求设置处理(class_ept0_rx_handler)

·cdc_keyboard发送接收数据处理修改IN数据处理(class_in_handler)OUT数据处理(class_out_handler)

·根据需求修改端点FIFO大小分配(usb_conf.h)


hid_iap例程

hid_iap例程使用usb hid实现IAP升级功能,需要搭配上位机使用,上位机可在官网下载IAP_Programmer。hid iap的例程代码位于BSP固件库utilities\at32f435_437_usb_iap_demo中,使用方法可参考《AN0007_AT32_IAP_using_the_USB_HID_ZH_V2.x.x.pdf》

1、实现功能实现使用HID进行设备升级


2、外设资源

·使用USB 外设:

·端点0 IN/OUT:用于USB枚举

·端点1 IN:用于数据发送

·端点1 OUT:用于数据接收


hid_iap设备实现

1.设备描述(hid_iap_desc.c/h)

·hid iap设备描述(g_usbd_descriptor)

·hid iap设备配置描述(g_usbd_configuration)HID interfaceHID Endpoint

·hid iap report描述(g_usbd_hid_report)

·Lang id(g_string_lang_id)

·序列号(g_string_serial)

·厂商产品ID(hid_iap_desc.h)

制造商、产品名、配置描述、接口描述(hid_iap_desc.h)

2. 数据处理(hid_iap_class.c/h)

·端点初始化(class_init_handler)

·端点清除(class_clear_handler)

HID设备类请求(class_setup_handler)实现如下请求:SET_PROTOCOLGET_PROTOCOLSET_IDLEGET_IDLESET_REPORT代码如下:

·hid iap发送数据

·hid iap接收数据

·升级命令数据处理

3. hid iap升级协议

表14. hid iap升级命令

0x5AA0进入IAP模式

作为一个特定的命令,当用户APP收到这个命令之后将进入IAP模式。实现方式为收到这个命令之后擦除flag然后reset

上位机:[0x5A, 0xA0]

IAP设备响应:[0x5A, 0XA0, ACK/NACK]

0x5AA1开始下载

上位机:[0x5A,0xA1]

IAP设备响应:[0x5A,0xA1,ACK/NACK]

0x5AA2设置下载地址

设置下载地址需按照1KB对齐,每下载1Kbyte数据之后,都需要重新设置下载地址。

上位机(命令+地址):[0x5A, 0xA2, 0x08, 0x00, 0x40, 0x00]

IAP设备响应:[0x5A,0xA2, ACK/NACK]

0x5AA3下载数据命令(1KB 对齐多个包发送)

下载数据命令采用命令+长度+数据的格式进行发送,每包最大数据量为60Byte(64–命令–长度),当发送数据达到1KB时,上位机需要等待设备的ACK响应。此时设备需将1KB的数据写到FLASH。

上位机(命令(2Byte)+长度(2 Byte)+数据(n byte)):[0x5A,0xA3,LEN1,LEN0,DATA0….DATAn]

收完1KB数据后IAP设备响应:[0x5A, 0XA3, ACK/NACK]

0x5AA4下载结束

上位机:[0x5A, 0xA4]

IAP设备响应:[0x5A, 0xA4, ACK/NACK]

0x5AA5固件CRC校验

上位机传输固件起始地址和固件大小/1KB(固件大小按1KB对齐,不足补0xFF),由IAP计算CRC之后返回给上位机。

上位机:[0x5A,0xA5, 0x08, 0x00, 0x40, 0x00, LEN1, LEN0]

IAP设备响应: [0x5A, 0xA5, ACK/NACK, CRC3, CRC2, CRC1, CRC0]

0x5AA6跳转命令

跳转命令将跳转到用户代码进行运行

上位机:[0x5A,0xA6, 0x08, 0x00, 0x40, 0x00]

IAP设备响应:[0x5A,0xA6,ACK/NACK]

0x5AA7获取IAP设置的app地址

返回IAP设置的app地址

上位机:[0x5A, 0xA7]

IAP设备响应:[0x5A, 0xA7, ACK/NACK, 0x08, 0x00, 0x40, 0x00]


如何根据hid_iap例程进行开发

本章将简单描述如何修改hid_iap例程的代码来进行开发,根据应用具体的需求来修改代码。

·根据功能需求修改设备描述信息(hid_iap_desc.c, hid_iap_desc.h)设备描述信息(g_usbd_descriptor)设备配置描述信息(g_usbd_configuration)其它描述

·根据功能修改要使用端点(hid_iap_class.c, hid_iap_class.h)端点定义(hid_iap_class.h)端点初始化(class_init_handler,class_clear_handler)

·修改使用的hid控制请求控制请求修改(class_setup_handler)控制请求设置处理(class_ept0_rx_handler)

·hid_iap发送接收数据处理修改IN数据处理(class_in_handler)OUT数据处理(class_out_handler)根据需求修改端点FIFO大小分配(usb_conf.h)

·修改hid_iap_user.h中的升级参数,包括APP起始地址等,IAP占用空间等,保证APP地址和IAP的地址不要重合。

授权代理商:世强先进(深圳)科技股份有限公司
技术资料,数据手册,3D模型库,原理图,PCB封装文件,选型指南来源平台:世强硬创平台www.sekorm.com
现货商城,价格查询,交期查询,订货,现货采购,在线购买,样品申请渠道:世强硬创平台电子商城www.sekorm.com/supply/
概念,方案,设计,选型,BOM优化,FAE技术支持,样品,加工定制,测试,量产供应服务提供:世强硬创平台www.sekorm.com
集成电路,电子元件,电子材料,电气自动化,电机,仪器全品类供应:世强硬创平台www.sekorm.com
  • +1 赞 0
  • 收藏
  • 评论 0

本文由ll转载自AT32 MCU 雅特力科技公众号,原文标题为:AT32讲堂046 | 雅特力AT32 MCU USB设备库的架构和使用方法,本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

评论

   |   

提交评论

全部评论(0

暂无评论

相关推荐

【经验】雅特力AT32F4系列 MCU Cortex M4内核入门指南:位带操作、硬件浮点运算单元、滴答时钟中断功能

AT32F4系列产品是基于Cortex™-M4F处理器架构,该处理器是一款低功耗处理器,具有低门数,低中断延迟和低成本调试的特点。支持包括DSP指令集与浮点运算功能,特别适合用于深度嵌入式应用程序需要快速中断响应功能。

设计经验    发布时间 : 2022-10-28

【经验】雅特力AT32 MCU CAN入门指南

CAN是Controller Area Network的缩写(以下称为CAN),它的设计目标是以最小的CPU负荷来高效处理大量的报文。本文介绍雅特力AT32 MCU CAN入门指南

设计经验    发布时间 : 2023-02-08

【经验】雅特力AT32 MCU如何使用OTA通过USART实现对固件的在线升级更新

雅特力AT32 MCU如何使用OTA通过USART对固体在线升级更新?OTA(空中下载技术)是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后便于通过预留的通信口,对产品中的固件程序进行更新升级。

设计经验    发布时间 : 2022-04-28

基于雅特力AT32 MCU的洗衣机电机控制驱动方案,解锁智能家居新体验

随着人工智能、物联网等技术的发展,传统家电逐渐向智能家电转型。洗衣机作为家庭生活中不可或缺的电器之一,其智能化升级对于提升生活品质具有重要意义。MCU作为电机控制系统的核心“大脑”,肩负着多样化的控制使命。雅特力AT32 MCU以其卓越的性能和完善的电机开发生态,为洗衣机、电动两轮车和电摩等电机应用产品提供高效电机控制驱动方案,并已实现规模量产。

应用方案    发布时间 : 2024-09-30

【经验】雅特力MCU AT32F421的时钟配置教程

时钟是芯片正确高效运行的基础,正确的时钟配置是芯片能正确运行的必要条件,其重要性不言而喻。AT32各系列产品的时钟配置部分可能存在细微的差异和需要注意的事项,本文就着重针对各系列的情况来详细介绍如何结合雅特力提供的V2.x.x的板级支持包(BSP)来配置时钟。

设计经验    发布时间 : 2023-06-10

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

AT32系列MCU内部都有提供适合运行的内部高速时钟(HICK),在25℃下,其典型值频率8MHz的精度由工厂校准到±1%,在-40到105℃,该内部高速时钟的精度达到±2.5%,可见精度会受到温度的影响。为了降低环境温度对精度造成的影响,用户可在运行时间隙调用校准程序来进行校准。

设计经验    发布时间 : 2024-09-29

【经验】 雅特力AT32 MCU Printf的功能使用方法

内容概述本文档主要介绍雅特力AT32 MCU在Keil和IAR两种工程环境下的printf功能使用方法。其共包含6种方法,各方法的具体用法在具体内容中描述。

设计经验    发布时间 : 2022-05-26

【经验】解析雅特力AT32系列MCU RTC入门指南

RTC计数逻辑位于电池供电域,内部为一个32位递增计数器,只要电池供电域有电,RTC便会一直运行,不受系统复位以及VDD掉电影响。本文雅特力将为大家介绍AT32系列MCU的RTC入门指南。

设计经验    发布时间 : 2023-04-25

AT32讲堂 | 雅特力AT32 MCU的随机数生成

本章介绍了使用软件触发方式触发ADC,配置普通信道和DMA。本篇应用笔记适用于AT32各系列MCU,只要有ADC外设皆可适用。

设计经验    发布时间 : 2024-09-29

【经验】如何使用雅特力MCU AT32F407的以太网通信接口实现在应用中编程?

在应用中编程(IAP)是一种在现场通过MCU通信接口(例如USART、USB、CAN和以太网)进行固件升级的方式。本文将介绍两种使用以太网通信外设在雅特力MCU AT32F407上实现IAP的解决方案。

设计经验    发布时间 : 2022-10-15

【经验】如何使用雅特力AT32 MCU主机库快速开发USB相关应用

本文主要介绍雅特力MCU AT32 USB主机库的结构和库的使用方法,AT32 USB支持全速和低速,不支持USB2.0高速设备。这里库的作用是用来管理USB外设和实现USB的基本协议,使开发者能够更快的上手开发。

设计经验    发布时间 : 2023-01-18

雅特力携多款AT32 MCU新品与应用方案亮相2024慕尼黑上海电子展

7月8日,2024慕尼黑上海电子展electronica China在上海新国际博览中心拉开序幕,作为全球电子行业的盛会,汇聚了国内外众多优质电子企业。雅特力携高性能AT32 MCU与应用方案齐亮相,呈现了多款电机控制、工业控制、汽车电子、智能家居、消费、商务,及新能源等应用方案。现场人流攒动、氛围热烈!

原厂动态    发布时间 : 2024-07-17

【经验】如何提高AT32 MCU ADC转换精度?

ADC精度不仅取决于ADC性能和功能,还取决于ADC周围的整体应用设计。雅特力此应用笔记旨在帮助用户如何设置正确软、硬件使ADC达到准确的量测,也提供相关应用上的注意事项。

设计经验    发布时间 : 2022-10-30

【经验】雅特力AT32 MCU如何灵活使用DMA弹性映射请求?

在使用雅特力部分系列MCU时,可以使用DMA弹性映射功能。此功能使得DMA的通道配置更加灵活,可以将某外设的DMA请求通道指定到DMA1或者DMA2共14个通道中的任意一个通道。本文将介绍如何使用DMA弹性映射请求,从而使得DMA传输变得更加灵活多变。

设计经验    发布时间 : 2022-05-21

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

如何在雅特力AT32 MCU上创建IAP应用程序,文章概述了AT32 CAN IAP快速使用方法即使用CAN进行IAP升级,此示例使用PC上位软件(IAP_Programmer.exe)通过一个USB转CAN的桥接设备和目标板进行通信,IAP Demo和桥接设备默认CAN波特率使用500K。

设计经验    发布时间 : 2024-07-08

展开更多

电子商城

查看更多

品牌:雅特力

品类:32位通用MCU

价格:¥4.2360

现货: 23,058

品牌:雅特力

品类:32位MCU

价格:¥17.3130

现货: 11,929

品牌:雅特力

品类:32位MCU

价格:¥14.6240

现货: 8,734

品牌:雅特力

品类:32位MCU

价格:¥13.3420

现货: 8,628

品牌:雅特力

品类:32位MCU

价格:¥10.8480

现货: 6,906

品牌:雅特力

品类:32位MCU

价格:¥16.2950

现货: 5,771

品牌:雅特力

品类:32位MCU

价格:¥12.1770

现货: 4,875

品牌:雅特力

品类:32位MCU

价格:¥19.0120

现货: 2,536

品牌:雅特力

品类:32位MCU

价格:¥6.8360

现货: 2,523

品牌:雅特力

品类:32位MCU

价格:¥7.0480

现货: 1,760

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

现货市场

查看更多

品牌:RENESAS

品类:16-BIT MCU

价格:¥5.5190

现货:910,635

品牌:RENESAS

品类:MCU

价格:¥5.1500

现货:200,000

品牌:恒烁

品类:MCU

价格:¥1.0800

现货:154,600

品牌:Advanced Digital Chips

品类:MCU

价格:¥6.6000

现货:100,000

品牌:RENESAS

品类:MCU

价格:¥5.8041

现货:86,925

品牌:RENESAS

品类:32-BIT GENERAL MCU

价格:¥7.3800

现货:76,715

品牌:RENESAS

品类:32-BIT GENERAL MCU

价格:¥15.3000

现货:75,000

品牌:Advanced Digital Chips

品类:MCU

价格:¥9.0000

现货:64,841

品牌:ST

品类:MCU

价格:¥15.5600

现货:58,800

品牌:RENESAS

品类:32-BIT GENERAL MCU

价格:¥257.6400

现货:58,799

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

服务

查看更多

TFT LCD液晶显示屏/模组定制

可定制显示屏的尺寸0.96”~15.6”,分辨率80*160~3840*2160,TN/IPS视角,支持RGB、MCU、SPI、MIPI、LVDS、HDMI接口,配套定制玻璃、背光、FPCA/PCBA。

最小起订量: 1000 提交需求>

MCU烧录/Flash烧录/CPLD烧录

可烧录IC封装SOP/MSOP/SSOP/TSOP/TSSOP/PLCC/QFP/QFN/MLP/MLF/BGA/CSP/SOT/DFN;IC包装Tray/Tube/Tape;IC厂商不限,交期1-3天。支持IC测试(FT/SLT),管装、托盘装、卷带装包装转换,IC打印标记加工。

最小起订量: 1pcs 提交需求>

查看更多

授权代理品牌:接插件及结构件

查看更多

授权代理品牌:部件、组件及配件

查看更多

授权代理品牌:电源及模块

查看更多

授权代理品牌:电子材料

查看更多

授权代理品牌:仪器仪表及测试配组件

查看更多

授权代理品牌:电工工具及材料

查看更多

授权代理品牌:机械电子元件

查看更多

授权代理品牌:加工与定制

世强和原厂的技术专家将在一个工作日内解答,帮助您快速完成研发及采购。
我要提问

954668/400-830-1766(工作日 9:00-18:00)

service@sekorm.com

研发客服
商务客服
服务热线

联系我们

954668/400-830-1766(工作日 9:00-18:00)

service@sekorm.com

投诉与建议

E-mail:claim@sekorm.com

商务合作

E-mail:contact@sekorm.com

收藏
收藏当前页面