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

· 行业用户 · 4 浏览

回答(4)

别忘了总线恢复:主机超时后发9个SCL脉冲再STOP,否则从机可能一直挂住SCL导致下次通信失败。
硬件小刘 · 2026-10-28
主机不支持延展时,从机可在ADDR中断里预装首字节,后续用DMA搬运,基本消除拉低SCL的窗口。
I2C调试员 · 2026-10-28
优先查中断延迟:用GPIO翻转测ISR入口到写DR的时间,若超过主机超时的一半就要优化优先级和临界区。
嵌入式老张 · 2026-10-28
先确认时钟延展是否真的发生:用逻辑分析仪抓SCL,看从机在ADDR/TXE/RXNE等事件后是否拉低SCL超过主机超时阈值。常见根因有三类:1) 从机中断优先级过低或被长临界区阻塞,导致TXE/RXNE未及时响应而硬件自动拉低SCL;2) 从机在ADDR匹配后未及时写DR(发送方向)或读DR(接收方向),STM32 I2C外设会保持SCL低;3) 主机侧超时设置过短(如HAL的I2C_TIMEOUT仅几ms)。规避建议:把I2C从机中断设为较高优先级,缩短临界区,避免在中断中做耗时操作;发送方向提前把数据写入DR或使用DMA;接收方向保证每字节及时读走;主机侧适当增大超时并实现总线恢复(9个时钟脉冲+STOP)。若主机不支持时钟延展,则从机侧必须保证响应延迟小于主机超时,必要时改用软件模拟从机或降低速率。
mcuku 阿沐 · 2026-10-28

🧰 配套工具

⏰ 时钟分频计算