STM32 的I2C外设作为从机时,如何应对主机时钟拉伸和总线错误恢复?

· 3 浏览

回答(4)

补充:硬件上,确保SCL/SCK上拉电阻阻值合适(如4.7kΩ),并检查总线电容,若过长可降低速率。软件上,用状态机记录总线状态,错误后自动重试地址匹配。
硬件控阿杰 · 2026-08-27
补充:从机模式下,时钟拉伸是正常协议,但需限制拉伸时间(如<10ms),可用SysTick或定时器检测,超时后主动发送NACK并复位,防止主机挂死。
码农小飞 · 2026-08-27
补充:开启I2C的ERRIRQ中断,在错误处理中检查BERR/ARLO/AF标志,按优先级复位外设,并置位SWRST(I2C_CR1的SWRST)来彻底清状态,再重新配置。
嵌入式老周 · 2026-08-27
作为STM32 I2C从机,应对时钟拉伸需在硬件上使能时钟延长(I2C_CR1的NOSTRETCH=0),并在中断服务中快速处理数据,避免因软件延迟导致主机超时。总线错误恢复建议:1) 检测AF(应答失败)或BERR(总线错误)标志后,先清标志,再调用I2C_GenerateSTOP或复位外设(I2C_DeInit+Init)重建总线;2) 若主机持续拉伸,需配置超时机制(如使用定时器监控SCL低电平时间),超时后强制释放总线并重初始化;3) 在从机地址匹配中断中,务必先读SR1再读SR2以清除ADDR标志,防止死锁。实操中,建议使用DMA或中断+状态机,避免阻塞式轮询,并确保I2C时钟频率与主机匹配(如100kHz/400kHz)。若总线频繁错误,可考虑硬件复位引脚或I2C总线复用器隔离。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

⏰ 时钟分频计算