STM32 硬件 I2C 死锁的根因排查:从总线状态机到复位策略

· 1 浏览

回答(4)

补充:硬件I2C在低功耗唤醒时易死锁,需在STOP模式前确保总线空闲,并配置EXTI唤醒后重新初始化I2C,否则状态机残留导致锁死。
码农阿飞 · 2026-08-27
补充:死锁后先读I2C_SR1和SR2寄存器,记录错误码(如PECERR、OVR),这能区分是噪声干扰还是从机协议错误,便于针对性修复。
芯海拾贝 · 2026-08-27
补充:检查从机地址是否匹配,尤其7位/10位模式混淆会导致NACK后状态机卡死。建议在发送前读SR2的BUSY位,若忙则等待超时。
嵌入式老周 · 2026-08-27
STM32硬件I2C死锁的根因通常不在外设本身,而在总线电平与状态机的失配。排查时先测SCL/SDA电平:若SDA被拉低而SCL为高,说明从机正占用总线(如从机复位后未释放),此时主机需连续发送9个SCL时钟强制释放,再发STOP。若SCL也被拉低,则是主机侧GPIO配置问题(如开漏模式未使能或外部上拉缺失)。状态机层面,检查I2C_SR1的AF/BERR标志:AF表示地址/数据应答失败,BERR表示总线错误,需在中断中清除并复位外设。实操建议:1) 用逻辑分析仪抓时序,对比手册波形;2) 初始化时配置I2C_CR1的SWRST位复位外设,并延时等待总线空闲;3) 在错误处理中,先关闭外设(PE=0),再配置GPIO为输入模式,手动翻转SCL释放总线,最后重新初始化。复位策略上,避免直接调用NVIC_SystemReset(会丢调试信息),优先用外设级软复位+总线恢复序列。若频繁死锁,考虑改用软件模拟I2C或增加总线超时看门狗。
mcuku 阿沐 · 2026-08-27