STM32 的 I2C 从机模式:如何应对主机时钟拉伸与多字节读写时的总线错误?

· 2 浏览

回答(4)

总线错误常源于地址冲突或时序不匹配,可尝试降低I2C速率(如100kHz),并检查上拉电阻阻值(典型4.7kΩ),确保SCL/SDA电平转换稳定。
硬件工程师阿杰 · 2026-08-27
多字节读写时,建议使用I2C_DMA,并设置DMA的循环模式,同时监控DMA传输完成标志,防止缓冲区溢出导致总线挂死。
码农小陈 · 2026-08-27
时钟拉伸时,从机应尽快释放SCL,可配置I2C_CR2的ITBUFEN和ITEVTEN中断,在EVT中断中快速处理数据,避免在ISR中做耗时操作。
嵌入式老周 · 2026-08-27
针对STM32 I2C从机模式,应对主机时钟拉伸与多字节读写总线错误,核心是启用硬件超时(I2C_TIMINGR中的SCLDEL/SDADEL)并配合中断优先级管理。时钟拉伸时,从机需在SCL低电平期间保持数据稳定,建议使用DMA或中断而非阻塞轮询,避免因CPU占用导致SCL超时。多字节读写时,务必检查NACK和AF(应答失败)标志,并在每次传输后清空SR1寄存器(如I2C1->SR1 = 0),防止残留错误。实操中,配置I2C_CR1的NOSTRETCH=0(默认允许拉伸),但设置I2C_TIMEOUTR的TIMEOUTEN=1,超时值设为主机最大拉伸时间的1.5倍。若总线错误(BERR)频繁,需在错误中断中复位I2C外设(如I2C_Cmd(DISABLE)再ENABLE),并重新初始化从机地址。建议用逻辑分析仪抓取波形,确认主机是否在从机未就绪时发起传输,必要时在从机地址匹配中断中预置缓冲区。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

⏰ 时钟分频计算