Hi3861:智能录音笔【WM8978录放音】

发布时间:2023-10-19  

一、Codec介绍
WM8978为DAC+ADC芯片,本身并不具备编解码的功能,一方面,可通过I2S接口接收PCM数据,转为模拟信号输出,此为DAC过程,即放音;一方面,可接收模拟信号转为数字信号,通过I2S接口传输给MCU,此为ADC过程,即录音。WM8978还使用I2C接口配置其工作参数,比如音量,EQ,3D环绕等。WM8978本身可直连1W/8欧的小喇叭。

Hi3861:智能录音笔【WM8978录放音】-开源基础软件社区


引脚配置:

Hi3861:智能录音笔【WM8978录放音】-开源基础软件社区


1、I2S和I2C的使能
首先需要打开config下usr_config.mk文件,打开编译I2S和I2C的使能

Hi3861:智能录音笔【WM8978录放音】-开源基础软件社区


2、导入lal_audio文件
打开使能后进行编译,导入lal_audio文件,可见wm8978_init函数,对引脚进行使能:

Hi3861:智能录音笔【WM8978录放音】-开源基础软件社区


3、WM8978的I2C配置
WM8978需要使用I2C引脚对输入方式、喇叭音量、输入增益等等进行控制,详情可见lal_audio中其它函数

Hi3861:智能录音笔【WM8978录放音】-开源基础软件社区


如上图,进行初始化后即可对录音和放音进行测试;
4、WM8978录音测试
其中需要用到I2S的读写函数,本文件中设置的采集频率和位宽是16K和16位(方便后续语音识别)

Hi3861:智能录音笔【WM8978录放音】-开源基础软件社区


使用二维数组缓存的方式进行读取和播放,经验证后满足要求。

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");

}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>