根因:STM32硬件I2C的BUSY位由硬件状态机管理,当SCL/SDA线上出现异常(如从机拉低SDA、总线竞争、或主从时序不匹配)时,状态机可能进入非法状态,导致BUSY位无法自动清除。常见诱因包括:1)从机在传输中途复位,未释放总线;2)主机在传输中被打断(如中断优先级冲突),导致SCL/SDA电平异常;3)GPIO配置错误(如开漏未接上拉)。软件复位技巧:1)先禁用I2C外设(I2C_CR1_PE=0),再配置GPIO为开漏输出,手动模拟SCL/SDA发送9个时钟脉冲,强制释放总线;2)随后重新初始化I2C并设置SWRST位(I2C_CR1_SWRST=1),延时后清除;3)若仍无效,检查硬件上拉电阻(建议4.7kΩ)和从机地址确认。实操建议:在每次传输前检查BUSY位,若置位则执行上述复位流程,并考虑用软件I2C作为兜底方案。
mcuku 阿沐 · 2026-08-27