本帖最后由 liao6 于 2025-11-12 15:19 编辑
#申请原创#
@21小跑堂
简介 我们这个项目是一款移动电源设备,该设备在不工作的时候,在调试过程中发现,在设备休眠时不断的唤醒设备,会偶发设备死机现象,怎么操作设备都没有反应。
问题点:
现象:当设备死机时,我们发现这时候IIC死锁了,也就是SDA, SCL电平都为低电平,无法通信。
问题:偶发唤醒的时候,IIC通信挂掉,MCU出现死机现象?
案例中设备是低功耗设备,设备休眠时会关闭IIC上拉电源,以降低功耗,外部从机有2个。
一、先分析软件层面
当IIC死锁复现时,首先确认两个问题:
1.用STM32CubeProgrammer读取寄存器状态数据,IIC配置时要把故障中断使能,TCIE和ERRIE标志为1,则表示故障中断已配置。
I2C_CR1的寄存器TCIE和ERRIE
配置IIC故障[color=rgb(78, 161, 219) !important]中断,可以手动加入程序中:
2.PE标志位置1就是说明IIC已经使能,等效于__HAL_I2C_ENABLE(&hi2c1);BUSY标志位置1说明硬件已经开始,没有问题。
IIC寄存器数据没有问题,说明软件是OK的,那么,再从硬件角度分析。
二、分析硬件
1.IIC上拉电源是否稳定?
2.IIC上拉电阻阻值是否合适?一般1~10K。
3.IIC电源的电容是否过大?
4.一主多从通信,是否都为读数据?如果有一路有写数据,要分时去通信,避免数据交叉通信。
5.主机、从机是否都为硬件IIC?
经过以上排查,基本问题可以解决。
最终经过和供应商技术支持沟通,问题出在STM32的IIC是硬件IIC,而充电管理IC的IIC是软件模拟IIC,这就是硬件IIC和模拟IIC通信,时序无法保证一致,当软件模拟的IIC应答超时,硬件IIC就会进入死锁状态,现象就是死机。
重要提示:IIC总线通信时,如果设计为一主多从时,主机为硬件IIC,从机也得是硬件IIC,从机是软件模拟IIC时,那么主机最好也设计为模拟IIC,否则,在写数据时有可能会出现总线死锁。
另外,一主多从通信时,最好都是只读数据,如果有一个从机有写数据,要单独一路IIC通信。因为两个从机在一个总线上,当一个从机被写的时候,同样另一路从机也在总线上,虽然从机地址不同,但是也有一定风险。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|