本文主要是介绍STM32H743VIT6使用STM32CubeMX通过I2S驱动WM8978(4),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
接前一篇文章:STM32H743VIT6使用STM32CubeMX通过I2S驱动WM8978(3)
本文参考以下文章及视频:
STM32CbueIDE Audio播放音频 WM8978 + I2S_stm32 cube配置i2s录音和播放-CSDN博客
STM32第二十二课(I2S,HAL,cubemx)_i2s cubemax-CSDN博客
STM32:I2S驱动WM8978_stm32 iis输出-CSDN博客
STM32:利用VM8978和I2S实现录音的频率分析-CSDN博客
第35讲-I2S 6(配套例程讲解)_哔哩哔哩_bilibili
第83讲 音乐播放器实验讲解_哔哩哔哩_bilibili
特此致谢!
上一回讲解了WM8978初始化函数wm8978_init中的寄存器3的配置操作,本文接着讲解对于其它寄存器的配置。
为了便于理解和回顾,再次贴出正点原子和野火的代码,分别如下:
- 正点原子代码
//WM8978初始化
//返回值:0,初始化正常
// 其它,错误代码
u8 WM8978_Init(void)
{u8 res;IIC_Init(); //初始化I2C接口res = WM8978_Write_Reg(0, 0); //软复位WM8978if(res) //发送指令失败,WM8978异常return 1;//以下为通用设置WM8978_Write_Reg(1, 0x01B); //R1,MICEN设置为1(MIC使能),BIASEN设置为1(模拟器工作),VMIDSEL[1:0]设置为11(5K)WM8978_Write_Reg(2, 0x1B0); //R2,ROUT1、LOUT1输出使能(耳机可以工作),BOOSTENR、BOOSTENL使能WM8978_Write_Reg(3, 0x06C); //R3,LOUT2、ROUT2输出使能(喇叭工作),RMIX、LMIX使能WM8978_Write_Reg(6, 0); //R6,MCLK由外部提供WM8978_Write_Reg(43, 1<<4); //R43,INVROUT2反向,驱动喇叭WM8978_Write_Reg(47, 1<<8); //R47,PGABOOSTL,左通道MIC获得20倍增益WM8978_Write_Reg(48, 1<<8); //R48,PGABOOSTR,右通道MIC获得20倍增益WM8978_Write_Reg(49, 1<<1); //R49,TSDEN,开启过热保护WM8978_Write_Reg(49, 1<<2); //R49,SPEAKER BOOST,1.5xWM8978_Write_Reg(10, 1<<3); //R10,SOFTMUTE关闭,128x采样,最佳SNR(信噪比)WM8978_Write_Reg(14, 1<<3); //R14,ADC 128x采样率return 0;
}
- 野火代码
/*** @brief 配置I2C GPIO,并检查I2C总线上的WM8978是否正常* @param 无* @retval 1,初始化成功* 0,初始化失败*/
uint8_t wm8978_Init(void)
{uint8_t res;I2cMaster_Init(); //初始化I2C接口res = wm8978_Reset(); //硬件复位WM8978所有寄存器到缺省状态wm8978_CtrlGPIO1(1); //控制WM8978的一个GPIO接口,控制其为放音状态return res;
}
/*** @brief 复位wm8978* @param 无* @retval 1:复位成功* 0:复位失败*/
uint8_t wm8978_Reset(void)
{//wm8978寄存器缺省值const uint16_t reg_default[] = {0x000, 0x000, 0x000, 0x000, 0x050, 0x000, 0x140, 0x000,0x000, 0x000, 0x000, 0x0FF, 0x0FF, 0x000, 0x100, 0x0FF,0x0FF, 0x000, 0x12C, 0x02C, 0x02C, 0x02C, 0x02C, 0x000,0x032, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,0x038, 0x00B, 0x032, 0x000, 0x008, 0x00C, 0x093, 0x0E9,0x000, 0x000, 0x000, 0x000, 0x003, 0x010, 0x010, 0x100,0x100, 0x002, 0x001, 0x001, 0x039, 0x039, 0x039, 0x039,0x001, 0x001};uint8_t res;uint8_t i;res = wm8978_WriteReg(0x00, 0);for (i = 0; i < sizeof(reg_default) / 2; i++)wm8978_RegCash[i] = reg_default[i];return res;
}
//WM8978寄存器缓存
//由于WM8978的I2C两线接口不支持读取操作,因此寄存器值缓存在内存中
//当写寄存器同步更新缓存,读寄存器时直接返回缓存中的值
static uint16_t wm8978_RegCash[] = {0x000, 0x000, 0x000, 0x000, 0x050, 0x000, 0x140, 0x000,0x000, 0x000, 0x000, 0x0FF, 0x0FF, 0x000, 0x100, 0x0FF,0x0FF, 0x000, 0x12C, 0x02C, 0x02C, 0x02C, 0x02C, 0x000,0x032, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,0x038, 0x00B, 0x032, 0x000, 0x008, 0x00C, 0x093, 0x0E9,0x000, 0x000, 0x000, 0x000, 0x003, 0x010, 0x010, 0x100,0x100, 0x002, 0x001, 0x001, 0x039, 0x039, 0x039, 0x039,0x001, 0x001
};
寄存器4
- 正点原子代码
正点原子代码中并未设置寄存器4,也就是说使用的是默认值0x050。
- 野火代码
void wm8978_CfgAudioIF(uint16_t _usStandard, uint8_t _ucWordLen)
{uint16_t usReg;//WM8978(V4.5_2011).pdf 73页,寄存器列表// REG R4,音频接口控制寄存器// B8 BCP = x,BCLK极性,0表示正常,1表示反相// B7 LRCP = x, LRC时钟极性,0表示正常,1表示反相// B6:5 WL = x,字长,00=16bit,01=20bit,10=24bit,11=32bit(右对齐模式只能操作在最大24bit)// B4:3 FMT = x,音频数据格式,00=右对齐,01=左对齐,10=I2S,11=PCM// B2 DACLRSWAP = x,控制DAC数据出现在LRC时钟的左边还是右边// B1 ADCLRSWAP = x,控制ADC数据出现在LRC时钟的左边还是右边// B0 MONO = 0,0表示立体声,1表示单声道,仅左声道有效//usReg = 0;if (_usStandard == SAI_I2S_STANDARD) //I2S飞利浦标准{usReg |= (2 << 3);}else if (_usStandard == SAI_I2S_MSBJUSTIFIED) //MSB对齐标准(左对齐){usReg |= (1 << 3);}else if (_usStandard == SAI_I2S_LSBJUSTIFIED) //LSB对其标准(右对齐){usReg |= (0 << 3);}else //PCM对齐标准(16位通道帧上带长或短帧同步或者16位数据帧扩展为32位通道帧){usReg |= (3 << 3);}if (_ucWordLen == 24){usReg |= (2 << 5);}else if (_ucWordLen == 32){usReg |= (3 << 5);}else{usReg |= (0 << 5); /* 16bit */}wm8978_WriteReg(4, usReg);……
}
关于寄存器4的说明,参见笔者文章:WM8978 —— 带扬声器驱动程序的立体声编解码器(4)-CSDN博客
寄存器4复位默认值为0x050(0b001010000)。
- BCP
参见WM8978手册第68页,如下:
- LRP
参见WM8978手册第68页,如下:
同时参见WM8978手册第67页,如下:
- WL
参见WM8978手册第68页,如下:
对应STM32CubeMX中的设置为:
- FMT
参见WM8978手册第68页,如下:
对应STM32CubeMX中的设置为:
- DACLRSWAP
参见WM8978手册第68页,如下:
- ADCLRSWAP
参见WM8978手册第68页,如下:
- MONO
参见WM8978手册第68页,如下:
根据正点原子和野火的代码,实际采用了默认值0x050(0b001010000),即字长(WL)为24 bits,音频数据格式(FMT)为I2S飞利浦标准格式。
更多寄存器配置的详细说明与讲解请看下回。
这篇关于STM32H743VIT6使用STM32CubeMX通过I2S驱动WM8978(4)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!