STM32配置CODEC之WM8721
一、简介
因一个USB声卡项目使用到WM8721 Codec芯片.花了一天的时间调试代码.最终完成.可以输入跟输出.网上找到的资料基本是FPGA配置的.没有找到用MCU配置的代码.所以才自己动手写一个.做好后方便使用.同时也分享出来,方便大家使用.
以下是芯片的几个特点:
- WM8731,是一款低功耗的高音质音频器。
- 立体声输入输出.
LINE IN , MIC IN
可选. - 时钟配置两种模式,
Normal模式
跟USB模式
. - 支持4种IIS数据格式,:
左对齐
、右对齐
、IIS模式
、DSP模式
二、芯片框图
三、WM8731寄存器
芯片总共有11个寄存器.具体的细节要看数据手册.
- R0寄存器:
LRINBOTH
: 用左声道参数控制右声道装载控制LINMUTE
:静音控制LINVOL
:音量控制 - R1寄存器:
RLINBOTH
:用右声道参数控制左声道装载控制RINMUTE
:静音控制RINVOL
:音量控制 - R2寄存器:
LRHPBOTH
:用左通道耳机参数控制右通道耳机输出LZCEN
:左通道过零检测使能LHPVOL
:左通道耳机输出音量控制 - R3寄存器:
RRHPBOTH
:用右通道耳机参数控制左通道耳机输出RZCEN
:右通道过零检测使能RHPVOL
:右通道耳机输出音量控制 - R4寄存器:
MICBOOST
:麦克风输入推子使能MUTEMIC
:麦克风静音控制。INSEL
:ADC输入选择(LININ MIC)BYPASS
:直通模式使能。DACSEL
:DAC输出选择,这里应该跟使能一个意思。SIDETONE
:侧音控制使能,应该跟回声抑制相关。SIDEATT
:抑制值。 - R5寄存器:
ADCHPD
:ADC高通滤波器的使能。DEEMP
:去加重控制DCAMU
:DAC软静音控制。HPOR
当高通滤波器禁用时存储直流偏移 - R6寄存器:电源管理相关。具体就不细说了。
- R7寄存器:
FORMAT
:控制IIS通讯接口的时序。IWL
:数据宽度。LRP
:控制LRCK信号的相位。LRSWAP
:DAC左右声音时钟交换。MS
:主从模式选择。BCLKINV
:BCLK反相。 - R8寄存器:
USB/NORMAL
:模式选择BOSR
:选择时LRCK跟BCLK时钟关系SR
:采样率控制CLKIDV2
:分频器控制CLKODIV2
:分频器控制 - R9寄存器:激活接口
- R15寄存器:软件复位芯片寄存器
四、关于IIC配置
下面的配置的代码:
#define WM8731_ADDR 0X1A //WM8731的器件地址,固定为0X1A
/*
*********************************************************************************************************************
@ Brief : WM8731写寄存器
@ Param : reg:寄存器地址 val:寄存器的值
@ Return : NONE
@ Author : YWJ(QQ:872180981)
@ Data : 2020-06-21 12:21
*********************************************************************************************************************
*/
uint8_t WM8731_Write_Reg(uint8_t reg,uint16_t val)
{
uint8_t rest=0;
xBSP_I2C_Simu_Start();
xBSP_I2C_Simu_Send_Byte((WM8731_ADDR<<1)|0);//发送器件地址+写命令
if(xBSP_I2C_Simu_Wait_Ack())return 1; //等待应答
xBSP_I2C_Simu_Send_Byte((reg<<1)|((val>>8)&0X01));//写寄存器地址+数据的最高位
if(xBSP_I2C_Simu_Wait_Ack())return 2;
xBSP_I2C_Simu_Send_Byte(val&0XFF); //发送数据
if(xBSP_I2C_Simu_Wait_Ack())return 3;
xBSP_I2C_Simu_Stop();
return 0;
}
/*
*********************************************************************************************************************
@ Brief : WM8731初始化函数
@ Param : NONE
@ Return : NONE
@ Author : YWJ(QQ:872180981)
@ Data : 2020-06-21 12:23
*********************************************************************************************************************
*/
uint8_t WM8731_Init(void)
{
uint8_t res;
//I2C_Send_Byte(0X1E00);//复位WM8731
res=WM8731_Write_Reg(0x0F,0); //软复位WM8731
if(res)return 1; //WM8731异常
WM8731_Write_Reg(0X00,0X017);
WM8731_Write_Reg(0X01,0X017);
//WM8731_Write_Reg(0X02,0X028);//左声道输出音量
//WM8731_Write_Reg(0X03,0X028);//右声道输出音量
WM8731_Write_Reg(0X04,0X010);
WM8731_Write_Reg(0X05,0X000);
WM8731_Write_Reg(0X06,0X002);//硬件中只使用到LINEIN,因此关掉了MICIN,根据实际需要配置
WM8731_Write_Reg(0X07,0X049);
WM8731_Write_Reg(0X08,0X000);
WM8731_Write_Reg(0X09,0X001);
return 0;
}
五、资料下载
以上相关的资料,我会整理放到网盘.包括 : 模拟IIC代码
WM8731配置代码
芯片数据手册
由于百度网盘会更新,可以进群看QQ公告.所以资料都会在同一个地址分享.
QQ:872180981
群号:339420387