☰
I2C通信故障排查实战:从万用表到逻辑分析仪的完整指南
2026/9/28 1:52:22 网站建设 项目流程

I2C 总线只有两根线,看起来简单得让人放松警惕,但真正在板子前蹲过一下午的人都知道,它出问题的概率一点都不比 SPI 或者 UART 低。更麻烦的是,I2C 的故障往往不是"完全不通"这种干脆利落的死法,而是时通时不通、上电偶尔能读、跑一会儿就挂、换个批次芯片就翻车。这时候光靠"看代码"是没用的,你得把信号本身抓出来看。这篇内容就是围绕"怎么把 I2C 信号测明白"这条主线展开的,从最便宜的万用表,到示波器、逻辑分析仪,再到 ACK 位这个最容易被忽略却最致命的环节,把整套排查流程讲透。不管你是刚上手 STM32 驱动 OLED 的新手,还是被 GT911 触摸屏 I2C 通信失败折磨过的老手,这套思路都能直接拿去用。

1. 先搞清楚 I2C 到底在两根线上发生了什么

很多人测 I2C 测不明白,根子不在仪器,而在于脑子里对 I2C 的物理层和数据层没有建立起清晰的画面。你拿着探头去戳 SCL 和 SDA,屏幕上跳出来的波形如果你不知道"应该长什么样",那测了也白测。所以排查之前,先把 I2C 的电气特性和时序规则过一遍,这一步省不得。

1.1 开漏输出与上拉电阻:为什么波形总是"爬"上去的

I2C 的 SDA 和 SCL 都是开漏(Open-Drain)结构,这一点是理解所有 I2C 波形问题的钥匙。开漏意味着器件只能把线拉低,不能主动拉高。线要变高,靠的是上拉电阻把电平"拽"上去。这就导致一个非常典型的波形特征:下降沿陡峭,上升沿圆滑,因为拉低是晶体管主动导通,速度快;拉高是电阻给总线电容充电,是个 RC 充电过程。

这个 RC 充电的时间常数直接决定了上升时间。总线电容一般由走线、引脚、器件输入电容构成,典型值在几十到几百 pF。假设上拉电阻是 4.7kΩ,总线电容 200pF,那么时间常数 τ = RC = 4.7k × 200p = 0.94μs,上升到 70% 大约需要 1.2τ ≈ 1.1μs。标准模式 I2C(100kHz)对上升时间的要求是最大 1000ns,快速模式(400kHz)要求最大 300ns。你看,4.7k 在 400kHz 下就已经很勉强了。

所以当你用示波器看到上升沿"软绵绵"地爬上去,甚至还没到高电平阈值下一个时钟就来了,那通信失败几乎是必然的。这时候要做的不是改代码,而是减小上拉电阻或者降低总线速率。常见上拉取值参考:

总线速率典型上拉电阻适用场景
100kHz 标准模式4.7kΩ ~ 10kΩ长走线、多器件
400kHz 快速模式2.2kΩ ~ 4.7kΩ常规板级通信
1MHz 快速+模式1kΩ ~ 2.2kΩ短走线、少器件

但上拉也不是越小越好,太小会导致器件拉低时灌电流过大,超过 IO 的灌电流能力(一般 3mA 到 20mA 不等)。这就是一个典型的权衡:上升沿要快就减小电阻,但灌电流要控制在器件规格内。

1.2 起始、停止、ACK:三个必须刻在脑子里的时序标志

I2C 的数据传输有一套严格的帧结构,测信号时你要能一眼认出这几个关键节点:

  • 起始条件(START):SCL 为高时,SDA 由高变低。这是所有传输的开场白。
  • 停止条件(STOP):SCL 为高时,SDA 由低变高。这是传输的结束语。
  • 应答位(ACK):每传输 8 位数据后,第 9 个时钟周期,接收方把 SDA 拉低表示"收到了",这就是 ACK;如果 SDA 保持高,就是 NACK。

这里有个特别容易踩的坑:数据位在 SCL 高电平期间必须保持稳定,只能在 SCL 低电平期间变化。如果你在示波器上看到 SDA 在 SCL 高电平中间跳变,那要么是时序配置错了,要么是总线冲突,要么是某个器件在乱发数据。这个现象在"i2c 从机主动更新主机寄存器"这类场景里尤其常见,因为从机如果没等主机来读就自己动 SDA,就会破坏时序。

1.3 地址帧与数据帧:7 位地址是怎么拼出来的

标准 I2C 用 7 位地址,加上 1 位读写方向位,凑成第一个字节。比如一个器件的 7 位地址是 0x3C(SSD1306 OLED 常见地址),写操作时第一个字节是 0x78(0x3C << 1 | 0),读操作是 0x79(0x3C << 1 | 1)。很多新手在示波器上抓到 0x78 就懵了,以为地址不对,其实是没把方向位算进去。

理解这一点对排查"设备找不到"极其重要。当你在总线上抓波形,看到主机发出了地址字节,但第 9 个时钟没有 ACK,那基本可以断定:要么地址错了,要么器件没上电,要么器件根本没接在这条总线上。这个判断逻辑后面会反复用到。

2. 万用表能测 I2C 吗?能,但只能测"静态"

先回答一个很多人心里的疑问:万用表到底能不能用来排查 I2C?答案是能,但它的作用非常有限,只能做静态检查,不能看动态波形。不过别小看静态检查,我遇到过相当比例的 I2C 故障,用万用表五分钟就能定位,根本轮不到示波器上场。

2.1 用万用表确认上拉电阻和静态电平

第一步,断电测电阻。把万用表打到电阻档,测 SDA 对 VCC、SCL 对 VCC 的阻值。正常应该读到上拉电阻的值(比如 4.7k)。如果读到的是无穷大,说明上拉电阻没焊或者虚焊;如果读到接近 0,说明有短路。这一步能排掉一大批"根本没上拉"的低级问题——别笑,我见过太多人画原理图时忘了加上拉,或者加了但 BOM 里漏了。

第二步,上电测电压。总线空闲时,SDA 和 SCL 都应该是高电平(接近 VCC)。用万用表直流电压档测:

  • 如果某根线一直是低电平(接近 0V),说明有器件把总线死死拉低了。这通常意味着器件损坏、地址冲突、或者某个器件的电源没上但 IO 有漏电。
  • 如果某根线电压介于高低之间(比如 1.8V),说明上拉太弱或者总线电容太大,或者有器件处于半导通状态。
  • 如果两根线电压都正常(接近 VCC),那静态层面没问题,故障在动态时序,得上示波器。

这里有个经验:万用表的内阻会影响读数。有些万用表电压档输入阻抗是 10MΩ,测这种带上拉的总线没问题;但如果你用的是老式指针表(比如 MF50 这类),内阻低,测出来的电压会偏低,容易误判。所以测 I2C 静态电平,建议用数字万用表,输入阻抗至少 1MΩ 以上。

2.2 万用表测不出但必须知道的局限

万用表的采样率极低,通常每秒几次到几十次,而 I2C 一个时钟周期在 400kHz 下只有 2.5μs。这意味着万用表看到的永远是总线的"平均状态"或者某个瞬间的直流值,它根本抓不到任何一位数据。所以:

  • 你无法用万用表判断 ACK 有没有来。
  • 你无法用万用表看起始/停止条件。
  • 你无法用万用表判断时序是否满足建立/保持时间。

我见过有人拿万用表测 SCL,看到电压在 0 和 VCC 之间"跳动",就以为通信正常了。其实那只是万用表在快速变化的信号上取平均,读数毫无意义。万用表在 I2C 排查里的定位就是"静态体检",动态诊断必须交给示波器或逻辑分析仪。

2.3 一个用万用表快速定位的实战案例

之前调一块板子,STM32 读 BH1750 光照传感器一直返回 0xFF。我先断电测上拉,SDA 和 SCL 对 VCC 都是 4.7k,正常。上电测电压,SCL 是 3.3V,SDA 只有 0.4V。这就说明 SDA 被拉死了。断电后单独测 SDA 对地电阻,发现只有几十欧姆,明显短路。最后查出来是 BH1750 的焊盘下面有一小坨锡渣,把 SDA 和地短接了。清掉锡渣,一切正常。

整个过程没用示波器,五分钟搞定。这就是万用表的价值:快速排除静态故障,把动态问题留给更专业的工具。

3. 示波器上场:怎么抓、怎么看、怎么判断

当静态检查没问题,故障就进入动态层面了。这时候示波器是主力。但很多人买了示波器却不会用来看 I2C,探头一挂,屏幕上波形乱成一团,根本没法分析。问题出在触发设置和时基选择上。

3.1 探头接法与时基、触发的设置要点

先说探头。测 I2C 用普通无源探头就行,但要注意:

  • 地线要短。探头那个带鳄鱼夹的长地线,在测高速信号时会引入振铃和干扰。测 I2C 这种几百 kHz 的信号,最好用探头自带的短弹簧地针,直接戳在器件地引脚附近。
  • 两个通道分别接 SDA 和 SCL。别想着一个通道轮流测,I2C 的关键信息在两根线的相对关系里,必须同时看。
  • 探头衰减用 10X。1X 档带宽低、电容大,会加重总线负载,影响波形。

再说触发。这是最关键的一步。I2C 总线空闲时都是高电平,如果你用默认的边沿触发,可能半天抓不到一个完整的帧。正确的做法是:

  1. 触发源选 SDA,触发类型选下降沿。因为起始条件是 SCL 高时 SDA 下降,用 SDA 下降沿触发能稳定抓到帧的开头。
  2. 触发模式选 Normal(正常),不要选 Auto。Auto 模式下没触发时示波器也会刷新,波形会乱跳。
  3. 触发电平设在 VCC 的一半左右,比如 3.3V 系统设 1.65V。

时基方面,如果看单个字节,把时基设到 5μs/div 到 20μs/div 之间;如果看整个帧(比如读写 EEPROM 的一串数据),设到 100μs/div 甚至更慢。先用慢时基看全貌,再用快时基看细节,这是示波器分析的基本节奏。

3.2 从波形上识别起始、地址、ACK 的完整过程

设置好之后,你应该能看到类似这样的波形:SCL 是一串规整的方波,SDA 在 SCL 低电平期间变化,在 SCL 高电平期间保持稳定。帧的开头,SCL 保持高,SDA 突然下降——这就是 START。

接着数时钟。第 1 到第 7 个时钟是地址位,第 8 个是读写位,第 9 个是 ACK 位。重点看第 9 个时钟:如果 SDA 在这期间被拉低,说明从机应答了;如果 SDA 保持高,就是 NACK。

我习惯用示波器的余辉或者单次触发功能,抓一帧完整的传输,然后慢慢数。有些示波器带 I2C 解码功能(比如鼎阳、普源的中高端型号,或者力科这类),可以直接把地址和数据解出来显示在屏幕上,省去手动数的麻烦。如果你的示波器支持 SCPI 指令远程控制,甚至可以写脚本自动抓取和解码,这在批量测试时很有用。

3.3 上升沿太慢、毛刺、电平不对:三类典型波形异常的判读

抓到波形后,怎么判断它"健不健康"?我总结了三类最常见的异常:

第一类:上升沿太慢。前面讲过,这是上拉电阻和总线电容的问题。判断标准是看上升时间是否超过协议规定。如果上升沿明显是个"斜坡",而且在高电平阈值附近停留很久,那就要减小上拉或者降速。

第二类:毛刺(Glitch)。波形上出现窄的尖峰,可能是反射、串扰或者电源噪声引起的。如果毛刺出现在 SCL 高电平期间并导致 SDA 误判,通信就会出错。这种情况要检查走线是否过长、是否有平行走线耦合、电源是否干净。

第三类:电平不对。比如 3.3V 系统里高电平只有 2.0V,或者低电平有 0.8V。这通常是电平不匹配——比如一个 5V 器件和一个 3.3V 器件挂在同一条总线上,或者上拉接到了错误的电源轨。这时候要么加电平转换,要么统一电源。

提示:测 I2C 时如果发现波形上有规律的周期性干扰,先怀疑开关电源的纹波。把示波器时基拉慢,看干扰是否和电源开关频率一致,能快速定位。

4. ACK 位:I2C 排查里最该盯死的那一个时钟

如果只能让我盯 I2C 波形上的一个地方,我一定选 ACK 位。因为 ACK 是整个通信的"握手确认",它直接告诉你"从机到底有没有听懂"。地址阶段的 ACK 和数据阶段的 ACK 含义不同,排查思路也不同。

4.1 地址 ACK 缺失:从机没应答的四种可能

地址字节发出去后第 9 个时钟没有 ACK,这是最常见的故障现象。可能的原因有四种,按排查优先级排列:

  1. 地址错了。这是最高频的原因。7 位地址、读写位、有些器件还有可配置的地址引脚,任何一个搞错都会导致 NACK。比如 GT911 触摸屏,它的 I2C 地址会根据上电时 INT 引脚的状态在 0x5D 和 0x14 之间切换,如果你没注意这个细节,地址就会错。
  2. 器件没上电或没复位。有些器件需要先拉复位引脚、等一段时间才能通信。如果复位时序不对,器件根本没准备好,自然不会 ACK。
  3. 器件没接在总线上。虚焊、走线断、连接器接触不良,都会导致从机"消失"。
  4. 总线冲突。如果两个器件地址相同,或者某个器件在错误的时间拉低总线,会导致通信混乱。

排查方法:先用示波器确认地址字节确实发出去了,然后逐个排除。最有效的手段是换一个已知正常的器件挂上去测试,如果正常器件能 ACK,说明主机和总线没问题,问题在原来的从机。

4.2 数据 ACK 缺失:从机"听懂了地址但读不了数据"

地址 ACK 正常,但数据阶段 NACK,这种情况更隐蔽。常见原因:

  • 寄存器地址越界。你让从机读一个它不存在的寄存器,它可能就 NACK 了。
  • 从机内部忙。比如 EEPROM 在写周期内不会响应,需要等写完成(可以用 ACK 轮询,也就是反复发地址直到收到 ACK)。
  • 读写方向搞反。写操作时从机 ACK,读操作时主机 ACK,如果方向位错了,行为就全乱了。

这里要特别提一下ACK 轮询这个技巧。写 EEPROM 时,写完一个字节后 EEPROM 需要几毫秒的内部写周期,这期间它不响应任何通信。正确做法是:发完写命令后,反复发送起始条件加地址字节,直到收到 ACK,说明写周期结束。这个技巧在"i2c 读写 eeprom 代码"里是标配,但很多新手不知道,写完立刻读,结果全是 NACK。

4.3 用逻辑分析仪交叉验证 ACK 的实操

示波器看 ACK 需要手动数时钟,容易出错。这时候逻辑分析仪是更好的选择。逻辑分析仪自带 I2C 协议解码,能把整个帧解析成"START - 地址 - ACK - 寄存器 - ACK - 数据 - NACK - STOP"这样的文本,一目了然。

用逻辑分析仪时,采样率要足够高。I2C 400kHz 的话,采样率至少 4MHz 以上,建议 10MHz 到 24MHz,这样能看清每个边沿。通道接 SDA、SCL 和地,软件里选 I2C 解码,设置好地址位宽(7 位还是 10 位),就能自动解析。

我通常的做法是:示波器看波形质量(上升沿、毛刺、电平),逻辑分析仪看协议内容(地址、数据、ACK)。两者配合,几乎没有定位不了的 I2C 问题。

5. 那些年踩过的 I2C 坑:从 GT911 到 SSD1306

理论讲完了,说几个真实的坑。这些案例的共同点是:问题都不在"代码逻辑"上,而在硬件细节或者协议理解上。

5.1 GT911 触摸屏地址跳变的坑

GT911 这个触摸芯片,I2C 地址不是固定的,而是由上电复位时 INT 引脚的电平决定的。如果 INT 在上电那一刻是低电平,地址是 0x5D;如果是高电平,地址是 0x14。很多人的板子 INT 引脚默认被拉低,但代码里写的是 0x14,结果就是死活读不到。

排查这个问题的关键是:在上电瞬间用示波器抓 INT 引脚的波形,确认复位时序。如果 INT 状态和预期不符,要么改硬件上拉/下拉,要么在代码里先控制 INT 引脚再释放复位。

5.2 SSD1306 OLED 上电不亮的时序问题

SSD1306 的 I2C 驱动很成熟,但偶尔会遇到"上电不亮,复位一下就好"的情况。这通常是上电时序问题:OLED 的 VCC 和复位引脚的上电顺序不对,导致内部状态机没初始化好。解决办法是在初始化代码里加足够的延时,或者显式控制复位引脚。

另外,SSD1306 支持 I2C 和 SPI 两种模式,靠一个引脚选择。如果这个引脚悬空或者接错,芯片可能进入错误模式,I2C 自然不通。这个细节在原理图评审时就要确认。

5.3 多器件共用总线时的地址冲突

一条 I2C 总线上挂多个器件时,地址冲突是隐形杀手。比如两个同型号的传感器,如果地址引脚都接一样,就会冲突。这时候要么改地址引脚,要么用 I2C 多路复用器(比如 TCA9548A)把总线分成多路。

用多路复用器时要注意:复用器本身也占一个 I2C 地址,而且切换通道后要等一小段时间才能通信。这个延时如果不够,切换后的第一次通信可能失败。

6. 一套可以照着走的 I2C 排查流程

把前面的内容串起来,形成一套标准流程。遇到 I2C 不通,按这个顺序走,基本不会漏。

6.1 从静态到动态的分层排查顺序

  1. 断电测电阻:SDA、SCL 对 VCC 是否有上拉,对地是否短路。
  2. 上电测电压:总线空闲时是否都是高电平,有没有被拉死。
  3. 示波器看波形:起始条件是否正常,上升沿是否够快,有没有毛刺。
  4. 数 ACK:地址阶段有没有 ACK,数据阶段有没有 ACK。
  5. 逻辑分析仪解码:确认地址、寄存器、数据是否符合预期。
  6. 对照数据手册:确认时序参数(建立时间、保持时间、时钟频率)是否满足。

这个顺序的核心逻辑是从简单到复杂、从静态到动态、从硬件到协议。很多问题在前两步就能解决,不用上示波器。

6.2 每一步的判据和常见误判

步骤正常判据常见误判
测电阻读到上拉阻值万用表内阻影响读数
测电压空闲时接近 VCC把动态平均误当静态电平
看波形上升沿满足协议忽略探头地线引入的干扰
数 ACK第 9 时钟 SDA 拉低把时钟数错,误判 ACK
解码地址数据符合预期忘记算读写方向位

6.3 工具选型的取舍:什么时候用哪个

  • 万用表:静态检查,快速排除短路、断路、上拉缺失。
  • 示波器:看波形质量,判断上升沿、毛刺、电平、时序。
  • 逻辑分析仪:看协议内容,解析地址、数据、ACK,适合复杂帧分析。
  • 两者结合:波形质量用示波器,协议内容用逻辑分析仪,这是最高效的组合。

如果预算有限,只能买一个,我建议先买逻辑分析仪。因为它能直接告诉你协议层面发生了什么,对新手更友好。示波器更适合有一定经验、需要分析信号完整性的人。

7. 几个容易被忽略的细节和进阶技巧

最后补充几个细节,都是实际调试中总结出来的,文档里一般不会写。

第一,注意总线的容性负载。每挂一个器件,总线电容就增加一点。器件多了,上升沿就慢。如果发现加了新器件后通信变差,先怀疑电容。

第二,时钟拉伸(Clock Stretching)。有些从机(比如某些传感器)在处理数据时会主动拉低 SCL,让主机等待。如果你的主机不支持时钟拉伸,就会通信失败。用示波器看到 SCL 被异常拉低,就要考虑这个因素。

第三,电源和地的质量。I2C 通信失败有时候根本不是 I2C 本身的问题,而是电源纹波太大或者地线噪声。用示波器测电源纹波,如果纹波超过器件的容忍范围,先解决电源问题。

第四,软件模拟 I2C 的时序。用 GPIO 模拟 I2C 时,延时函数的时间精度直接影响时序。如果延时不准,建立/保持时间就不满足。这时候要用示波器实测 GPIO 翻转的时间,反推延时函数的实际效果。

第五,PMBus 和 I2C 的区别。PMBus 是建立在 I2C 之上的协议,电气层兼容,但协议层有额外要求(比如 PEC 校验)。如果你的器件是 PMBus,用纯 I2C 的方式去读可能会失败,要按 PMBus 的规范来。

我个人在实际操作中的体会是,I2C 排查最忌讳的就是"猜"。猜地址、猜时序、猜硬件,最后浪费大量时间。正确的做法是用工具把每一层都测出来,让数据说话。万用表告诉你静态对不对,示波器告诉你波形好不好,逻辑分析仪告诉你协议通不通。三层都过了,I2C 没有不通的道理。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询