Yuhang Zheng

关于wm8960音频芯片播放音频文件时的时钟测量

N 人看过

我们已经知道,对于WM8960音频芯片的Codec来说,与SOC连接的一共是有5个引脚:

DACLRC                    数字转模拟左右声道时钟
BCLK(Bit Clock)           位时钟
ADCDAT                    模拟转数字数据(录音数据)
DACDAT                    数字转模拟数据(放音数据)
MCLK                    外部24M时钟

关于这些引脚的作用,可以参看文章《音频的IIS引脚的理解》

这篇文章仅仅讨论播放音频文件时候的情况。

当播放音频文件时,使用示波器测量出来的LRC时钟就是音频的采样频率时钟,如果 /etc/asound.conf文件存在的话,那么LRC时钟就是使用的配置文件中设置的时钟,大多数是44.1kHz或者22.05kHz。

否则的话,LRC时钟就等于播放的音频文件的采样率大小。

使用file命令可以查看音频文件的采样率:

image-20220613165648571

从上面的例程中可以发现:

/forlinx/media/test.mp3:采样率:44.1 kHz
/run/media/sda1/ddd/1K_sin.mp3:采样率:48 kHz
/run/media/sda1/ddd/1K_sin.wav:采样率:11.025 kHz

假设我们想要测试播放采样率为48 kHz的1K_sin.mp3文件,系统中没有/etc/asound.conf文件,同时我们想不使用WM8960音频Codec中的PLL调频部分,那么我们需要怎么做呢?

参照之前文章中的WM8960的时钟分频图:

img

根据文章一开始所说,如果/etc/asound.conf文件不存在的话,LRC时钟就等于播放的音频文件的采样率大小,所以LRC时钟等于48kHz,可以推算出SYSCLK=LRC*64*4=48kHz*256=12.288MHz。由于我们的MCLK是固定24M的时钟芯片,所以我们可以在代码中设置MCLK为12.288MHz*2=24576000Hz来欺骗程序,让驱动不再走PLL去计算分频,而且又不会太影响音频的播放效果。

image-20220613171808450

同时,我们如果去拿示波器实际去测量LRC时钟的时候,实际测量到的大小应该为:48kHz/(24.567MHz/24MHz)=46.89kHz

同理,如果测试播放采样率为44.1 kHz的test.mp3文件,我们可以将时钟设置为44.1 kHz*256*2=22579200 Hz,这样音频芯片的驱动也就不会走PLL去计算分频,如果去拿示波器实际去测量LRC时钟的时候,实际测量到的大小应该为:44.1 kHz/(22.5792 MHz/24MHz)=46.875kHz

当遇到涉及音频播放不正常的问题时,如播放时有沙沙声或者砰砰声等,怀疑到是时钟原因的时候,我们总是可以先通过修改程序中设置的MCLK的值,来绕过音频Codec中的PLL部分,并通过测量LRC时钟和BCLK时钟来确认是不是时钟的问题。