在单片机开发中,I2C从机无应答(NACK)和总线死锁是两种常见也令人头疼的问题。它们通常指向硬件连接、时序、电源或逻辑流程上的缺陷。I2C从机无应答(NACK)和总线死锁是开发中的高频问题,多由硬件、时序、电源或逻辑异常导致。

一、I2C 从机无应答(NACK)
主机发送地址/数据后,第 9 个时钟周期 SDA 未被从机拉低,读到高电平即为无应答。
(1)从机地址问题
地址配置错误,与手册不符;
多从机地址冲突。
(2)硬件与电源问题
SDA/SCL 虚焊、断路;
缺少 1.5k~10k 上拉电阻,总线无法拉高;
主机与从机电平不兼容;
从机未上电、供电不稳或处于复位状态。
(3)时序与速率问题
主机通信速率超出从机支持范围;
总线电容大、上拉偏大导致信号上升沿过缓;
主机不支持或超时设置过短,无法适配从机时钟拉伸。
(4)从机状态异常
从机忙(如 EEPROM 擦写)无法响应;
寄存器地址非法、上次通信未正常结束,状态机异常。
二、总线死锁
表现为 SDA 持续被拉低(或 SCL 被锁死),通信无法启动。
(1)从机异常复位
通信中途从机因看门狗、电源抖动复位,若复位时 SDA 正被拉低,引脚可能被配置为推挽低电平,导致总线卡死。
(2)主机异常
通信中主机复位 / 断电,引脚电平突变,与从机状态机不同步。
(3)软件逻辑问题
无超时保护,死循环等待响应导致程序卡死;
软件模拟 I2C 时序不规范,使从机状态机异常。
三、排查与修复
(1)硬件排查:用示波器观测 SCL/SDA 波形,检查高低电平、边沿陡峭度及从机供电稳定性。
(2)死锁解锁
软件恢复:主机将 SCL 设为 GPIO,手动输出 9~12 个时钟脉冲,释放 SDA;
硬件恢复:整机断电重启。
(3)软件优化:增加通信超时机制;异常时复位 I2C 外设、发送 STOP 或时钟脉冲复位总线;严格遵守 START/STOP 时序。
(4)电源优化:电源引脚加滤波电容,避免电压跌落导致从机复位。
以上就是英锐恩单片机开发工程师分享的I2C常见的无应答与总线死锁问题。英锐恩专注单片机应用方案设计与开发,提供8位单片机、32位单片机。