使用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可以实现录音、放音以及录音的同时放音。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。