0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

Harmony&嵌入式学习 来源:Harmony&嵌入式学习 作者:Harmony&嵌入式学 2023-06-14 10:24 次阅读

Gitee仓库:https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/dev/team_x/demo_record_pen
一、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");
}

审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PCM
    PCM
    +关注

    关注

    1

    文章

    195

    浏览量

    53160
  • 嵌入式
    +关注

    关注

    5068

    文章

    19014

    浏览量

    303132
  • 录音笔
    +关注

    关注

    0

    文章

    87

    浏览量

    13064
  • WM8978
    +关注

    关注

    1

    文章

    5

    浏览量

    3702
  • Hi3861
    +关注

    关注

    1

    文章

    59

    浏览量

    6448
收藏 人收藏

    评论

    相关推荐

    专业设计录音笔

    `本人专业设计录音笔,包括软件硬件!主要开发炬力 安凯等方案!开发设计过联想 纽曼 现代等多家知名品牌的录音笔!如有需要请QQ1292841172。`
    发表于 03-07 15:29

    录放音电话设计问题

    本帖最后由 gk320830 于 2015-3-8 02:05 编辑 语音芯片ISD4004如何与电话连接才能实现对电话的录放音呢?录音由电话话筒录入,放音到电话话筒,谢谢!
    发表于 03-27 11:25

    wm8978的lout和rout没有输出

    这一路稍微和历程的配置有点不一样。我们用Rout1和Lout1做的。附件如下图所示:用sai的那一路播放和录音都正常,但是wm8978这一路没有声音,我们量Rout1和Lout1引脚也没有电平,输入
    发表于 01-24 23:57

    请问音频芯片WM8978双通道录音时左右通道录的数据是怎么存储的?

    请问各位音频芯片WM8978双通道录音时,左右通道录得数据是以怎样的规则存储的???
    发表于 02-13 05:43

    请问m8960 wm8974 wm8978 wm8994 一系列音频接口芯片在录放音的音质上有提升吗?

    wm8960 wm8974 wm8978 wm8994,这一系列音频接口芯片,在录放音的音质上有没有提升? 或者只是通道数量的差别?看了看立
    发表于 02-19 06:02

    数据传输进行录音时进不去中断

    设计的录放一体的声卡,进行播放的时候,数据传输完成可以进入中断的,正常播放音频,为什么进行录音的时候,进不去中断呢?IIS DMA设置的都正确啊,求大神指点一下。用的是STM32探索者和WM8
    发表于 02-28 00:26

    wm8978实现了录音和播放音乐但无法修改音量

    最近用wm8978来实现音乐播放功能,现在已经可以正常录音,也可以播放wav音频,mp3用mcu来解码后也可以正常播放,但遇到个问题,wm8978的MCLK是通过mcu提供的,在播放音
    发表于 03-04 23:37

    wm8978录音回放改成24位调不通

    wm8978的寄存器R4,将数据长度改为243,修改接收(录音)和发送(放音)中断函数。以录音为例,改为24位数据后需要四次中断才能接收到两个声道的24位数据以左声道的两次数据为例,按
    发表于 03-16 04:35

    I2S总线是怎样驱动WM8978

    接口只有一个数据引脚,因此在设计引脚的时候,就需要确定是录音还是放音WM8978为DAC+ADC芯片,本身并不具备编解码的功能。1)WM8978可通过I2S接口接收PCM数据,转为模
    发表于 01-05 07:10

    wm8978音频回环

    有大佬知道为啥wm8978采集的音频数据一直是高电平吗(位时钟信号和对齐信号都是有效信号)
    发表于 10-22 10:24

    Hi3861:智能录音笔【环境搭建+配网】

    。二、项目内容(1)选用Hi3861芯片开发;(2)使用Codec_Wm8978实现收音放音;(3)使用WIFI_AP_STA实现WEB配网;(4)使用云服务语音API识别实现语音识别;三、编译环境
    发表于 12-31 10:35

    Hi3861:智能录音笔WM8978录放音

    进行使能:3、WM8978的I2C配置WM8978需要使用I2C引脚对输入方式、喇叭音量、输入增益等等进行控制,详情可见lal_audio中其它函数如上图,进行初始化后即可对录音放音
    发表于 12-31 10:41

    录放音电路

    录放音电路主要由ISD4003和89C2051-2两个主IC构成。
    发表于 04-09 17:02 5735次阅读
    <b class='flag-5'>录放音</b>电路

    WM8978数据手册

    WM8978数据手册好资料有需要的下来看看
    发表于 12-16 22:45 111次下载

    wm8978模块原理图

    wm8978模块原理图免费下载。
    发表于 05-15 09:19 23次下载