最近项目中使用STM32F4驱动音频IC:WM8978。
WM8978为DAC+ADC芯片,本身并不具备编解码的功能,一方面,可通过I2S接口接收PCM数据,转为模拟信号输出,此为DAC过程,即放音;一方面,可接收模拟信号转为数字信号,通过I2S接口传输给MCU,此为ADC过程,即录音。WM8978还使用I2C接口配置其工作参数,比如音量,EQ,3D环绕等。WM8978本身可直连1W/8欧的小喇叭。
因为使用过程中掉过坑,记录一下容易出错的地方。下面只论及I2S而没有涉及I2C。
1.GPIO配置
我使用的是I2S3,对着硬件工程师给的原理图,再使用STM32CubeMX对照各个管脚看看是否有此映射。不得不说,新版的STM32CubeMX使用起来有些不顺。我只喜欢使用STM32CubeMX查看资源,却不喜欢这个软件的代码,架构有些不合我意。
我使用的还是传统的库,版本为V1.4.0。
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA |
RCC_AHB1Periph_GPIOB |
RCC_AHB1Periph_GPIOC, ENABLE); //使能外设GPIOB,GPIOC时钟
//PB3/4/5 复用功能输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4| GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
//PC7复用功能输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化
//PA15复用功能输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15