主机发完设备地址后,程序显示NACK。有人马上换上拉电阻,也有人立刻怀疑芯片损坏。更专业的排查应先回到线上:第9个时钟周期的SDA究竟是谁在驱动?

从原始波形定位时序

图为公开I²C示波波形示例。I²C采用开漏/开集电极配合上拉的总线方式:释放信号线不等于主动拉高;ACK周期应由接收方拉低SDA,NACK则保持高电平。地址帧还需把7位地址与读写位分开理解,不要把8位地址字节直接当设备的7位地址。

示波器采集到的I²C总线时序

先看哪个节点,后动哪里

  • START是否成立:SCL高电平期间SDA由高变低;如果没有正确起始条件,后续地址无意义。

  • 地址与R/W位:按MSB先发逐位解码,确认文档是7位地址还是包含方向位的8位表示。

  • 第9位ACK:观察SDA是否真的被拉低;同时量测SCL上升沿是否过慢、是否存在时钟拉伸。

  • 供电与复位:检查目标器件供电、使能、复位释放时序,以及是否在设备初始化完成前访问。

为什么只靠软件日志不够

日志中的NACK只是控制器看到的结果,不能直接判定是地址错、器件未上电、上升时间过慢、总线被占用,或目标不支持当前阶段的命令。必要时降速复现并比对电平。

面试参考答法

“我会先用逻辑分析仪确认START、7位地址和读写位,再定位第9拍ACK及SCL/SDA电平;随后检查目标供电、复位、上拉和时序参数,而不是先改驱动。软件报NACK需要用总线波形核实。”

凡亿教育 · 电子工程师面试平台