你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F407作为I2S从机,为什么会出现数据错位?

[复制链接]
adlu 提问时间:2015-12-23 15:32 /
STM32F407作为I2S从机,位时钟和同步时钟有外部codec提供,使用DMA传输数据。
播放wav文件时的,操作顺序如下:
1.打开文件,解析文件头信息;
2.配置MCU端I2S;
3.设置并启动DMA,循环模式;
4.设置外部codec芯片,产生位时钟和同步时钟;
注:2,4步需要根据文件进行设置。
5.在DMA传输过半中断和传输完成中断中,读取wav文件的音频数据,填充DMA缓冲区;
6.播放结束后,关闭DMA和I2S;
7.关闭codec芯片。

播放下一曲文件时,重复以上7个步骤。

遇到的问题是:播放第一个wav文件,完全正常;播放第二个或后面的文件时,出现沙沙声或者声音变大了,
用示波器观察到数据错位了。经多次观察,错位的位数不固定。

请问有高手遇到过类似的问题吗?


收藏 2 评论6 发布时间:2015-12-23 15:32

举报

6个回答
adlu 回答时间:2015-12-24 13:33:19
本帖最后由 adlu 于 2015-12-28 10:18 编辑

问题已解决。【注:只解决了16位播放问题,24位32位播放仍有问题,请看后续补充问题】
解决方法:在每次重新设置I2S和CODEC波特率之后,先将DMA传输缓冲清空,然后启动DMA传输。延迟一定时间(几十ms),然后检测SPI寄存器,确认I2S格式没有出错,再进行音频文件的读取播放。
如果I2S格式错误,则关闭DMA传输,然后再重启DMA传输,延迟一定时间,再检测SPI寄存器确认I2S格式。。。如此循环N次,直到成功。
adlu 回答时间:2015-12-24 13:33:37
分析:
STM32作为I2S从机时,由于位时钟和同步时钟都是由外部COCEC芯片提供,所以可能会出现数据不对齐的情况。这时候SPI状态寄存器SR的bit8会被硬件置1,也就是说STM32是知道出现格式错误的,只是没有自动完成重新对齐。
LRCK是用于左右声道的同步的。比如:按照飞利浦标准I2S格式,LRCK下降沿后延迟1个BCLK,开始传输左声道数据;LRCK上升沿后延迟1个BCLK,开始传输右声道数据。这是不应该出现数据错位的。所以,这可以算是STM32的I2S的一个BUG吧。
adlu 回答时间:2015-12-28 10:26:59
补充问题:播放24位和32位时,仍有问题!
问题现象,高16b和低16b错位。STM32的I2S数据帧长度只有两种,16b和32b。16b数据可以封装成16b帧或者32b帧;24b和32b数据都被封装成32b帧。当播放32b帧的时候,有可能出现高16b和低16b错位的情况,可以通过示波器观察看到。此时STM32的I2S并不能检测出帧错误,这时候SPI状态寄存器SR的bit8不会被硬件置1。这样,用户程序及不知道出了错误,无法通过重启I2S和DMA来重新同步I2S数据。
海口天空a 回答时间:2016-9-13 10:07:05
我也遇到了这样的问题。楼主最后把所有的问题都解决了吗?
adlu 回答时间:2016-9-18 09:31:01
海口天空a 发表于 2016-9-13 10:07
我也遇到了这样的问题。楼主最后把所有的问题都解决了吗?

没有完全解决,问题描述都写出来了。

另外说明,我用STM32作为I2S的从机,但是作为从机时,STM32并没有MCLK输入。
切换波特率的时候,我并没有对内部MCLK进行调整,这可能是一个很重要原因。

所以,我建议尽量用STM32作为I2S作为主机,并把MCLK向外输出。
如果可能,可以用12.288M晶振作为MCU主时钟,并配置把这个时钟向外输出,连接到外部CODE。这样,所有I2S电路的MCLK使用的都是12.288M。
一笔带过00 回答时间:2017-9-7 15:26:27
adlu 发表于 2016-9-18 09:31
没有完全解决,问题描述都写出来了。

另外说明,我用STM32作为I2S的从机,但是作为从机时,STM32并没有M ...

问一下,I2S当从机的时候,两个是时钟都是由外部提供的吧,那么我MCU做配置的时候,有要对时钟做配置吗?
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版