本帖最后由 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可以实现录音、放音以及录音的同时放音。
寄存器地址位标志默认值描述R2 Power Management 22INPPGAENL0左通道输入PGA使能0=不使能1=使能3INPPGAENR0右通道输入PGA使能0=不使能1=使能
我的还是没有声音代码:
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·′Ïò,Çy¶ˉà®°è
WM8978_Write_Reg(47,1<<8); //R47éèÖÃ,PGABOOSTL,×óí¨μàMIC»ñμÃ20±¶Ôöòæ1<<8|
WM8978_Write_Reg(48,1<<8); //R48éèÖÃ,PGABOOSTR,óòí¨μàMIC»ñμÃ20±¶Ôöòæ1<<8|
WM8978_Write_Reg(49,1<<1); //R49,TSDEN,¿aÆô1yèè±£»¤
WM8978_Write_Reg(10,1<<3); //R10,SOFTMUTE1رÕ,128x2éÑù,×î¼ÑSNR
WM8978_Write_Reg(14,1<<3); //R14,ADC 128x2éÑùÂê
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); //¿aÆôADC
WM8978_Input_Cfg(0,1,0); //¿aÆôêäèëí¨μà(MIC&LINE IN)
WM8978_Output_Cfg(0,1); //¿aÆôBYPASSêä3ö
//WM8978_MIC_Gain(46); //MICÔöòæéèÖÃ
WM8978_LINEIN_Gain(5);
这样还是没有声音
如果我改为
WM8978_ADDA_Cfg(0,1); //¿aÆôADC
WM8978_Input_Cfg(1,1,0); //¿aÆôêäèëí¨μà(MIC&LINE IN)
WM8978_Output_Cfg(0,1); //¿aÆôBYPASSêä3ö
WM8978_MIC_Gain(46); //MICÔöòæéèÖÃ
//WM8978_LINEIN_Gain(5);
MIC是可以输入声音的
很奇怪,是不是我配置还是问题
成功了,用L2 R2输入,之前问题是因为麦克风的问题(白做很多无用功
但现在又遇到个问题:
WM8978_Output_Cfg(0,1); 用bypass 输出模式,没有按键开始录音
L2 R2 一直输入音频,耳机开始会有声音,但是过了几秒声音变沙然后就没有了
这个是什么原因呢,求助!!!!!!!
一周热门 更多>