1. 问题现象与背景分析
最近在调试杰理AC690X系列芯片的扩音器模式时,遇到一个棘手问题:当系统正在播放提示音(如"蓝牙已连接")时,如果突然被用户操作打断(比如按下暂停键),扬声器会持续输出刺耳的"滋滋"杂音。这个问题在客户现场被多次投诉,严重影响用户体验。
杰理蓝牙方案在消费电子领域应用广泛,其低功耗、高集成度的特点使其成为TWS耳机、便携音箱等产品的首选。但在实际开发中,我们发现其音频处理流程存在一些边界场景的兼容性问题。特别是在使用内置DAC直推扬声器的扩音器模式下,音频通道的状态管理尤为关键。
提示:这个问题在杰理AC69系列和AC79系列芯片上均有复现,与具体的蓝牙协议栈版本无关,更多是音频驱动层的状态机处理逻辑缺陷。
2. 问题根因定位过程
2.1 初步现象复现
搭建测试环境:
- 硬件:AC6905A开发板 + 4Ω/3W扬声器
- 软件:SDK版本v1.3.2.7
- 操作步骤:
- 进入扩音器模式(配置PA_MODE=1)
- 触发系统提示音播放(如调用audio_play_system_tone())
- 在提示音播放中途按下物理按键触发打断
- 观察到扬声器持续输出白噪声
通过逻辑分析仪抓取I2S信号发现:打断操作后,DAC仍在持续输出非零采样值,但数据内容呈现随机噪声特征。
2.2 关键代码分析
在SDK的audio_drv.c中,找到关键处理逻辑:
c复制void audio_stream_stop(void) {
dac_data_stop(); // 停止DAC数据供给
audio_pa_ctrl(0); // 关闭功放
// 缺失状态清理代码
}
问题出在打断播放时,系统仅停止数据流但未重置DAC寄存器。杰理芯片的DAC在无数据输入时会保持最后输出状态,而功放的突然关闭导致输出端产生瞬态噪声。
2.3 硬件层面验证
使用示波器测量PA_EN引脚和DAC_OUT波形:
- 正常播放时:PA_EN先拉高,DAC_OUT输出正弦波
- 打断瞬间:PA_EN立即拉低,但DAC_OUT仍保持高电平
- 问题根源:功放关闭速度快于DAC复位(约3ms时差)
3. 解决方案设计与实现
3.1 软件修复方案
修改audio_stream_stop()函数:
c复制void audio_stream_stop(void) {
dac_data_stop();
dac_reset(); // 新增:复位DAC寄存器
delay_ms(5); // 等待DAC完全放电
audio_pa_ctrl(0);
}
同时需要在audio_drv_init()中添加:
c复制void audio_drv_init(void) {
// 原有初始化代码...
dac_set_auto_mute(1); // 启用DAC自动静音
}
3.2 硬件辅助方案
对于已量产无法升级固件的设备,建议在硬件上:
- 在PA输出端增加RC放电电路(如100Ω+100nF)
- 将PA_EN引脚上拉改为10kΩ弱上拉
- 在DAC_OUT和PA之间串联100μF隔直电容
实测表明,硬件修改可将噪声幅度降低60%,但无法完全消除。
4. 完整测试验证流程
4.1 单元测试用例
编写自动化测试脚本:
python复制def test_audio_interrupt():
play_tone("connect") # 播放连接提示音
press_button("pause") # 模拟打断操作
measure_noise() # 检测噪声幅度
assert noise < 10mV # 验收标准
4.2 实际场景测试矩阵
| 测试场景 | 操作步骤 | 预期结果 | 实测结果 |
|---|---|---|---|
| 蓝牙连接提示音打断 | 连接设备时快速按暂停 | 立即静音 | PASS |
| 低电量提示音打断 | 播放中拔出充电器 | 无爆音 | PASS |
| 连续快速打断 | 1秒内多次启停 | 无累积噪声 | PASS |
4.3 长期稳定性测试
在高温(45℃)环境下连续运行72小时,进行10万次打断测试,未出现噪声复发。
5. 经验总结与延伸建议
5.1 关键教训
- 状态机设计缺陷:音频驱动应实现完整的状态迁移图,特别是异常路径处理
- 时序敏感性:功率器件控制信号要与数据流严格同步
- 硬件协同设计:关键信号线要预留调试接口(如测试点)
5.2 其他可能引发类似问题的场景
- 蓝牙模式切换时的POP声
- 充电插入检测音与音乐播放冲突
- 多定时器中断抢占音频任务
5.3 杰理SDK使用建议
- 在调用任何audio_play_xxx()前先检查当前状态
- 避免在中断上下文中直接操作音频硬件
- 对于AC79系列芯片,建议启用硬件淡入淡出功能:
c复制audio_fade_enable(1, 50); // 50ms渐变时间
这个问题暴露出嵌入式音频系统设计中一个典型问题——数字域和模拟域的协同控制。在实际产品中,类似问题还可能出现在麦克风通道切换、EQ参数动态调整等场景。通过这次排查,我们总结出一套适用于杰理平台的标准音频问题排查流程:
- 先用逻辑分析仪确认数字信号时序
- 用示波器观察模拟域波形
- 在安静环境中进行人耳主观测试
- 最后进行自动化压力测试
对于正在使用杰理蓝牙方案开发的同行,建议特别注意SDK中以下关键函数的使用:
- audio_pa_ctrl()的调用时机
- dac_data_stop()与dac_reset()的配合
- 系统tone播放的优先级设置
