发现STM32 USB固件库一处BUG

STM32 USB提供双缓冲接收方式,以解决对时序和速度要求较高的场合,如使用同步传输的音/视频流、接近线速的Bulk传输等。最近在用F103C8T6做声卡,在调试时发现收到的数据总是最后一对采样错误,导致声音播放时有毛刺。反复找问题和调试无果,遂怀疑芯片有问题,更换后仍无果。最后一统乱试发现,判断当前用户使用的缓冲区的标志位反了,具体如下:

<code>voidEP3_OUT_Callback(void)
{
  if(GetENDPOINT(ENDP3) & EP_DTOG_TX){ //先判断本次接收到的数据是放在哪块缓冲区的
    FreeUserBuffer(ENDP3,EP_DBUF_OUT); //先释放用户对缓冲区的占有,这样的话USB的下一个接收过程可以立刻进行,同时用户并行进行下面处理
    count_out=GetEPDblBuf0Count(ENDP3);//读取接收到的字节数
    PMAToUserBufferCopy(buffer_out,ENDP3_BUF0Addr,count_out);
  }else{
    FreeUserBuffer(ENDP3,EP_DBUF_OUT);
    count_out=GetEPDblBuf1Count(ENDP3);
    PMAToUserBufferCopy(buffer_out,ENDP3_BUF1Addr,count_out);
  }
}
</code>

以上是搬运的网上的一个例程,可以看到通过判断端点的EP_DTOG_RX/EP_DTOG_TX标志位来确定当前用户所使用的缓冲区,此例程是接收方向的双缓冲中断处理函数,当EP_DTOG_TX标志位置1时表示使用用户使用BUFF0而USB IP核使用BUFF1,反之用户使用BUFF1而USB使用BUFF0。我在编写声卡的程序时也按照此思路,接收方向判断EP_DTOG_TX来交换Buffer,但此时收到的数据总有错误。而无意中将EP_DTOG_TX改为EP_DTOG_RX,则问题消失,数据正常,播放声音正常。遂仔细翻阅STM32器件手册,发现:

QQ图片20171026183601.png

即对于接收方向上使用EP_DTOG_RX判断缓冲区而发送方向用EP_DTOG_TX(从宏定义字面意思上也能看懂的~),但这里并没有说明接收方向和发送方向是以谁为参考,即对于OUT端点是当做接收方向(对单片机)还是发送方向(对主机)。但仔细看下OUT端点,使用的缓冲区均以RX结尾,也就是说理论上应该是和DTOG_RX对应的。如果确实是这样,那么网上的例程应该全是错误的,按照他们的写法根本收不到正确的数据。但确实是改为RX后,声卡工作正常了,Debug Watch看到数据流也正确了。

待有空写一个Bulk传输的例程来验证下再来跟大家分享!

来自:电子与无线电 / 电子技术
 
iSee
4年1个月前
1楼
确实不能迷信芯片厂家的固件库,我曾经也在华邦的W90P710芯片固件库的串行模块部分发现BUG,调试了好久才发现问题。
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
蓬莱的鹰
3年11个月前
2楼
I2c库函数才是真坑
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
zx-16533
3年11个月前
3楼
引用 蓬莱的鹰:
I2c库函数才是真坑
+1
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
ry7740kptv作者
3年11个月前
4楼
引用 蓬莱的鹰:
I2c库函数才是真坑
I2C的问题是因为本身硬件BUG导致的吧?然后新的固件库从软件上回避了这个BUG,硬件本身并没有修正好像。。。
回复
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
ry7740kptv
学者 机友 笔友
文章
88
回复
1542
学术分
5
2010/06/13注册,1 个月前活动
暂无简介
%7B%22isDisplay%22%3Atrue%7D
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
插入资源
全部
图片
视频
音频
附件
全部
未使用
已使用
正在上传
空空如也~
上传中..{{f.progress}}%
处理中..
上传失败,点击重试
等待中...
{{f.name}}
空空如也~
(视频){{r.oname}}
{{selectedResourcesId.indexOf(r.rid) + 1}}
处理中..
处理失败
插入表情
我的表情
共享表情
Emoji
上传
注意事项
最大尺寸100px,超过会被压缩。为保证效果,建议上传前自行处理。
建议上传自己DIY的表情,严禁上传侵权内容。
点击重试等待上传{{s.progress}}%处理中...已上传
空空如也~
草稿箱
加载中...
此处只插入正文,如果要使用草稿中的其余内容,请点击继续创作。
{{fromNow(d.toc)}}
{{getDraftInfo(d)}}
标题:{{d.t}}
内容:{{d.c}}
继续创作
删除插入插入
{{forum.displayName}}
{{forum.countThreads}}
篇文章,
{{forum.countPosts}}
条回复
{{forum.description || "暂无简介"}}
ID: {{user.uid}}
学术分隐藏
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

支持的图片格式:jpg, jpeg, png
插入公式
分享回复:{{shareId}}
加载中...
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
加入关注取消关注
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
建议修改
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也