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