HI3521D外接audio codec转I2S音频采集

经过几天的不断的阅读文档,问人,尝试终于调试成功。反过来一想,原来如此简单。

1.硬件原理图

a.外接codec部分

b.时钟MCLK部分,由海思提供

c.海思对接codec部分

对原理图的理解:外接codec通过由海思GPIO9_3/I2S2_MCLK连接MCLK引脚提供时钟,I2S的SD,WS,BCLK线连接海思I2S0的SD,WS,BCLK。

2.寄存器配置逻辑

海思文档摘要:

       AI 设备支持扩展的多路接收的I2S及PCM 接口时序。对接时,Codec 的时序模式选择、同步时钟、采样位宽等配置必须与AI 设备的配置保持一致,否则可能采集不到正确的数据。

     由于时序的问题,在AI/AO 设备从模式下,建议用户先配置好对接的Codec,再配置AI 或AO 设备;而在AI/AO 设备主模式下,建议用户先配置好AI 或AO 设备,再配置对接的Codec。

由于外接codec电路把外接codec设置为了主模式,那么海思即为从模式。

所以先设置外接codec的时钟等参数。

寄存器设置:

a.外接codec主时钟的设置,因为MCLK连接的GPIO9_3,所以先把GPIO9_3复用为外接codec的主时钟

即:

himm 0x120F00AC 0x2   #GPIO9_3  I2S1_BCLK_RX  I2S2_MCLK

注意:上面寄存器配置第一个图,我个人觉得海思文档有问题,不应该是I2S0/PCM的接收时钟。海思家大业大,对于技术支持,呵呵,我等小散就不要想了。

b.把外接MCLK设置多少?我是设置为12.288MHz,怎么去设置~~~

下面这张图对时钟设置很重要,可以多看多理解。

从GPIO9_3引脚复用看出,我们用的是I2S2时钟,那么根据上图,我们将配置CRG8,即我们配置I2S_CRG_CFG0_08和I2S_CRG_CFG1_08。具体可以参考文档查看这两个寄存器配置的内容。

我的配置如下:

#crg8
himm 0x13140140 0x003254E7
himm 0x13140144 0x00000133

根据外接codec的芯片的说明,设置好MCLK,他们会自动把BCLK,采样率WS都设置好。BCLK=MCLK/4 ,WS=BCLK/64

现在codec时钟设置好了,就要设置与codec连接的I2S0的时钟。

从上图可以看到,I2S0接口的配置寄存器位CRG0,即我们配置I2S_CRG_CFG0_00和I2S_CRG_CFG1_00寄存器。具体可以参考文档查看这两个寄存器配置的内容。

我的配置如下:

#crg0
himm 0x13140100 0x003254E7   #此时第0路时钟输出mclk 频率为12.288MHz。
himm 0x13140104 0x00000133   #时使能第0路时钟,同时把bclk 配置为mclk 的4分频,
                             #fclk配置为bclk的64分频,此时fclk频率为48KHz

海思I2S0与外接codec对接的配置基本如上。

c.I2S0的引脚复用为I2S0_WS_RX,I2S0_BCLK_RX,I2S0_SD_RX

具体方式,可以查看MCLK复用的方式。

我的值:

himm 0x120F00A0 0x1   #GPIO9_0  I2S0_BCLK_RX
himm 0x120F00A4 0x1   #GPIO9_1  I2S0_WS_RX
himm 0x120F00A8 0x1   #GPIO9_2  I2S0_SD_RX

综上是为我的寄存器配置。

3.海思应用程序的编写

1.海思采集程序,主要是通过海思sample里面的audio程序来改,具体改了AIO_ATTR_S的值。

如下:

AIO_ATTR_S stAioAttr;

stAioAttr.enSamplerate   = AUDIO_SAMPLE_RATE_48000;
stAioAttr.enBitwidth     = AUDIO_BIT_WIDTH_16;
stAioAttr.enWorkmode     = AIO_MODE_I2S_SLAVE;
stAioAttr.enSoundmode    = AUDIO_SOUND_MODE_MONO;
stAioAttr.u32EXFlag      = 1;
stAioAttr.u32FrmNum      = 30;
stAioAttr.u32PtNumPerFrm = SAMPLE_AUDIO_PTNUMPERFRM;
stAioAttr.u32ChnCnt      = 1;
stAioAttr.u32ClkChnCnt   = 1;
stAioAttr.u32ClkSel      = 0;

if(PT_AAC == gs_enPayloadType)
{
     stAioAttr.u32PtNumPerFrm = AACLC_SAMPLES_PER_FRAME;
}

这篇文档,是我采集海思HI3521D音频过程,如有错误,请多多指教。

猜你喜欢

转载自blog.csdn.net/wo_Niu123/article/details/81357496