STM32F4-DISCO 学习之CS43L22叫起来[I2S]

/ 2评 / 1

这次为了让CS43L22叫起来,需要花点功夫,接下来就是软件上的WAV解码了,跟这个关系就没想象中密切了.软件就是把WAV解码出来,把数据放到播放缓存你们,就OK了.

这个芯片特性,我就不罗嗦,大家可以到官网看看.http://www.cirrus.com/cn/products/cs43l22.html

感觉其实是个比较屌丝的DAC,不过我这等木耳,也听不出什么东西.配置首先要用I2C呢.毕竟这是DISCO集成板子的芯片,也可以参考板子自身的初始化代码,这里只摘取部分寄存器参考.首先第一个是读芯片ID,判断芯片还好不好.

QQ截图20150929191428

这个东西有HP[HeadPhone]功能,但是ST把他直接接地了[重点注意31脚].

QQ截图20150929191428

所以这两个寄存器应该参考如此设计:

QQ截图20150929191428

其他如音量设计,静音设计,可以按照官方DISCO的来设计,另外工欲善其事,必先利其器,可以用你的耳机,或者电脑下载个MusicScope,然后观察/听,这次试验,声音数据不是美妙的音乐,所以... 开始进行大致的程序分析,程序最后会打包提供下载:

  1. 注册所有GPIO
  2. 设置I2C寄存器
    1. 写入
    2. 读取校验
  3. 设置DMA
  4. 设置I2S
  5. 填充数据.

一样是使用了双Buffer机制,不过内容处理不在中断内,万一我要解码WAV,都在中断内,系统会崩溃的.

static void Audio_MAL_IRQHandler(void)
{
    /* Transfer complete interrupt */
    if (DMA_GetFlagStatus(DMA1_Stream7, DMA_FLAG_TCIF7) != RESET)
    {
        CS43L22_BufTC = 1;
        DMA_ClearITPendingBit(DMA1_Stream7, DMA_IT_TCIF7);
    }
}

主程序里面就是这个样:

    for(;;)
    {
        while(CS43L22_BufTC == 0);
        if(DMA_GetCurrentMemoryTarget(DMA1_Stream7))
        {
            for(i_main_cnt = 0; i_main_cnt < 16; i_main_cnt++)
            {
                CS43L22_Buf1[i_main_cnt]++;
            }
        }
        else
        {
            for(i_main_cnt = 0; i_main_cnt < 16; i_main_cnt++)
            {
                CS43L22_Buf2[i_main_cnt]--;
            }
        }
        CS43L22_BufTC = 0;
    }

另外注意,音量满幅度是255,但是如果这样,你什么都听不好,简直杀人,所以我们用了100音量.刚开始时候,是这样的:

QQ截图20150929191428

直到慢慢变大到这样的:

QQ截图20150929191428

I2S可以理解成,高低片选都有效的SPI:

QQ截图20150929191428

另外有个叫MP45DT02的麦克风,就是芯片上面有个洞的那个芯片.也是I2S,不过,他不用上电配置.他只要两根线.

CS43L22测试

另外板载的麦克风也差不多,只不过输出的信号是PDM而已,需要进行转换.暂时我就先不管了.

MP45DT02驱动

  1. crushw说道:

    你好,有个问题想请教你。看了麦克风的芯片手册跟驱动代码,芯片输出是格式的,为什么把它用接口配置,并且配置成I2S_Standard_LSB,I2S_DataFormat_16b,I2S_AudioFreq_96k

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注