STM32 的 I2C 从机模式下,如何应对主机时钟拉伸导致的超时死锁?

· 2 浏览

回答(4)

补充:从机侧也可考虑用软件模拟I2C,完全控制时序,但会占用CPU。硬件超时是首选,若芯片不支持,可外接看门狗或GPIO检测SCL状态,超时强制拉低复位。
硬件小飞侠 · 2026-08-27
补充:若使用DMA传输,超时恢复时需同时停止DMA并清空FIFO,否则残留数据会导致后续通信错乱。建议用定时器辅助监控SCL电平,双重保险。
码农阿杰 · 2026-08-27
补充:在中断服务函数中,务必先读SR1/SR2清标志,再复位外设,否则可能二次进入中断。可加一个软件状态机,标记总线恢复后重新进入监听模式。
嵌入式老周 · 2026-08-27
在STM32 I2C从机模式下应对主机时钟拉伸导致的超时死锁,核心是启用硬件超时机制(I2C_TIMEOUT)并配置SCL低电平超时检测。具体实操:1)在I2C初始化时,设置TIMEOUTA/B寄存器,使能SCL低电平超时(如STM32F4的I2C_TimeoutA_Enable),超时值建议设为主机最大拉伸时间的1.5倍(例如主机拉伸≤10ms,则设15ms);2)在超时中断(I2C_IT_TIMEOUT)中,先复位I2C外设(I2C_DeInit后重新Init),再清除错误标志,避免总线挂死;3)若使用HAL库,可调用HAL_I2C_Listen_IT并注册ErrorCallback,在回调中检查HAL_I2C_ERROR_TIMEOUT,执行恢复流程。注意:超时值不宜过小,否则误触发;同时需确保从机在超时后能释放SCL,避免与主机冲突。若主机频繁拉伸,建议在应用层增加总线重同步逻辑,或改用硬件I2C的NOSTRETCH模式(部分STM32支持)。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

⏰ 时钟分频计算