当前位置:   article > 正文

HI3521D外接audio codec转I2S音频采集_海思 mclk配置

海思 mclk配置

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

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。具体可以参考文档查看这两个寄存器配置的内容。

我的配置如下:

  1. #crg8
  2. himm 0x13140140 0x003254E7
  3. 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寄存器。具体可以参考文档查看这两个寄存器配置的内容。

我的配置如下:

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

 

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

 

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

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

我的值:

  1. himm 0x120F00A0 0x1 #GPIO9_0 I2S0_BCLK_RX
  2. himm 0x120F00A4 0x1 #GPIO9_1 I2S0_WS_RX
  3. himm 0x120F00A8 0x1 #GPIO9_2 I2S0_SD_RX

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

 

3.海思应用程序的编写

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

如下:

  1. AIO_ATTR_S stAioAttr;
  2. stAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_48000;
  3. stAioAttr.enBitwidth = AUDIO_BIT_WIDTH_16;
  4. stAioAttr.enWorkmode = AIO_MODE_I2S_SLAVE;
  5. stAioAttr.enSoundmode = AUDIO_SOUND_MODE_MONO;
  6. stAioAttr.u32EXFlag = 1;
  7. stAioAttr.u32FrmNum = 30;
  8. stAioAttr.u32PtNumPerFrm = SAMPLE_AUDIO_PTNUMPERFRM;
  9. stAioAttr.u32ChnCnt = 1;
  10. stAioAttr.u32ClkChnCnt = 1;
  11. stAioAttr.u32ClkSel = 0;
  12. if(PT_AAC == gs_enPayloadType)
  13. {
  14. stAioAttr.u32PtNumPerFrm = AACLC_SAMPLES_PER_FRAME;
  15. }

 

 

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/976404?site
推荐阅读
相关标签
  

闽ICP备14008679号