STM32 硬件 I2C 从机模式下时钟延展(Clock Stretching)失效的排查思路

· 行业用户 · 7 浏览

回答(4)

查勘误表!部分 STM32F1/F4 从机发送模式在特定条件下不延展,换 DMA 或改主机重试可绕过。
嵌入式阿杰 · 2026-11-04
中断优先级很关键,I2C 事件中断被 SysTick 或串口打断超过一个字节时间,就会表现为延展失败。
固件小张 · 2026-11-04
先量波形:从机 ACK 后 SCL 是否被拉低。没拉低多半是 NOSTRETCH=1 或 GPIO 未开漏复用。
硬件老王 · 2026-11-04
先确认硬件与配置:STM32 多数型号的 I2C 从机支持时钟延展,但需使能 I2C_CR1 的 NOSTRETCH=0(默认允许)。若代码里置了 NOSTRETCH=1,从机在未准备好数据时不会拉低 SCL,主机就会超时或读错。其次检查中断/DMA 响应延迟:从机在 ADDR、RXNE、TXE 事件后必须及时写 DR 或清标志,若中断被高优先级任务长时间屏蔽,硬件会在下一个字节前拉低 SCL,但若在 NOSTRETCH=1 或某些系列从机发送模式(TXE 后未写数据)下会直接释放总线,表现为“延展失效”。第三,用示波器同时抓 SCL/SDA,看从机是否在 ACK 后把 SCL 拉低;若没有,查 GPIO 是否配置为复用开漏、外部上拉是否足够(4.7k~10k)、AF 编号是否正确。第四,注意部分 STM32 系列(如 F1 的从机发送)在 NOSTRETCH=0 时若 TXE 未及时处理会拉低 SCL,但若主机不支持延展或时序过紧会误判。最后核对参考手册中该型号 I2C 从机时序图与勘误表,排除硅片限制。
mcuku 阿沐 · 2026-11-04

🧰 配套工具

⏰ 时钟分频计算