1. 问题现象与背景分析
最近在调试杰理AC692X系列芯片时,发现一个奇怪的功耗问题:当我们在关机流程中关闭内置触摸功能后,有概率性出现首次烧录程序上电时,待机功耗异常升高到20μA以上的情况。这个现象在量产测试中尤为棘手,因为正常的待机功耗应该稳定在5μA以下。
经过多次复现测试,发现这个问题具有以下特征:
- 仅发生在第一次烧录后的首次上电
- 重复复位或重新上电后功耗恢复正常
- 与特定的关机时序有关
- 触摸IC的寄存器状态出现异常
注意:20μA的待机功耗对于纽扣电池供电的设备意味着续航时间从1年缩短到3个月,这对消费类电子产品是致命缺陷。
2. 硬件架构与功耗机制
2.1 杰理芯片的电源管理系统
AC692X采用多电压域设计,关键模块包括:
- 主控MCU(工作电流约1mA@32MHz)
- 触摸检测模块(正常休眠时约0.8μA)
- 电源管理单元(PMU)
- 各外设IO的上下电控制
在关机流程中,正确的下电顺序应该是:
- 关闭所有外设时钟
- 保存必要寄存器状态
- 关闭触摸模块
- 切断非保持域的电源
- 进入深度休眠模式
2.2 触摸模块的特殊性
杰理的内置触摸控制器采用电荷转移检测原理,其工作特点包括:
- 需要定期进行基准校准
- 对电源噪声敏感
- 状态寄存器需要特殊时序操作
- 自动唤醒功能依赖内部RC振荡器
我们在示波器上捕获到异常时的电源波形,发现触摸模块的VDDIO电源域在关机时有约50ms的缓慢下降过程(正常应<10ms),这可能导致状态机紊乱。
3. 问题根因定位
3.1 关键寄存器分析
通过J-Link读取异常状态下的寄存器,发现以下异常点:
| 寄存器地址 | 正常值 | 异常值 | 说明 |
|---|---|---|---|
| 0x40030020 | 0x0000 | 0x0101 | 触摸通道使能位未清零 |
| 0x4003005C | 0x55AA | 0x55XX | 校准数据校验错误 |
| 0x40030100 | 0x0000 | 0x8000 | 唤醒中断挂起 |
3.2 时序逻辑缺陷
在关机流程的代码中发现问题:
c复制void power_off_sequence() {
disable_touch(); // 立即关闭触摸时钟
save_context(); // 耗时约20ms的Flash操作
enter_sleep(); // 实际触摸模块还未完全下电
}
正确的顺序应该是:
c复制void safe_power_off() {
touch_pre_shutdown(); // 先发送停止命令
delay_ms(15); // 等待电荷释放
save_context();
disable_touch_clock();
enter_sleep();
}
4. 解决方案与验证
4.1 软件修复方案
修改后的关机流程实现要点:
- 增加触摸模块软关闭命令(写入0x40030004=0x5A)
- 插入15ms延时确保电荷释放
- 增加寄存器状态检查循环:
c复制while(REG_TOUCH_STATUS & 0x01) {
delay_us(100);
if(timeout++) force_reset();
}
4.2 硬件改进建议
对于已量产设备,建议在PCB上:
- 触摸传感器VDD端增加0.1μF+1μF去耦电容
- 检查触摸电极走线是否远离高频信号
- 在TPAD引脚串联100Ω电阻抑制振铃
4.3 测试数据对比
改进前后的功耗测试结果:
| 测试条件 | 改进前(μA) | 改进后(μA) |
|---|---|---|
| 首次上电 | 22.5±3.2 | 4.8±0.5 |
| 唤醒复位 | 5.1±0.3 | 4.7±0.2 |
| 低温-20℃ | 25.1±5.0 | 5.3±0.6 |
5. 生产环节的特殊处理
5.1 烧录器配置优化
在量产烧录工具中增加以下步骤:
- 烧录完成后自动复位三次
- 增加功耗自检项(阈值设为6μA)
- 异常批次自动重烧引导程序
5.2 老化测试方案
建议采用以下测试流程:
- 连续开关机100次(间隔2秒)
- 记录每次唤醒后的功耗值
- 检查触摸灵敏度参数偏移
- 高温(85℃)下验证稳定性
6. 深度优化技巧
6.1 低功耗设计要点
- 所有GPIO在休眠前必须配置为模拟输入
- 关闭未使用的时钟分频器
- 注意内部LDO的使能时序
- 使用以下命令检查漏电:
bash复制jlink.exe -device AC692X -command "mem 0x40000000,0x400FFFFF"
6.2 触摸参数调优
针对不同外壳材料,建议调整:
- 采样周期(默认16ms可延长至32ms)
- 灵敏度阈值(通过0x40030058寄存器)
- 自动校准间隔(修改0x40030060)
我在实际项目中发现,当采用金属面板时,需要将触摸检测的驱动电流从默认的2mA提升到4mA(修改0x40030044寄存器),同时将去抖次数从3次增加到5次,这样可以避免静电干扰导致的误唤醒。