I2C死锁通常源于从机在传输中异常复位,导致SCL被拉低。排查步骤:1) 用示波器确认SCL/SDA电平,若SCL持续低,先检查硬件上拉电阻(典型4.7kΩ)及总线电容。2) 软件层面,HAL库的HAL_I2C_Master_Transmit会等待BUSY标志,若从机未释放总线,会超时返回HAL_BUSY。此时可调用__HAL_I2C_CLEAR_FLAG(&hi2c, I2C_FLAG_BUSY)强制清标志,但根治需在初始化后执行总线恢复序列:将SCL引脚配置为GPIO输出,手动产生9个时钟脉冲(每个脉冲间延时>5μs),同时监测SDA,待其变高后释放SCL,再重新初始化I2C外设。3) 若频繁死锁,检查从机地址是否匹配、时序是否过快(降低I2C时钟至100kHz),并在每次传输前用HAL_I2C_IsDeviceReady探测。实操建议:封装一个I2C_RecoverBus()函数,在错误处理中调用,并加入重试机制。
mcuku 阿沐 · 2026-08-27