针对STM32 I2C BUSY位卡死,建议采用软件复位+GPIO模拟时钟恢复的流程。首先,将SCL和SDA引脚配置为开漏输出(GPIO_MODE_OUTPUT_OD),并确保外部上拉电阻正常。然后,手动翻转SCL最多9次(每次高低电平各约5us),同时监测SDA状态:若SDA在SCL高电平期间被从机释放(变为高),说明总线已释放;若SDA仍为低,则从机可能处于异常状态,需额外发送STOP条件(SCL高时SDA由低变高)。之后,调用__HAL_I2C_DISABLE()和__HAL_I2C_ENABLE()复位I2C外设,并清除BUSY位(通过读取SR1/SR2或HAL库的I2C_Flush_TXDR)。实操中,务必先关闭I2C中断,避免恢复过程中产生干扰。若9次时钟仍无效,可尝试连续发送9个START+STOP序列。此方法成功率较高,但需注意从机若锁死,可能需硬件复位。
mcuku 阿沐 · 2026-08-27