打印
[AT32F403/403A]

使用ST103的HAL USB库不能识别问题分析

[复制链接]
3602|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 tanmingjin 于 2020-7-8 18:06 编辑

问题描述:将ST103HAL USB程序库移植到AT32F403上运行,发现有时候不能正常识别USB设备。

分析的结果:在枚举阶段USB INOUT事件没有及时处理,程序中有其它中断,导致USBINOUT事件同时来,对于本来要先处理IN再处理OUT的情况,此时会变成先处理OUT,在处理IN,后处理IN的时候会将端点0的接收缓冲区配置为0,导致后续不能正常通信。

问题解决方法:在设置端点0接收缓冲区时加上判断,如果为0,就不需要配置,修改之后USB枚举正常

如下是分析过程:
ST103HAL USB程序库移植到AT32F403上运行,发现有时候不能正常识别USB设备。通过抓包来看,发现是有一个主机发的SETUP没有正常回复。
发现SETUP没有正常回复之后,首先查看了端点0的寄存器状态,端点状态都是正常的。然后查看端点0的接收缓冲区和发送缓冲区的配置,发现接收缓冲区大小被改成了0也就是此时端点0不能接收数据了。

如下是端点0缓冲区此时配置的值:

文档上的描述;


此时分析一下异常SETUP之前的USB 数据,有一个INOUT的传输。猜测会不会是此处INOUT的事件处理有问题,因为程序里面还有其它中断,可能会导致INOUT事件不能及时处理。
查看文档发现,此USB对应端点0IN事件和OUT时间是通过一个位来控制,表示传输向,如果INTX)和OUTRX)同时来时,应该会先处理OUT在处理IN,这样如果原本的事件的顺序是INOUT会不会就有问题了。

HAL USB这部分的代码处理过程,果然和前面分析一样,INOUT同时来时USB_ISTR_DIR等于1,会先处理OUT,再处理IN

IN事件的处理,发现代码里面会有两个地方会将端点0的接收缓冲区设置为0,此处将端点0的接收缓冲区设置为0之后,导致后续不能正常通信。



为了保证端点0接收缓冲区不被设置为0,在端点0设置接收长度的地方加上判断len=0


使用特权

评论回复
沙发
muyichuan2012| | 2020-7-8 18:49 | 只看该作者
感谢分享,许多用户也是撞倒USB这个问题,最后发现原来是ST  HAL库的一个bug。

使用特权

评论回复
板凳
tanmingjin|  楼主 | 2020-7-9 16:01 | 只看该作者
muyichuan2012 发表于 2020-7-8 18:49
感谢分享,许多用户也是撞倒USB这个问题,最后发现原来是ST  HAL库的一个bug。 ...

是的,不容易发现的问题

使用特权

评论回复
地板
084425| | 2020-7-9 23:15 | 只看该作者
ST hal确实有这个问题,帮顶

使用特权

评论回复
5
85639973| | 2021-11-9 16:52 | 只看该作者
雅特力自己的hal库,方便分享一份,qq:1060937785,谢谢

使用特权

评论回复
6
骑着蜗牛狂奔O| | 2021-11-9 18:59 | 只看该作者
85639973 发表于 2021-11-9 16:52
雅特力自己的hal库,方便分享一份,qq:1060937785,谢谢

雅特力是没有hal库的,只有标准库,可去官网下载

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

24

帖子

0

粉丝