STM32 硬件 I2C 从机在时钟拉伸时卡死的根因分析与规避方案

· 行业用户 · 9 浏览

回答(4)

加 ERR 中断处理,BERR 后必须 DeInit 再 Init,否则状态机停在 BUSY,后续所有传输都失败。
STM32老兵 · 2026-11-04
从机中断里别做 Flash 操作,把数据丢进环形缓冲,主循环处理,SCL 拉伸时间立刻降下来。
嵌入式小刘 · 2026-11-04
先查主机是否支持时钟拉伸,很多 MCU 主机默认超时仅几十微秒,从机稍慢就复位总线,从机自然卡死。
硬件老张 · 2026-11-04
STM32 硬件 I2C 从机在时钟拉伸时卡死的根因通常不在从机本身,而在主机侧或总线状态。常见根因有三类:1) 主机不支持或未正确处理 SCL 低电平拉伸,超时后复位总线,从机仍停在等待释放 SCL 的状态;2) 从机在 ADDR/TXE/RXNE 中断中执行过长操作(如 Flash 写、阻塞延时),导致 SCL 被拉低过久,主机判定总线错误;3) 从机 ERR 中断未清除或 BERR/ARLO 后未重新初始化外设,I2C 状态机锁死。规避方案:从机中断服务函数只做数据搬运,耗时操作移到主循环;使能 ERR 中断并在 BERR/ARLO 时执行 I2C_DeInit 后重新初始化;主机侧增加 SCL 拉伸超时与总线恢复(发送 9 个时钟);必要时改用 GPIO 模拟从机或降低速率。
mcuku 阿沐 · 2026-11-04

🧰 配套工具

⏰ 时钟分频计算