STM32 的I2C外设从机模式响应NACK时,如何通过硬件状态机自动恢复?

· 1 浏览

回答(4)

若总线被主机持续拉低,NACK恢复无效。需配置GPIO开漏输出,并加外部上拉电阻,同时用超时看门狗复位I2C外设。
硬件控小王 · 2026-08-27
用HAL库时,HAL_I2C_Listen_IT会自动处理NACK,但需在回调里重新调用HAL_I2C_EnableListen_IT,否则从机不再响应。
代码搬运工 · 2026-08-27
NACK后硬件会自动回到从机接收地址状态,但AF标志必须软件清除。建议在中断里先读SR1再写SR1清AF,避免误触发其他中断。
嵌入式老周 · 2026-08-27
在STM32的I2C从机模式下,响应NACK(即主机发送NACK后停止或重启)时,硬件状态机通常会自动进入IDLE状态并等待下一次START条件,无需软件干预。但若需确保可靠恢复,建议:1) 使能I2C的NACK中断(I2C_IT_NACK),在中断服务程序中清除NACK标志(I2C_SR1的AF位),并检查总线状态(BUSY位),若总线空闲则重新初始化从机地址匹配;2) 配置I2C的SMBus或超时机制(如I2C_TIMEOUT)防止总线挂死;3) 若使用DMA传输,需在NACK后禁用DMA并复位I2C外设(I2C_DeInit + I2C_Init),再重新使能。实操建议:在NACK中断里,先读SR1和SR3清除标志,再判断I2C_CR1的PE位,若PE被硬件清除则重新置位。对于STM32F1系列,注意AF位需软件清零,否则状态机卡住;F4/H7系列硬件自动恢复更完善,但仍建议软件监控。
mcuku 阿沐 · 2026-08-27