这次为了让CS43L22叫起来,需要花点功夫,接下来就是软件上的WAV解码了,跟这个关系就没想象中密切了.软件就是把WAV解码出来,把数据放到播放缓存你们,就OK了.
这个芯片特性,我就不罗嗦,大家可以到官网看看.http://www.cirrus.com/cn/products/cs43l22.html
感觉其实是个比较屌丝的DAC,不过我这等木耳,也听不出什么东西.配置首先要用I2C呢.毕竟这是DISCO集成板子的芯片,也可以参考板子自身的初始化代码,这里只摘取部分寄存器参考.首先第一个是读芯片ID,判断芯片还好不好.
这个东西有HP[HeadPhone]功能,但是ST把他直接接地了[重点注意31脚].
所以这两个寄存器应该参考如此设计:
其他如音量设计,静音设计,可以按照官方DISCO的来设计,另外工欲善其事,必先利其器,可以用你的耳机,或者电脑下载个MusicScope,然后观察/听,这次试验,声音数据不是美妙的音乐,所以... 开始进行大致的程序分析,程序最后会打包提供下载:
- 注册所有GPIO
- 设置I2C寄存器
- 写入
- 读取校验
- 设置DMA
- 设置I2S
- 填充数据.
一样是使用了双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音量.刚开始时候,是这样的:
直到慢慢变大到这样的:
I2S可以理解成,高低片选都有效的SPI:
另外有个叫MP45DT02的麦克风,就是芯片上面有个洞的那个芯片.也是I2S,不过,他不用上电配置.他只要两根线.
另外板载的麦克风也差不多,只不过输出的信号是PDM而已,需要进行转换.暂时我就先不管了.
你好,有个问题想请教你。看了麦克风的芯片手册跟驱动代码,芯片输出是格式的,为什么把它用接口配置,并且配置成I2S_Standard_LSB,I2S_DataFormat_16b,I2S_AudioFreq_96k
@crushw DAC的寄存器表中有提到.