经过几天的不断的阅读文档,问人,尝试终于调试成功。反过来一想,原来如此简单。
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音频过程,如有错误,请多多指教。