450|1

20

帖子

0

TA的资源

一粒金砂(中级)

【极海APM32F407 Tiny Board】+2.浅跑个HS HID例程 [复制链接]

本帖最后由 superw 于 2023-6-5 10:17 编辑

本篇将在APM32F407 Tiny Board上跑一下官方SDK里面提供的设备端OTGD_HID_HS2例程,并对例程里面程序执行流程进行简要分析,后续将在该例程上修改,进一步实现一个HID+UAC功能的USB声卡设备。因为APM32F407 Tiny Board上默认预留出来的Type-A和Type-C口都是接到PB14、PB15引脚上,属于OTG HS的差分信号引脚,也可以外接USB接口到PA11、PA12上使用OTG FS差分信号引脚,对应SDK中例程是OTGD_HID、OTGD_HID_Keyboard,使用OTG FS全速接口。

image-20230605022645-1.png  

OTGD_HID_HS2例程模拟了一个高速HS HID鼠标,插入PC后,可在设备管理器下看到新增一个HID鼠标设备。对于main函数部分,首先需要注意的是USB_DeviceInit()函数,包括了对USB OTG HS外设寄存器配置,IO配置,设备描述符,配置描述符,字符串描述符,HID类回调函数的声明等等。

image-20230605022645-2.png

 

USB_DeviceInit()前面是一些老生常谈的用法,对APM32F407 Tiny Board板上串口1,按键外设进行初始化。而USB_DeviceInit()函数里面定义了该USB接口的速度USBD_SPEED_HS、该USB设备的描述符USBD_DESC_HS、该USB设备的HID类操作函数USBD_HID_CLASS、该USB设备当前状态(复位、挂起、连接等等)USB_DevUserHandler,最后将这些在USBD_Init中都赋值给gUsbDeviceHS。这里USB接口速度对于设备端device,可支持高速HS、全速FS;对于主机端host,可支持高速HS、全速FS、低速LS。

image-20230605022645-3.png  

image-20230605022645-4.png  

通过最后的USBD_HardwareInit初始化USB OTG HS硬件层寄存器、IO接口、开启USB中断等等。再之后对于一个USB设备最重要的过程:枚举,也就是控制传输阶段,主要在中断函数中进行。

image-20230605022645-5.png  

对于该中断服务函数USBD_OTG_IsrHandler,其每个中断代表的意思在注释和应用手册27.10.6高速OTG模块中断寄存器中有详细解释,这里不做过多讲解。枚举过程主要在USBD_OutEndpointIsrHandler中进行。

image-20230605022645-6.png  

USBD_OutEndpointIsrHandler通过判断当前端点0状态,进一步判断是否是控制传输阶段

image-20230605022645-7.png  

最后进入USBD_SetupStage函数中,通过recipient、reqType得到USB请求中的bmRequest字节,通过request获取USB请求中的bRequest字节,通过reqWvalue获取USB请求中的wValue值,该值占两个字节,低字节在前,高字节在后,通过reqWLength获取USB请求中的wLength值,也可以根据该方法获取USB请求中的wIndex值。

image-20230605022645-8.png  

下面则通过USB请求判断当前请求的接收者为设备、接口、端点等,当前USB请求属于标准请求、类请求、厂商自定义请求等,当前请求代码是获取描述符、设置地址、设置配置等等。具体实现过程可通过printf+USB分析仪双向验证分析,下面为该OTGD_HID_HS2例程通过USB口插到电脑上,并通过USB分析仪抓到的包。这里有个疑问,正常情况下,我复位芯片后,抓包上应该是复位,然后获取描述符请求,但是抓这个包复位后,跟了三条A3 00 00 00 02 00 04 00,23 01 14 00 02 00 00 00,A3 00 00 00 02 00 04 00请求,不太明白这里是什么原因。

image-20230605022645-9.png  

字符串描述符第一个对应序列号字符串描述符,第二个对应语言ID字符串描述符,第三个对应产品字符串描述符,这些描述符均与usbd_descriptor.c文件下所设置描述符一致。

image-20230605022645-10.png  

此部分设置完当前HID设备的配置值之后,获取HID描述符,与usbd_descriptor.c文件下所设置描述符一致。

至此,整个HID设备枚举过程结束。设备管理器下可看到多出一个HID 鼠标设备。

image-20230605022645-11.png  

测试系统为win11,系统识别出来的HID鼠标,其VID为314B,PID为03E9,均与程序中所设置一样。

image-20230605022645-12.png  

最后,关于应用层代码USB_DevUserApplication主要实现了一个通过板上两个按键控制鼠标左右移动的过程。其中涉及到报表描述符的上传过程,可自行根据USB官方协议文档并结合抓包过程学习。

image-20230605022645-13.png  

此为鼠标右移过程通过USB口上传给host的报表描述符。

image-20230605022645-14.png

此为鼠标左移过程通过USB口上传给host的报表描述符。

 

 

 

 

最新回复

USB用起来还是很方便的。这例程用起来非常方便吧。  详情 回复 发表于 2023-6-5 10:46

回复

4578

帖子

3

TA的资源

版主

USB用起来还是很方便的。这例程用起来非常方便吧。

回复
您需要登录后才可以回帖 登录 | 注册

相关帖子
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2023 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表