这两天在调试一个与语音ADC芯片,也遇到了一些问题,到目前位置也解决了问题,所以想说一下嵌入式调试的一些心得,如果大家在调试设备的时候遇到问题,可以回头来看看这篇文章,可能会得到一些启发。
我调试的系统架构
硬件方案如上图
我们一共可以采集到10ch音频数据,其中有两路是最后的ES7243E给出来的,然后最后送给CPU的是最前面的那个ES7210.
CPU给ES7243E提供MCLK,但是另外两个ES7210芯片的时钟是由ES7243ET提供的。
音频调试就必须提到ALSA,ALSA就必须提到三个很重要的东西。
像应用用到的很多接口,都是由alsa接口提供的。
现在说下我遇到的问题
第一个问题,我通过录音命令可以录取到两个7210芯片上面的麦克风数据,但是录取不到ES7243E上面的两个麦克风的数据。
1、排查寄存器
这个是最重要的,如果寄存器设置的模式不正确,那么工作就不可能正常。上面的图中可以看到,7210的时钟是由7243E提供的,所以7243E需要设置成master模式。
2、测量时钟
这个是最关键的,音频调试,需要测量MCLK、LRCK、BCLK。
3、电源测量,这个时候比较次要了
然后经过各种调试,在顺芯的FAE王工的指导下,发现是LRCK不正确的原因,而且因为设置的寄存器相差一个bit位,我们用示波器看到的时钟是15.99K,实际需要的是16K。当时还怀疑示波器的问题。
那个关键的寄存器如下:
这里寄存器的解释,如果设置为0,那么时钟就会从MCLK除以1,如果是4095,那么BCLK = MCLK 除以 4096。
我的MCLK = 12288000HZ
我的BCLK = 16000HZ 采样
那么我就需要设置这个寄存器位
寄存器的值是 12288000 除以 16000 = 768
然后寄存器设置的话,我就需要设置成 768 - 1 = 0x2FF
寄存器设置正常后,可以看到LRCK非常稳定在16K。
并且,之前看到的,BCLK和LRCK下降沿不对齐的情况也没有出现了。
正确的波形如下:(两个时钟的下降沿可以正确对齐)
第二个问题
我们录音的时候,使用12ch来录音,但是录取到的音频发现有时候物理麦克风1的音频在通道1上,有时候在通道6上。
我们使用的TDM录音格式如下:
这是一个非常典型的录音格式,我们平时用的声道只有两个,所以在LRCK低电平的时候传左声道,LRCK在高电平的时候传右声道。
TDM格式可以允许在LRCK上传输多个声道。
正常的时候,我们录取的音频如下
出问题的时候,我们的录取音频如下:
也就是LR音频变成了RL的音频
因为这个问题,我用示波器看了TDM格式的音频,7243E上的其中一个麦克风录取正弦波1K信号的时候波形如下:
检查这个的原因是想确认下,在传输过程中,每个ADC芯片的输出在LRCK的位置是不是正确的。
然后,确认了一遍后确定没有问题。
之后是和同事讨论后,问题出现在每次录音的时候,可能ADC的状态不一致导致。
然后我们抓取了ADC录音的LRCK和BCLK的波形。
正常情况下:
另一种情况:
上面两张图能说明的问题是,在每次开始录音的时候,LRCK的电平跳变是不同的。
然后我们检查电路,发现电路是没有上拉电阻在LRCK上的。
然后检查寄存器,发现寄存器有配置上拉电阻的情况,而且已经配置上了。
最后就是在不断测试和验证上下功夫,shutdown的时候,关闭掉ADC的使能,startup后,用work来使能寄存器让ADC正常工作。
研究发现如果不是代码设置,用i2ctool设置还可能因为时序问题还会出现偶发的上述问题。
在不断的测试后,才找到正确的情况,用示波器抓的开始信号也一直是正常的。
整理的不是十分充分,在调试通信问题上,最好还是以波形为主,不要着急,但是也要想清楚原理。
而且在第一个问题的解决上,我觉得还是有疑问
时钟是由7243E提供的,7243E录音出现问题,那为什么另外两颗7210录音正常?
我只能说7210对时钟的要求不是那么严格了。
第二个问题
TDM格式已经说明高电平传的是偶数通道数音频,为什么还可能出现乱序,我这里只能猜测是音频平台部分的cpu dai软件部分处理的不够完美。
即使在开始部分有异常,但是只要保证高低电平差异,我认为TDM都应该要处理正确。
好了,就这些,欢迎大家评论讨论~
推荐阅读:
专辑|Linux文章汇总
专辑|程序人生
专辑|C语言
我的知识小密圈
关注公众号,后台回复「1024」获取学习资料网盘链接。
欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~