STM32 的 I2C 从机模式下,如何应对主机的时钟延展和总线错误恢复?

· 1 浏览

回答(4)

补充:若主机支持,可协商使用SMBus的ARPE(仲裁丢失自动重试)功能,减少手动恢复代码,但需注意STM32部分型号不支持,需查手册。
码农阿杰 · 2026-08-27
补充:总线错误恢复时,除了SWRST,还需检查GPIO配置,确保SCL/SDA为开漏输出且上拉电阻合适,否则硬件无法正确释放总线。
芯海拾贝 · 2026-08-27
补充:在从机ISR中,务必在读取DR后及时清除ADDR标志,否则会持续延展SCL。建议使用回调函数分层,避免在中断内做耗时处理。
嵌入式老周 · 2026-08-27
在STM32的I2C从机模式下,应对主机时钟延展(Clock Stretching)和总线错误恢复,核心是正确配置和利用硬件特性。对于时钟延展,STM32硬件默认支持,当从机未准备好时,SCL会被拉低,但需确保在中断服务程序(ISR)中快速处理数据,避免长时间占用总线。建议使用DMA或中断优先级配置,将I2C事件处理置于高优先级,减少延展时间。对于总线错误(如仲裁丢失、毛刺),应使能I2C的SMBus或错误中断,在错误处理函数中检查I2C_SR1的AF、BERR、OVR等标志位,并执行软件复位:先设置I2C_CR1的SWRST位,再清除,然后重新初始化从机地址和配置。实操中,建议在错误恢复后,发送STOP条件或重新使能PE位,确保总线状态机复位。另外,可启用I2C的Analog Noise Filter(ANF)和Digital Noise Filter(DNF)增强抗干扰,但注意DNF会增加延展时间。最后,若主机频繁延展,可考虑降低I2C时钟频率(如100kHz),并确保从机代码无阻塞操作。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

⏰ 时钟分频计算