硬汉嵌入式论坛

 找回密码
 立即注册
查看: 375|回复: 2
收起左侧

WM8978通讯故障原因

[复制链接]

12

主题

147

回帖

183

积分

初级会员

积分
183
发表于 2025-6-26 11:41:18 | 显示全部楼层 |阅读模式
用逻辑分析仪看I2C两根线,完全没有信号。刚开始还想,难道芯片坏了不成。将STM32F429与WM8978的连线断开,I2C有信号,只是显示NACK而已。一接上I2C就完全没反应了,SCL和SDA都静默了。仔细看了看程序后,调整了初始化的顺序,再看信号,有了!看来,对codec芯片的了解还是不够深啊。
最终原因:
刚开始是先初始化I2S,然后再用I2C初始化WM8978,这种顺序WM8978直接不工作了。看来WM8978未初始前不能有MCLK之类的信号输入。
在看了各家的WM8978录音源码后,发现大家都是先初始化WM8978,然后再初始化I2S。看来这个顺序不能错啊。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-6-27 10:12:45 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

12

主题

147

回帖

183

积分

初级会员

积分
183
 楼主| 发表于 2025-6-30 11:15:43 | 显示全部楼层
本帖最后由 lvehe 于 2025-6-30 11:26 编辑

顺便分享一下LINE_IN(L2/R2)通过PGA(+32.25dB)和BOOST(+20dB)那一路径的方法,因为通常的例程都是经过最多增益6dB的BOOST路径,而经过PGA(+32.25dB)和BOOST(+20dB)之后,最大增益可以达到52.25dB。为避免几路信号混合,通常我的程序中是禁用MIC和AUX,只选LINE_IN,或者只用MIC,禁用LINE_IN和AUX。

//禁用+6dB的BOOST路径(左通道)

value = wm8978_read_reg(R47_LEFT_ADC_BOOST);
value &= ~(7 << 4);
wm8978_reg_write(R47_LEFT_ADC_BOOST | value);

//禁用+6dB的BOOST路径(右通道)
value = wm8978_read_reg(R48_RIGHT_ADC_BOOST);
value &= ~(7 << 4);
wm8978_reg_write(R48_RIGHT_ADC_BOOST | value);

//如果禁用MIC,可能已禁用PGA,此处恢复启用PGA
value = wm8978_read_reg(R02_POWER_MANAGEMENT2);
value |= (INPPGAENL | INPPGAENR);
wm8978_reg_write(R02_POWER_MANAGEMENT2 | value);

//如果禁用MIC,可能已经禁用LIN2INPPGA和RIN2INPPGA
//非常容易被忽略!启用LIN2INPPGA和RIN2INPPGA!
value = wm8978_read_reg(R44_INPUT);
value |= (L2_2INPPGA | R2_2INPPGA | LIN2INPPGA | RIN2INPPGA);
wm8978_reg_write(R44_INPUT | value);
微信截图_20250630110335.png
从图中箭头所指可以看出,如果不启用LIN2INPPGA和RIN2INPPGA,信号是没办法输入PGA的。而禁用MIC后,很多的程序都是直接禁用LIN2INPPGA和RIN2INPPGA,这就导致LINE_IN的信号没法输入PGA。所以不要认为LIN2INPPGA和RIN2INPPGA是专属MIC的,它的含义实际是指Left Input Negative和Right Input Negative,仅表明左通道和右通道的负引脚而已。

//通常大家用此作为MIC的增益,建议正本清源,作为PGA的增益
wm8978_reg_write(R45_LEFT_PGA_GAIN | gain);
wm8978_reg_write(R46_RIGHT_PGA_GAIN | gain | INPPGAUPDATE);

//增加20dB增益,如无需增益,可禁用
value = wm8978_read_reg(R47_LEFT_ADC_BOOST);
value |= PGABOOSTL;
wm8978_reg_write(R47_LEFT_ADC_BOOST | value);

//增加20dB增益,如无需增益,可禁用
value = wm8978_read_reg(R48_RIGHT_ADC_BOOST);
value |= PGABOOSTR;
wm8978_reg_write(R48_RIGHT_ADC_BOOST | value);
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-11 23:53 , Processed in 0.053535 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表