一、簡介
因一個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