STM32 的 I2C 从机模式在时钟拉伸时,如何用硬件超时防止总线死锁?

· 1 浏览

回答(4)

注意时钟拉伸超时值要大于主机最慢的SCL周期,避免误触发。可参考I2C规范,标准模式超时建议35ms,快速模式10ms。
硬件工程师阿杰 · 2026-08-27
建议在从机地址匹配中断里启动一个硬件定时器(如TIM2),超时后强制拉高SCL并复位I2C,同时记录错误日志,便于调试总线异常。
码农小飞 · 2026-08-27
补充:用I2C的SMBus模式自带超时寄存器(如STM32F1的CR2的TIMEOUT),设置SMBA和SMBTYPE,超时自动产生错误,比手动定时器更省资源。
嵌入式老周 · 2026-08-27
在STM32的I2C从机模式下,时钟拉伸(SCL被从机拉低)是流控机制,但若主机异常或从机固件卡死,总线会永久锁死。硬件超时方案推荐使用I2C外设自带的SCL超时检测(如STM32F4/F7系列的I2C_TIMINGR寄存器中的SCLDEL和SCLHIGH字段),或利用独立看门狗(IWDG)监控I2C状态机。实操建议:1) 配置I2C的SCL超时中断(如I2C_CR1的SMBUS和ENARP位,或使用SMBus模式的TIMEOUT寄存器),设定合理超时值(如10ms),超时后触发错误中断,在中断中复位I2C外设(I2C_CR1的SWRST)并重新初始化;2) 若MCU不支持硬件超时,可用定时器输入捕获监测SCL电平,超过阈值则软件复位I2C;3) 务必在从机中断服务程序中避免长时间阻塞(如禁止在I2C中断里做耗时操作),并启用DMA或中断嵌套优先级管理。注意:复位I2C前需释放SCL/SDA线(配置为开漏输出并置高),防止与主机冲突。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

⏰ 时钟分频计算