使用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条回答
lzq12
1楼-- · 2019-07-21 14:26
a3370 发表于 2017-5-10 17:34
成功了,用L2 R2输入,之前问题是因为麦克风的问题(白做很多无用功)
但现在又遇到个问题:

WM8978_Output_Cfg(0,1);这个是指打开混频输出,就是让L2 R2的声音也跟着输出到OUT口,如果是为了测试,可以打开,但如果是单纯的录音或者录音和放音(播放其他音源),就要用WM8978_Output_Cfg(0,0);关掉混频输出。但你这个打开混频输出,但只有前面几秒钟听到,后面就没有了,意思是能听到正常的声音还是就是声音音调等变了的?这个问题你得看看有没有在其他地方把混频的给关闭了,关于混频的关闭,还是有几个寄存器的,可以参考那个内部结构图看的呢,原子哥有个WM8978中文手册,我也是里面的做对照,但有几个地方手册上好像说得不对,这个得检验一下的
a3370
2楼-- · 2019-07-21 16:50
 精彩回答 2  元偷偷看……
lzq12
3楼-- · 2019-07-21 17:15
a3370 发表于 2017-5-12 15:52
问题解决了,谢谢!

那你这个混频声音不输出是什么原因呢,希望能了解一下原因和解决方法,为其他网友做个参考
qiangqiang2987
4楼-- · 2019-07-21 17:38
买了块简易的WM8978开发板 引出了I2S和I2C和SDIN,SDOUT。时序和codec相关配置好了后,往SDIN写入数据0xaaaa的时候,喇叭耳机毫无输出。用的不是STM32。
是我寄存器配置没弄好么,参考的是楼主和原子哥的.还是我的数据有问题。

另外录音和放音的概念不是很懂 ,是往SDIN写入数据然后SDOUT返回录音数据么
qiangqiang2987
5楼-- · 2019-07-21 19:59
 精彩回答 2  元偷偷看……
qiangqiang2987
6楼-- · 2019-07-22 00:43
思考一下,感觉录音就是L2 R2通过咪头输入,然后SDOUT输出吧
放音应该就是SDIN输入,然后喇叭和耳机输出吧

一周热门 更多>