最近在调试杰理AC692X系列蓝牙芯片时,遇到一个颇为棘手的音频通路问题:当设备处于linein模式时,如果开启混合录音功能后再关闭录音,会导致从机设备完全无声。这个现象在真无线立体声(TWS)耳机应用中尤为致命,因为主从机之间的音频同步是核心功能。
经过示波器抓取I2S信号和寄存器状态分析,发现问题出在音频路由切换时的状态机冲突。具体表现为:
AC692X采用双DSP设计,其中:
code复制[LineIn] --> [ADC] --> |
|--> [Mixer] --> [I2S Master]
[麦克风] --> [ADC] --> |
混合录音功能实质是通过配置0x1F寄存器组的BIT3-5位来控制各通路增益。
在TWS主从模式下,音频传输存在两个关键路径:
问题发生时,从机的WS(Word Select)信号持续保持高电平,表明主控错误地关闭了时钟发生器。
通过JTAG读取关键寄存器状态:
c复制// 问题出现时的异常寄存器值
AUDIO_CTRL = 0x84; // 混合模式标志未清除
I2S_MASTER = 0x00; // 从机时钟使能位被复位
使用逻辑分析仪捕获的异常时序:
| 信号线 | 正常状态 | 异常状态 |
|---|---|---|
| BCLK | 1.5MHz | 0Hz |
| LRCK | 44.1kHz | 高电平 |
| SDATA | 有数据 | 浮空 |
在SDK的audio_manager.c中增加状态检查:
c复制void close_mix_record(void) {
// 新增状态保存
uint8_t prev_mode = get_audio_mode();
// 原有关闭逻辑
hal_audio_disable_mixer();
// 修复代码:强制恢复时钟
if(prev_mode == LINEIN_MODE) {
i2s_slave_enable(1); // 重新激活从机时钟
update_dac_path(LINEIN_TO_DAC);
}
}
正确的操作流程应为:
设计自动化测试脚本模拟用户操作:
python复制def test_linein_switch():
enter_linein_mode()
start_mix_record()
for i in range(100): # 压力测试
stop_record()
assert i2s_slave_active(), "从机时钟异常"
start_mix_record()
修复前后的关键参数对比:
| 指标 | 修复前 | 修复后 |
|---|---|---|
| 模式切换耗时 | 320ms | 28ms |
| 从机失锁率 | 100% | 0% |
| 功耗波动 | ±15mA | ±3mA |
在PCB布局阶段需要注意:
建议增加以下保护措施:
c复制// 在音频驱动底层添加看门狗
void audio_watchdog(void) {
if(I2S->STATUS & CLOCK_LOST) {
reinit_i2s_clock();
notify_bt_controller();
}
}
遇到类似音频通路问题时,可按以下步骤排查:
基础检查
信号测量
bash复制# 使用示波器触发设置
trigger_type = edge
trigger_level = 1.65V
holdoff_time = 100ns
寄存器诊断
在调试此类音频通路问题时,有几个关键心得:
这次问题特别提醒我们:在实现混合音频功能时,必须完整考虑所有可能的状态迁移路径,特别是非常规操作序列下的边界条件。