
I2C 调试时软件日志只能告诉你“失败了”而万用表与示波器能告诉你“失败在哪里”。本文从空闲电压、时序波形和 ACK 应答三个层面梳理一套实用排查流程。1. 先回顾 I2C 通信I2C 以字节为基本传输单位。发送 1 个字节需 9 个时钟前 8 个传输数据第 9 个传输 ACK/NACK数据按 MSB first 发送。信号/阶段关键规则StartSSCL 高电平时SDA 由高变低数据位SCL 高平时 SDA 保持稳定ACK第 9 个时钟 SDA 被接收器拉低NACK第 9 个时钟 SDA 保持高电平StopPSCL 高电平时SDA 由低变高I2C 是开漏/开集输出SDA 和 SCL 都需要外部上拉。2. i2cdetect 扫不到设备先分层设备树、控制器和供电看似正常但命令仍扫不到地址i2cdetect-y2先分别确认SoC 到接口的信号链路是否正常外设是否供电、退出复位并返回 ACK必要时先拆下外设只保留 SoC 侧 SDA、SCL 和上拉电阻。3. 用万用表测空闲电压没有通信时两根线都应为高平。以 3.3 V 上拉为例测量对象期望值SDA3.3 VSCL约 3.3 V电平不对时检查• 上拉电阻是否漏焊、阻值是否合适• 上拉电源、管脚复用和控制器供电• SDA/SCL 是否接反、短路或被外设持续拉低。4. 用示波器抓波形一边执行i2cdetect -y 2一边测量CH1 接 SCLCH2 接 SDAGND 接板上可靠的地。正常看到规律时钟、数据变化、Start/Stop以及每 8 bit 后的第 9 个 ACK 时钟。若没有 SCL检查/dev/i2c-X、总线编号、设备树、驱动、时钟和 pinctrl。5. 重点看第 9 个时钟 ACK• SDA 被拉低ACK设备应答• SDA 保持高电平NACK设备未应。拆掉外设后没有 ACK 是正常的接回后地址、供电和复位正确时应出现 ACK。注意芯片手册常写 8 bit 地址而 Linux 通常使用 7 bit 地址。6. 常见异常波形6.1 总线一直为低检查外设占线、短路、焊接、GPIO 复用、供电和复位。6.2 两根线一直为高且无波形主控可能没有发起传输检查/dev/i2c-X、总线号、设备树、pinctrl、probe 状态和时钟。6.3 有时钟但无 ACK核对 7 bit 地址、供电、复、SDA/SCL 接线、设备所属 I2C 控制器及地址格式。6.4 纹波大、边沿差检查上拉阻值、并联上拉、总线长度、挂载数量、总线电容、PCB 走线、探头接和电源噪声。7. 排查 Checklist• 确认/dev/i2c-X和总线编号• 测 SDA/SCL 空闲电压• 检查上拉、复用和供电• 抓取 SCL/SDA确认钟和数据• 察第 9 个时钟是否 ACK• 无 ACK 时检查地址、复位、接线• 波形正常后再分析驱动和寄存器流程8. 总结万用表判断上拉和闲电平示波器定位时钟、数据、边沿和 ACK。I2C 调不通时先看 SDA/SCL 电压再看波形和第 9 个钟。看到 ACK说明主通信至少已经建立看不到 ACK就优先查地址、供电、复位、上拉、接线和总线编号。I2C 调不通时别只看码SDA/SCL 的电压和波形往往比日志更诚。