打印

今天又无聊了,看了一下ST的最新版本的USB外设库,貌似

[复制链接]
5198|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 Simon21ic 于 2013-6-10 17:56 编辑

貌似之前我提到的BUG还原封不动,经过一年多了,不确定有多少人理解这个BUG,那就公布这个BUG的原理吧。
原帖在这里:https://bbs.21ic.com/forum.php?mod=viewthread&tid=305774

首先,看一下USB endpoint寄存器的定义:


在看一下ST最新版本的库中的代码:
#define _ClearEP_CTR_RX(bEpNum)   (_SetENDPOINT(bEpNum,\
                                   _GetENDPOINT(bEpNum) & 0x7FFF & EPREG_MASK))
#define _ClearEP_CTR_TX(bEpNum)   (_SetENDPOINT(bEpNum,\
                                   _GetENDPOINT(bEpNum) & 0xFF7F & EPREG_MASK))

#define _SetENDPOINT(bEpNum,wRegValue)  (*(EP0REG + bEpNum)= \
    (uint16_t)wRegValue)
#define _GetENDPOINT(bEpNum)        ((uint16_t)(*(EP0REG + bEpNum)))

#define EPREG_MASK     (EP_CTR_RX|EP_SETUP|EP_T_FIELD|EP_KIND|EP_CTR_TX|EPADDR_FIELD)

拿_ClearEP_CTR_RX举例,按照代码,貌似这个宏的功能是清零CTR_RX位,并且需要把toggle的位清零(因为写1toggle)。
当然,第一个问题,wRegValue没有加括号,如果由于这个产生问题,相信你会相当郁闷,呵呵,不过,关键还不在这里。

关键问题在于,标准的“读-修改-写”的问题。
首先,会读取USB_EPnR寄存器,假定读取到的CTR_RX为1,CTR_TX为0。
之后处理后,调用_ClearEP_CTR_RX来清零CTR_RX位,貌似都很正常。
但是,如果之后把修改好的值写回USB_EPnR寄存器的时候,USB外设把CTR_TX置1了,那这个写操作会把CTR_TX也清零,并且实际数据都没有处理,现象就是TX端口死了,在USB中断不能及时得到相应的时候,这个问题会以一个比较小的概率出现,测试时间长的话,几乎肯定会碰到。

由于CTR_TX是写0清零,写1没有影响,那么实际的定义应该为:
#define _ClearEP_CTR_RX(bEpNum)   (_SetENDPOINT(bEpNum,\
                                   (_GetENDPOINT(bEpNum) & 0x7FFF & EPREG_MASK) | EP_CTR_TX))
评分
参与人数 2威望 +12 收起 理由
Ryanhsiung + 6 很给力!
dong_abc + 6 赞一个!
沙发
dong_abc| | 2013-6-10 02:22 | 只看该作者
没用过stm32的USB,了解一下!

使用特权

评论回复
板凳
jerry_wtl| | 2013-6-10 09:14 | 只看该作者
虽然没用到,但还是谢谢楼主提出来。

使用特权

评论回复
地板
IJK| | 2013-6-10 11:04 | 只看该作者
谢谢LZ分享。LZ看到过STM32F2/F4的USB库有类似的问题吗?

使用特权

评论回复
5
quyifei| | 2013-6-10 11:14 | 只看该作者
lz很仔细,赞一个!

不过看了半天,感觉lz说的是CTR_Rx的清除问题,而不是CTR_Tx的清除,所以应该是

#define _ClearEP_CTR_RX(bEpNum)   (_SetENDPOINT(bEpNum,\
                                   (_GetENDPOINT(bEpNum) & 0x7FFF & EPREG_MASK) | EP_CTR_RX))

使用特权

评论回复
6
h0610001210| | 2013-6-10 11:52 | 只看该作者
正打算用,MARK一下

使用特权

评论回复
7
Simon21ic|  楼主 | 2013-6-10 12:01 | 只看该作者
quyifei 发表于 2013-6-10 11:14
lz很仔细,赞一个!

不过看了半天,感觉lz说的是CTR_Rx的清除问题,而不是CTR_Tx的清除,所以应该是

呵呵,那你也仔细一点吧

使用特权

评论回复
8
Simon21ic|  楼主 | 2013-6-10 12:02 | 只看该作者
IJK 发表于 2013-6-10 11:04
谢谢LZ分享。LZ看到过STM32F2/F4的USB库有类似的问题吗?

没用过F4,之后可能会用,不过肯定不会用ST的库了,所以估计没机会看了

使用特权

评论回复
9
quyifei| | 2013-6-10 13:10 | 只看该作者
Simon21ic 发表于 2013-6-10 12:02
没用过F4,之后可能会用,不过肯定不会用ST的库了,所以估计没机会看了

lz会用谁的库呢?

使用特权

评论回复
10
Jsilcon| | 2013-6-10 17:16 | 只看该作者
mark一下,谢谢分享。

使用特权

评论回复
11
zeluo| | 2013-6-10 19:29 | 只看该作者
顶一个  谢谢楼主的共享资料   谢谢   有时间这一块     需要好好看看  谢谢

使用特权

评论回复
12
mxh0506| | 2013-6-10 20:26 | 只看该作者
收藏了,多谢分享!

使用特权

评论回复
13
yunianxuan| | 2013-6-10 21:02 | 只看该作者
:lol

使用特权

评论回复
14
duan050790| | 2013-6-10 21:28 | 只看该作者
谢谢讲解,慢慢看

使用特权

评论回复
15
wuguoyan| | 2013-6-11 00:47 | 只看该作者
谢谢讲解,慢慢看

使用特权

评论回复
16
quyifei| | 2013-6-11 09:44 | 只看该作者
Simon21ic 发表于 2013-6-10 12:01
呵呵,那你也仔细一点吧

又仔细的看看了,发现你是对的。:)

使用特权

评论回复
17
Regsen| | 2013-6-11 12:15 | 只看该作者
库有问题的。STM8中也有问题。STM32不用官方库,还有更好的库吗

使用特权

评论回复
18
Simon21ic|  楼主 | 2013-6-11 18:05 | 只看该作者
Regsen 发表于 2013-6-11 12:15
库有问题的。STM8中也有问题。STM32不用官方库,还有更好的库吗

我是用我自己做的库,包括USB协议栈,标准接口
已经在STM32, NUC, Freescale K20,芯片是实现USB的驱动,由于驱动接口通用,所以应用部分不用修改代码
只是我自己项目比较多,时间非常有限,没时间去做太多维护,就不推荐了

使用特权

评论回复
19
trumpxp| | 2013-6-11 19:57 | 只看该作者
学习学习   谢谢了   版主   感觉很不错   有时间 好好熟悉熟悉   谢谢了

使用特权

评论回复
20
nj841| | 2013-6-11 21:03 | 只看该作者
楼主是有心人

使用特权

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

本版积分规则

个人签名:www.versaloon.com --- under construction

266

主题

2597

帖子

104

粉丝