在STM32的I2C从机模式下,应对主机时钟拉伸和总线错误恢复,核心在于正确配置和利用硬件特性。对于时钟拉伸,从机应通过设置I2C_CR1的NOSTRETCH位为0(默认允许拉伸),并在处理数据时保持SCL低电平,直到软件准备好。具体操作:在中断服务程序中,先读取数据或写入数据,再清除中断标志,确保SCL释放。若主机拉伸时间过长,需设置超时机制(如使用定时器或I2C超时寄存器),避免死锁。对于总线错误恢复,当检测到总线错误(BERR)或仲裁丢失(ARLO)时,应执行软件复位I2C外设:先设置I2C_CR1的SWRST位,再清除,然后重新初始化I2C,并检查总线状态(BUSY位),若总线忙,可尝试发送9个时钟脉冲(通过GPIO模拟)来释放总线。建议在从机初始化时使能错误中断,并在错误处理中记录错误类型,便于调试。实操中,务必使用硬件I2C的时序特性,避免软件模拟,以提高可靠性。
mcuku 阿沐 · 2026-08-27