一、Codec介绍
WM8978为DAC+ADC芯片,本身并不具备编解码的功能,一方面,可通过I2S接口接收PCM数据,转为模拟信号输出,此为DAC过程,即放音;一方面,可接收模拟信号转为数字信号,通过I2S接口传输给MCU,此为ADC过程,即录音。WM8978还使用I2C接口配置其工作参数,比如音量,EQ,3D环绕等。WM8978本身可直连1W/8欧的小喇叭。
引脚配置:
1、I2S和I2C的使能
首先需要打开config下usr_config.mk文件,打开编译I2S和I2C的使能
2、导入lal_audio文件
打开使能后进行编译,导入lal_audio文件,可见wm8978_init函数,对引脚进行使能:
3、WM8978的I2C配置
WM8978需要使用I2C引脚对输入方式、喇叭音量、输入增益等等进行控制,详情可见lal_audio中其它函数
如上图,进行初始化后即可对录音和放音进行测试;
4、WM8978录音测试
其中需要用到I2S的读写函数,本文件中设置的采集频率和位宽是16K和16位(方便后续语音识别)
使用二维数组缓存的方式进行读取和播放,经验证后满足要求。
hi_u32 WM8978_Write_Reg(hi_u8 reg, hi_u16 val)
{
//unsigned char buf[2];
//buf[0] = (reg< <1)|((val >>8)&0X01);
//buf[1] = val&0XFF;
hi_i2c_data i2c_data;
hi_u8 send_data[2]= { 0 };
send_data[0] = (reg< <1)|((val >>8)&0X01);
send_data[1] = val&0XFF;
/* send_data[0] = reg;
send_data[1] = val; */
i2c_data.send_buf = send_data;
i2c_data.send_len = 2;
//(WM8978_DEVICE_ADDR>>1)|0
wm8978_register_tbl[reg] = val;
// return hi_i2c_writeread(HI_I2C_IDX_1,(WM8978_DEVICE_ADDR< <1), &i2c_data);
//hi_i2c_write
return hi_i2c_write(HI_I2C_IDX_1,(WM8978_DEVICE_ADDR< <1), &i2c_data);
}
hi_u32 WM8978_Read_Reg(hi_u8 reg)
{
return wm8978_register_tbl[reg];
}
//WM8978 AUXR,AUXL(PWM音频部分)增益设置(AUXR/L-- >ADC输入部分的增益)
//gain:0~7,0表示通道禁止,1~7,对应-12dB~6dB,3dB/Step
void WM8978_AUX_Gain(hi_u8 gain)
{
hi_u16 regval;
gain&=0X07;
regval=WM8978_Read_Reg(47); //读取R47
regval&=~(7< <0); //清除原来的设置
WM8978_Write_Reg(47,regval|gain< <0);//设置R47
regval=WM8978_Read_Reg(48); //读取R48
regval&=~(7< <0); //清除原来的设置
WM8978_Write_Reg(48,regval|gain< <0);//设置R48
}
//WM8978 输出配置
//dacen:DAC输出(放音)开启(1)/关闭(0)
//bpsen:Bypass输出(录音,包括MIC,LINE IN,AUX等)开启(1)/关闭(0)
void WM8978_Output_Cfg(hi_u8 dacen,hi_u8 bpsen)
{
hi_u16 regval=0;
if(dacen)regval|=1< <0; //DAC输出使能
if(bpsen)
{
regval|=1< <1; //BYPASS使能
regval|=5< <2; //0dB增益
}
WM8978_Write_Reg(50,regval);//R50设置
WM8978_Write_Reg(51,regval);//R51设置
}
//WM8978 MIC增益设置(不包括BOOST的20dB,MIC-- >ADC输入部分的增益)
//gain:0~63,对应-12dB~35.25dB,0.75dB/Step
void WM8978_MIC_Gain(hi_u8 gain)
{
gain&=0X3F;
WM8978_Write_Reg(45,gain); //R45,左通道PGA设置
WM8978_Write_Reg(46,gain|1< <8); //R46,右通道PGA设置
}
//WM8978 L2/R2(也就是Line In)增益设置(L2/R2-- >ADC输入部分的增益)
//gain:0~7,0表示通道禁止,1~7,对应-12dB~6dB,3dB/Step
void WM8978_LINEIN_Gain(hi_u8 gain)
{
hi_u16 regval;
gain&=0X07;
regval=WM8978_Read_Reg(47); //读取R47
regval&=~(7< <4); //清除原来的设置
WM8978_Write_Reg(47,regval|gain< <4);//设置R47
regval=WM8978_Read_Reg(48); //读取R48
regval&=~(7< <4); //清除原来的设置
WM8978_Write_Reg(48,regval|gain< <4);//设置R48
}
//WM8978 DAC/ADC配置
//adcen:adc使能(1)/关闭(0)
//dacen:dac使能(1)/关闭(0)
void WM8978_ADDA_Cfg(hi_u8 dacen,hi_u8 adcen)
{
hi_u16 regval;
regval=WM8978_Read_Reg(3); //读取R3
if(dacen)regval|=3< <0; //R3最低2个位设置为1,开启DACR&DACL
else regval&=~(3< <0); //R3最低2个位清零,关闭DACR&DACL.
WM8978_Write_Reg(3,regval); //设置R3
regval=WM8978_Read_Reg(2); //读取R2
if(adcen)regval|=3< <0; //R2最低2个位设置为1,开启ADCR&ADCL
else regval&=~(3< <0); //R2最低2个位清零,关闭ADCR&ADCL.
WM8978_Write_Reg(2,regval); //设置R2
}
//WM8978 输入通道配置
//micen:MIC开启(1)/关闭(0)
//lineinen:Line In开启(1)/关闭(0)
//auxen:aux开启(1)/关闭(0)
void WM8978_Input_Cfg(hi_u8 micen,hi_u8 lineinen,hi_u8 auxen)
{
hi_u16 regval;
regval=WM8978_Read_Reg(2); //读取R2
if(micen)regval|=3< <2; //开启INPPGAENR,INPPGAENL(MIC的PGA放大)
else regval&=~(3< <2); //关闭INPPGAENR,INPPGAENL.
WM8978_Write_Reg(2,regval); //设置R2
regval=WM8978_Read_Reg(44); //读取R44
if(micen)regval|=3< <4|3< <0; //开启LIN2INPPGA,LIP2INPGA,RIN2INPPGA,RIP2INPGA.
else regval&=~(3< <4|3< <0); //关闭LIN2INPPGA,LIP2INPGA,RIN2INPPGA,RIP2INPGA.
WM8978_Write_Reg(44,regval);//设置R44
if(lineinen)WM8978_LINEIN_Gain(5);//LINE IN 0dB增益
else WM8978_LINEIN_Gain(0); //关闭LINE IN
if(auxen)WM8978_AUX_Gain(7);//AUX 6dB增益
else WM8978_AUX_Gain(0); //关闭AUX输入
}
//设置I2S工作模式
//fmt:0,LSB(右对齐);1,MSB(左对齐);2,飞利浦标准I2S;3,PCM/DSP;
//len:0,16位;1,20位;2,24位;3,32位;
void WM8978_I2S_Cfg(hi_u8 fmt,hi_u8 len)
{
fmt&=0X03;
len&=0X03;//限定范围
WM8978_Write_Reg(4,(fmt< <3)|(len< <5)); //R4,WM8978工作模式设置
}
//设置耳机左右声道音量
//voll:左声道音量(0~63)
//volr:右声道音量(0~63)
void WM8978_HPvol_Set(hi_u8 voll,hi_u8 volr)
{
voll&=0X3F;
volr&=0X3F;//限定范围
if(voll==0)voll|=1< <6;//音量为0时,直接mute
if(volr==0)volr|=1< <6;//音量为0时,直接mute
WM8978_Write_Reg(52,voll); //R52,耳机左声道音量设置
WM8978_Write_Reg(53,volr|(1< <8)); //R53,耳机右声道音量设置,同步更新(HPVU=1)
}
//设置喇叭音量
//voll:左声道音量(0~63)
void WM8978_SPKvol_Set(hi_u8 volx)
{
volx&=0X3F;//限定范围
if(volx==0)volx|=1< <6;//音量为0时,直接mute
WM8978_Write_Reg(54,volx); //R54,喇叭左声道音量设置
WM8978_Write_Reg(55,volx|(1< <8)); //R55,喇叭右声道音量设置,同步更新(SPKVU=1)
}
void I2C_TEST()
{
hi_u32 ret;
hi_io_set_func(HI_IO_NAME_GPIO_0, HI_IO_FUNC_GPIO_0_I2C1_SDA);
hi_io_set_func(HI_IO_NAME_GPIO_1, HI_IO_FUNC_GPIO_1_I2C1_SCL);
ret = hi_i2c_deinit(HI_I2C_IDX_1); /* if wake_up from deep sleep, should deinit first */
if (ret != HI_ERR_SUCCESS) {
printf("I2C delete errorrn");
return;
}
ret = hi_i2c_init(HI_I2C_IDX_1, 100000); /* baudrate: 100000 */
if (ret != HI_ERR_SUCCESS) {
printf("I2C errorrn");
return;
}
printf("IIC sucessfullyrn");
ret = WM8978_Write_Reg(0,0);
if (ret != HI_ERR_SUCCESS) {
printf("8978 errorrn");
printf("flash partition table init fail:0x%x rn", ret);
return;
}
printf("8978 passrn");
}
上一篇:如何通过运用不同的音频技术让普通声音也能焕发光彩
下一篇:微源半导体LP7811+LP4081的无线麦克风一拖一充电方案解析
- AD6673-250EBZ,用于 AD6673、250 MSPS 模数转换器的评估板
- 使用 Analog Devices 的 LTC2874IUHF#PBF 的参考设计
- OP284EPZ 单电源、3V 低噪声仪表放大器的典型应用
- 使用 Adafruit Industries 的 UG-2864HSWEG01 的参考设计
- L7808C升压稳压电路的典型应用
- MIKROE-3815,基于 TLI5012B E1000 角度传感器的 GMR 角度点击板
- ADP166CB-EVALZ,ADP166 LFCSP LDO 线性稳压器评估板
- AM9GH-2403SZ 3.3 Vout、9W 单路输出 DC-DC 转换器的典型应用
- TCR5SB16、200mA、1.6V 输出电压 CMOS 低压降稳压器的典型应用
- SLBLDC-MTR-RD,无传感器 BLDC 电机参考设计
- 发现之旅,让你身边的电源无处可藏!
- 数据采集系统设计原则与基本方法
- 泰克任意波形发生器,跨越成本极限,克服挑战
- 如何在FPGA设计环境中加时序约束
- dsPIC33 “EV”系列抢鲜知,读专题,赢豪礼
- 【晒月亮抢楼有礼】中秋月圆,千里共赏!
- 【EEWORLD第三十四届】2012年01月社区明星人物揭晓!
- Littelfuse第2期 | 符合AEC-Q200 车规的保险丝/熔断器
- Follow me第二季第1期来啦!与得捷一起解锁【Adafruit Circuit Playground Express】超能力!
- Silicon Labs EFM32PG22开发套件 传你所思 创你所想!申请进行时!