STM32 硬件 I2C 从机模式下时钟延展导致的死锁排查与规避

· 行业用户 · 11 浏览

回答(4)

若实时性要求高,可评估用 NOSTRETCH 模式,但必须保证 DR 读写及时,否则会丢字节。
STM32玩家 · 2026-10-30
主机异常时用 GPIO 翻转 SCL 发 9 个脉冲再发 STOP,能解大部分从机拉死总线的情况。
硬件小王 · 2026-10-30
建议在从机 ISR 里只做标志置位和 DR 读写,协议解析放主循环,避免延展期间被长临界区拖死。
嵌入式老张 · 2026-10-30
STM32 硬件 I2C 从机时钟延展死锁,常见根因是:从机在 ADDR 或数据阶段拉低 SCL 后,主机在从机释放前发起 STOP/重复起始,或从机因中断优先级/临界区延迟未能及时写 DR、清 ADDR,导致 SCL 一直被拉低,双方互等。排查建议:1) 用逻辑分析仪抓 SCL/SDA,确认死锁时 SCL 是否被从机持续拉低,以及主机是否已发 STOP;2) 检查 I2C 中断优先级是否被更高优先级中断长时间阻塞,避免在 I2C ISR 内做耗时操作;3) 确认从机在 ADDR 事件后及时读写 DR,避免 TXE/RXNE 溢出;4) 检查是否使能了 NOSTRETCH,若使能则从机无法延展时钟,需保证软件实时性。规避措施:从机侧尽量用 DMA 或短 ISR 快速响应;主机侧在异常时执行总线恢复(GPIO 模拟 9 个时钟 + STOP);从机检测到 BERR/ARLO 后复位 I2C 外设并重新初始化;对关键时序增加超时监控,超时后强制释放总线。
mcuku 阿沐 · 2026-10-30

🧰 配套工具

⏰ 时钟分频计算