发现STM32 USB固件库一处BUG
ry7740kptv2017/10/26电子技术 IP:浙江

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传输的例程来验证下再来跟大家分享!

来自:电子信息 / 电子技术
5
 
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
iSee
6年6个月前 IP:江苏
840283
确实不能迷信芯片厂家的固件库,我曾经也在华邦的W90P710芯片固件库的串行模块部分发现BUG,调试了好久才发现问题。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
zx-48750
6年4个月前 IP:上海
842364
I2c库函数才是真坑
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
zx-16533
6年4个月前 IP:广东
842366
引用 蓬莱的鹰:
I2c库函数才是真坑
+1
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
ry7740kptv作者
6年4个月前 IP:江苏
842377
引用 蓬莱的鹰:
I2c库函数才是真坑
I2C的问题是因为本身硬件BUG导致的吧?然后新的固件库从软件上回避了这个BUG,硬件本身并没有修正好像。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

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

所属专业
所属分类
上级专业
同级专业
ry7740kptv
学者 机友 笔友
文章
89
回复
1542
学术分
5
2010/06/13注册,1年0个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

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