[其他产品] STM32 IIC总线死锁问题总结

[复制链接]
679|0
liao6 发表于 2025-10-21 14:21 | 显示全部楼层 |阅读模式
, , IIC总线, , AC
本帖最后由 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通信。因为两个从机在一个总线上,当一个从机被写的时候,同样另一路从机也在总线上,虽然从机地址不同,但是也有一定风险。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

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

本版积分规则

119

主题

287

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部