关于STM32的I2S通信飞利浦协议和MSB协议

最近公司一个项目要用到CODEC芯片来做语音的采集和输出,驱动是用的STM32F405的I2S接口。之前没有深入的了解过I2S的知识,只是大概的知道它是一种用于传输音频数据的总线。本来以为没什么难的,实际用下来其实也没感觉有有什么特别的。但是还是在使用的过程中把自己坑了一把。 
CODEC芯片型号是MAX9867,主要的应用场合是手机和助听器之类的。要实现STM32驱动的代码我首先是看MAX9867的资料,CODEC芯片的资料上并没有说知否支持I2S的飞利浦协议,只是把每一种配置的时序图表示了出来。我配置的时序如下图所示:

@MAX9867 配置的通信时序图

然后继续看STM32的手册上是否有和这个时序匹配的通信配置,STM32支持的通信协议有4种。

@支持的通信协议

@I2S Philips 标准
我们看到这两种时序图表示方法不同,一个是上升沿锁存数据,一个是下降沿改变数据,但是本质是一样的。然后都是左声道在前,并且用低电平表示左声道。既然时钟极性和声道控制都相同,而且这个配置也是CODEC芯片的默认配置,而且也是STM32的第一个配置。然后我就按照这个方式来配置CODEC芯片和STM32驱动,并且也实现了MIC声音采集并通过喇叭播放的功能。到这里我当然不会认为通信有什么问题,因为这如果有问题语音数据是不可能做到采集和播放的。 
但是后边问题来了,由于播放MIC采集的声音有杂音,为了定位问题出在什么地方我就在FLASH中存了一段固定的语音用CODEC进行播放。结果播放出来的声音基本上都被噪音盖过去了,用示波器看输出的音频信号非常杂乱。但是同样的语音数据在ST的官方开发板上去播放就是很纯净的音乐声。这个问题就让我很不能理解了,不知道该如何去解决了。 
最后在同事的协助下再去查看手册,这才发现CODEC的时序和STM32的时序并不是匹配的。我们可以看到飞利浦协议第一个时钟上升沿锁存的数据是无效的,而CODEC芯片第一个上升沿锁存的数据是有效的。这就造成STM32传输到CODEC的数据最高位会被损失掉,但是在同样的MIC采集并播放的过程中由于采集和播放的协议是匹配的,所以语音就只是最后一位被损失掉了,并不会对声音数据造成大的损失。 
既然问题找到了,那么就要就决绝它了。我们看到STM32支持的协议中有一个叫MSB对其标准的,我们看这个时序图和COEDC的时序图是完全匹配的。修改STM32的配置,播放语音数据,声音完美输出。

@MSB 对齐标准

这个教训还是比较深刻的,以后再遇到这种时序不太熟悉的协议时一定要把手册认真的看完,要把协议的时序完全搞明白

转自:

:http://blog.csdn.net/yedapeng2011/article/details/77075031?reload

猜你喜欢

转载自blog.csdn.net/zhjmyx/article/details/78704795