简介我们这个项目是一款移动电源设备该设备在不工作的时候在调试过程中发现在设备休眠时不断的唤醒设备会偶发设备死机现象怎么操作设备都没有反应。问题点现象当设备死机时我们发现这时候IIC死锁了也就是SDA, SCL电平都为低电平无法通信。问题偶发唤醒的时候IIC通信挂掉MCU出现死机现象案例中设备是低功耗设备设备休眠时会关闭IIC上拉电源以降低功耗外部从机有2个。一、先分析软件层面当IIC死锁复现时首先确认两个问题1.用STM32CubeProgrammer读取寄存器状态数据IIC配置时要把故障中断使能TCIE和ERRIE标志为1则表示故障中断已配置。I2C_CR1的寄存器TCIE和ERRIE配置IIC故障中断可以手动加入程序中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通信。因为两个从机在一个总线上当一个从机被写的时候同样另一路从机也在总线上虽然从机地址不同但是也有一定风险。
STM32 硬件 IIC 偶发总线死锁整机死机?软、硬维度排查IIC 故障思路
简介我们这个项目是一款移动电源设备该设备在不工作的时候在调试过程中发现在设备休眠时不断的唤醒设备会偶发设备死机现象怎么操作设备都没有反应。问题点现象当设备死机时我们发现这时候IIC死锁了也就是SDA, SCL电平都为低电平无法通信。问题偶发唤醒的时候IIC通信挂掉MCU出现死机现象案例中设备是低功耗设备设备休眠时会关闭IIC上拉电源以降低功耗外部从机有2个。一、先分析软件层面当IIC死锁复现时首先确认两个问题1.用STM32CubeProgrammer读取寄存器状态数据IIC配置时要把故障中断使能TCIE和ERRIE标志为1则表示故障中断已配置。I2C_CR1的寄存器TCIE和ERRIE配置IIC故障中断可以手动加入程序中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通信。因为两个从机在一个总线上当一个从机被写的时候同样另一路从机也在总线上虽然从机地址不同但是也有一定风险。