使用WM8978遇到一些问题的总结

2019-07-20 03:20发布

本帖最后由 lzq12 于 2017-3-13 09:58 编辑

按着原子哥F407探索者的图自己做了个板子,其中在使用声卡芯片WM8978时遇到了一些问题,目前总结一下
1.使用例程播放音乐时会有滋滋的电流声
2.播放音乐时,比如播放MP3,buffer、tempbuffer、audiodev.file这些使用外部SRAMEX时会直接导致内存溢出而死掉,只能用内存SRAMIN。audiodev.i2sbuf1、audiodev.i2sbuf2、audiodev.tbuf可以用外部SRAMEX,但是声音都变形了,使用内部SRAMIN是正常的


其实这两个问题是同一个原因引起的,因为在走线时,底层的I2S_MCLK走线和外部SRAM芯片顶层的数据走线形成了十字交叉,造成了互相干扰,导致外部SRAM在和WM8978同时工作不正常(外部SRAM单独使用时完全正常),走线问题解决后,一切正常了......


3.使用L2、R2作为声音采集输入,LOUT1、ROUT1作为声音输出时,L2、R2的声音直通LOUT1、ROUT1,完全无法关闭
对于问题3,按道理只要关闭了 WM8978内部结构图里 39 这个寄存器控制的位就能够让LOUT1、ROUT1不输出声音,但很遗憾的是完全不起作用啊,把所有能关的寄存器都关了,甚至58个寄存器全部写0也无法关闭,瞬间崩溃异常后来按着手册挨个查看寄存器的功能后,发现R1寄存器的第2位BUFIOEN有很大的作用,中文手册是这么解释的:WM8978的每一个模拟输出都可以单独的使能或者不使能,联合到模拟混合器的每一个输出可以单独的使能,所有输出都是默认不使能。为了节省电能,WM8978不用的部分应该保留不使能。输出可以在任何时间被使能,但当配置为推动模式时如果BUFIO被禁用或者BUFDCOP被停用不推荐这样做,因为这可能会导致弹出式噪音。
也就是说BUFIOEN位不置位,那没法对那些输出什么的寄存器进行开关控制。原子哥的配置是WM8978_Write_Reg(1,0X1B);也就是BUFIOEN位为0,把BUFIOEN位置位后则变成WM8978_Write_Reg(1,0X1F);这样一来,就可以直接控制相应的寄存器开关了,其他地方的配置也没有改什么,但L2、R2的声音不会直通LOUT1、ROUT1。至此,WM8978可以实现录音、放音以及录音的同时放音。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
28条回答
a3370
1楼-- · 2019-07-20 20:41
你好,请怎么操作使用L2 R2作为输入呢?根据规格书寄存器操作

寄存器地址位标志默认值描述R2 Power Management 22INPPGAENL0左通道输入PGA使能0=不使能1=使能3INPPGAENR0右通道输入PGA使能0=不使能1=使能
lzq12
2楼-- · 2019-07-20 21:58
 精彩回答 2  元偷偷看……
lzq12
3楼-- · 2019-07-21 00:26
 精彩回答 2  元偷偷看……
a3370
4楼-- · 2019-07-21 02:15
lzq12 发表于 2017-5-4 16:06
然后要使用的时候调用WM8978_Input_Cfg(0,1,0);WM8978_LINEIN_Gain(5);

我的还是没有声音代码:
WM8978_Init:
        WM8978_Write_Reg(1,0X1F);        //R1,MICENéèÖÃÎa1(MICê1Äü),BIASENéèÖÃÎa1(Ä£ÄaÆ÷1¤×÷),VMIDSEL[1:0]éèÖÃÎa:11(5K)
        WM8978_Write_Reg(2,0X1B0);        //R2,ROUT1,LOUT1êä3öê1Äü(¶ú»ú¿éòÔ1¤×÷),BOOSTENR,BOOSTENLê1Äü
        WM8978_Write_Reg(3,0X6C);        //R3,LOUT2,ROUT2êä3öê1Äü(à®°è1¤×÷),RMIX,LMIXê1Äü       
        WM8978_Write_Reg(6,0);                //R6,MCLKóéía2¿ìá1©
        WM8978_Write_Reg(43,1<<4);        //R43,INVROUT2·′&#207;ò,&#199;y&#182;ˉà&#174;°è
        WM8978_Write_Reg(47,1<<8);        //R47éè&#214;&#195;,PGABOOSTL,×óí¨μàMIC&#187;&#241;μ&#195;20±&#182;&#212;&#246;ò&#230;1<<8|
        WM8978_Write_Reg(48,1<<8);        //R48éè&#214;&#195;,PGABOOSTR,óòí¨μàMIC&#187;&#241;μ&#195;20±&#182;&#212;&#246;ò&#230;1<<8|
        WM8978_Write_Reg(49,1<<1);        //R49,TSDEN,&#191;a&#198;&#244;1yèè±£&#187;¤
        WM8978_Write_Reg(10,1<<3);        //R10,SOFTMUTE1&#216;±&#213;,128x2é&#209;ù,×&#238;&#188;&#209;SNR
        WM8978_Write_Reg(14,1<<3);        //R14,ADC 128x2é&#209;ù&#194;ê


void WM8978_Input_Cfg(u8 micen,u8 lineinen,u8 auxen)
{

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.
          
          if(lineinen)regval|=1<<6|1<<2;//??L2_2INPPGA,R2_2INPPGA
          else regval&=~(1<<6|1<<2); //??L2_2INPPGA,R2_2INPPGA
          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??  

}


然后
        WM8978_ADDA_Cfg(0,1);                //&#191;a&#198;&#244;ADC
        WM8978_Input_Cfg(0,1,0);        //&#191;a&#198;&#244;ê&#228;è&#235;í¨μà(MIC&LINE IN)
        WM8978_Output_Cfg(0,1);                //&#191;a&#198;&#244;BYPASSê&#228;3&#246;
        //WM8978_MIC_Gain(46);                //MIC&#212;&#246;ò&#230;éè&#214;&#195;
        WM8978_LINEIN_Gain(5);

这样还是没有声音
如果我改为
        WM8978_ADDA_Cfg(0,1);                //&#191;a&#198;&#244;ADC
        WM8978_Input_Cfg(1,1,0);        //&#191;a&#198;&#244;ê&#228;è&#235;í¨μà(MIC&LINE IN)
        WM8978_Output_Cfg(0,1);                //&#191;a&#198;&#244;BYPASSê&#228;3&#246;
        WM8978_MIC_Gain(46);                //MIC&#212;&#246;ò&#230;éè&#214;&#195;
        //WM8978_LINEIN_Gain(5);

MIC是可以输入声音的

很奇怪,是不是我配置还是问题

lzq12
5楼-- · 2019-07-21 08:07
 精彩回答 2  元偷偷看……
a3370
6楼-- · 2019-07-21 08:47
lzq12 发表于 2017-5-5 09:19
只录音时WM8978_Output_Cfg(0,0);试试,录音同时播放的用WM8978_Output_Cfg(1,0);试试

成功了,用L2 R2输入,之前问题是因为麦克风的问题(白做很多无用功
但现在又遇到个问题:

        WM8978_Output_Cfg(0,1); 用bypass 输出模式,没有按键开始录音

        L2 R2 一直输入音频,耳机开始会有声音,但是过了几秒声音变沙然后就没有了

       这个是什么原因呢,求助!!!!!!!

一周热门 更多>