调试 I2C 设备遇到问题,说多不多,说少不少。测电压有 3.3V,示波器也能看到波形在跳,可设备就是偶尔不响应、数据乱跳,最后发现是从机没有拉低 SDA 回应 ACK,或者总线被某个器件直接拖死了。这类问题排查起来很考验基本功,尤其是对 I2C 信号的测量手段和 ACK 机制的理解。这篇就围绕“I2C 信号怎么测”这件事,把万用表、示波器、逻辑分析仪各自能干什么、怎么干、以及 ACK 怎么从波形里读出来,完整梳理一遍。
先说结论:万用表只能测静态,示波器才能测动态,而 ACK 的判断本质上是在动态波形里找“第 9 个时钟周期 SDA 有没有被拉低”。搞懂这一句话,后面的排查思路就顺了。
1. 测量之前,先把 I2C 的“骨架”讲清楚
调试任何总线,第一步不是拿探头乱点,而是先搞清楚这条总线上正常信号长什么样。I2C 是同步串行协议,只有两根线:SDA(数据)和 SCL(时钟),它不像 SPI 那样有独立的片选线,所有设备都挂在同一条总线上,靠地址区分身份。所以在测量之前,你对这两根线的电气特性和时序结构得有个清晰的预期。
1.1 两条线上的电平世界
I2C 的物理层是开漏结构,也就是说,设备的引脚只能主动把线拉低,不能主动拉高。高电平完全靠上拉电阻提供。这在测量时有一个非常直接的影响:你用示波器看 SDA 或 SCL 的空闲电平,看到的应该是接近 VCC 的高电平,而且这个高电平的质量,直接取决于上拉电阻的阻值和总线寄生电容。
举个例子,3.3V 系统、上拉电阻 4.7kΩ、总线电容 200pF 左右时,信号上升沿会比较平缓;如果你把上拉换成 10kΩ,上升沿会更慢,高速模式下很容易导致从机采样出错。测量波形时如果发现上升沿明显“爬坡”,而不是接近垂直,那就得怀疑上拉阻值是否偏大,或者总线上的设备太多、走线太长,寄生电容超标了。
这里还要注意一个容易踩的坑:I2C 总线上如果某个器件异常,它可能一直把 SDA 或 SCL 拉低。你用万用表量这两根线,发现电压是 0V,但这不代表总线没上拉,而是被某颗芯片“拽住了”。这种问题用示波器一扫就能看出来,下面会细说。
1.2 一个完整通信时序里藏了什么
I2C 的通信单元是“帧”,一帧完整的传输由以下几个部分组成:
- 起始条件(START):SCL 为高电平时,SDA 发生高到低的跳变;
- 地址帧:7 位从机地址加 1 位读写标志,总共 8 位;
- ACK 位:第 9 个时钟周期,从机如果收到自己的地址,会把 SDA 拉低应答;
- 数据帧:每 8 位数据后跟一个 ACK 位,由接收方应答;
- 停止条件(STOP):SCL 为高电平时,SDA 发生低到高的跳变。
主机的读写操作还有细微差别。读操作时,主机发送完从机地址后,从机应答;随后主机每接收一个字节,就要在下一个时钟周期主动拉低 SDA 表示 ACK,如果主机不想继续读了,就发送 NACK(不拉低),然后再发 STOP。这个细节在测量从机发出的数据时尤其重要,因为这时候 ACK 的产生方是主机,波形上 SDA 的驱动角色变了,不能想当然。
1.3 为什么协议细节直接决定测量方案
不是所有测量工具都能干所有事。万用表本质上只能测电压、电阻、通断,它看的是“某个瞬间的静态结果”;示波器看的是“随时间变化的动态波形”;逻辑分析仪则专门抓数字信号的时序。I2C 是动态协议,一帧数据在毫秒甚至微秒级别完成,所以排查 I2C 问题的核心工具必然是示波器或逻辑分析仪,万用表更多是辅助判断电气状态。
但万用表也有它的独特价值:测上拉电阻阻值、测总线对地短路、测供电电压是否正常。这些是示波器不太好替代的,也是排查流程的第一步。
2. 万用表在 I2C 调试里能干什么、干不了什么
很多新手调 I2C 上来就抱怨“万用表看不到波形”,这其实是用错了工具。万用表在 I2C 调试里的定位是“体检”,不是“录像”,它能帮你排除一大批低级问题,但无法帮你确认时序细节。
2.1 能干的:静态电平、短路、上拉电阻
万用表在 I2C 排查里最实用的三个功能:直流电压档、通断档、电阻档。
直流电压档用来测 SDA 和 SCL 空闲时的电平。正常情况下总线空闲时是上拉高电平,所以你测到 3.3V 或 5V 说明上拉正常,但测到接近 0V 就要警惕:要么上拉电阻没焊,要么有设备在占用总线,要么某个引脚短路到地。这个判断非常快,能帮你定位“总线挂死”类问题。
通断档用来排查短路。比如你怀疑某颗从机芯片的 SDA 引脚虚焊或连锡,直接在芯片引脚和主控引脚之间量通断,一次就能确认。电阻档可以测量上拉电阻的实际阻值,确认是不是焊错成 10kΩ 或者 100kΩ。
2.2 干不了的:动态时序捕获与 ACK 判断
万用表的刷新率太慢了,哪怕是带频率计功能的表,也抓不住微秒级的 I2C 信号变化。它的 ADC 采样原理决定了它只能显示平均值,你在总线上持续读到 1.8V 这种奇怪电压时,其实并不知道信号到底在高、低之间怎么跳变,也不知道是否出现异常毛刺。想靠万用表判断 ACK 是否存在,是做不到的。
但有一个场景例外:如果总线处于空闲状态,你可以用万用表确认 SDA 是否被异常拉低。空闲状态下 SDA 和 SCL 都是高电平,如果某一根线被拉低,万用表一眼就能判断问题,这比示波器架好探头再看还要快。
2.3 万用表测量实操建议(含基础型号实测技巧)
我自己最早用的就是 DT830B 这种基础万用表,精简到只有几个档位,但用来查 I2C 静态问题完全够用。关键是两点:一是表笔要接触稳定,不要用表笔去怼芯片引脚,而是找过孔、排针或者测试点去量;二是要注意拨盘档位别打错,测电压和测电阻之前都得确认一下。
测量 SDA/SCL 空闲电压时,红表笔接被测线,黑表笔接地,档位打到直流电压 20V 档。如果测到 3.3V 或 5V 左右,说明上拉正常;如果测到 0V,先把板子断电,用电阻档量这两根线对地电阻,看有没有短路。实操中我曾经遇到过一颗传感器芯片虚焊,SDA 引脚和地之间居然有 30Ω 的阻值,上电后整条总线 3.3V 直接被拉低到 1.2V,I2C 完全不通,就是靠万用表通断档一步步试出来的。
提示:万用表测 I2C 时,尽量在板子断电状态下测电阻和通断,上电状态只能测电压,否则容易误判或有损坏风险。
3. 示波器测量 I2C 的完整操作流程
示波器才是 I2C 信号测量的主角。它能同时看 SDA 和 SCL 两条线的波形,能看到起始条件、Stop 条件、ACK 位、毛刺、上升沿质量,还能用解码功能直接把字节翻译出来。这一节按实际操作顺序讲,从探头准备到波形判读一条龙。
3.1 测量前准备:探头、带宽、通道匹配
I2C 信号本身频率不高,标准模式 100kHz,快速模式 400kHz,高速模式 3.4MHz。所以理论上 100MHz 带宽的示波器就够用了,但这里有个容易被忽略的点:探头的接地线要尽量短。示波器探头如果用了长接地夹,测高频信号或者有较强干扰的环境时,会引入很大的噪声和振铃,I2C 波形边缘会被拉出毛刺,看着像时序错误,其实是测量方法的问题。
实际操作中,我一般用两根探头,CH1 接 SCL,CH2 接 SDA,触发源选 SCL。如果示波器支持,把通道衰减调成 1X,带宽限制打开到 20MHz 或 50MHz,滤掉高频噪声,波形会干净很多。为什么不直接开全带宽?因为 I2C 边缘本身不是极端陡峭的,开 20MHz 带宽限制足够看清信号质量,同时还能减少噪声干扰。
3.2 触发与采集设置:抓住起始条件才是关键
I2C 的时序分析要想看得清,触发设置非常关键。最常用的是“下降沿触发 + 足够长的时基”。因为 I2C 的起始条件就是 SDA 在 SCL 高电平期间产生下降沿,所以把触发方式设为下降沿,接 SDA 的通道作为触发源,就能稳定抓到通信启动时的波形。
还有一种更讲究的做法:有些示波器支持“I2C 触发”模式,允许你指定触发条件是起始条件、停止条件、地址或 ACK/NACK。这就是硬件级别的协议触发,能大大节省定位时间。如果在触发菜单里看到 I2C 选项,直接选 START 触发送地址帧,而不是用普通下降沿触发,能少走很多弯路。
采样时基设置也有讲究。标准的 I2C 单次传输通常包含地址帧加数据帧,几十微秒到几百微秒不等,所以把时基设成 50µs/div 到 200µs/div 之间,能完整看到一帧传输。如果只关心某个 ACK 位,则可以把时基缩到 5µs/div 看细节。
3.3 波形判读实战:从帧头读到帧尾
抓完波形后,判读顺序遵循“先认 START,再认 ACK,最后认数据”。下面我把一帧写操作对应到波形上,你跟着这个顺序走就不会乱。
先看起始条件:SCL 高电平期间 SDA 下拉,这是 START。然后你会看到 SCL 开始连续翻转 8 个周期作为时钟,对应地址字节。地址字节的 8 位数据在 SCL 高电平期间读取,SDA 上的电平组合就是地址和读写位。紧接着第 9 个时钟周期,看 SDA 在 SCL 高电平期间是否被拉低。拉低了就是 ACK,保持高电平就是 NACK。
地址之后是数据字节,每个字节 8 位,后面再跟一个 ACK 位。读操作时方向反转,数据和 ACK 的驱动方会相应变化,这点要特别留意,别把从机发来的数据误当成主机数据。
3.4 没有 I2C 解码功能时怎么手动读波形
不少入门示波器没有协议解码功能,只能看原始波形,这时候就只能手动读了。手动读 I2C 波形并不难,但要耐心,关键是先定位每一位的采样点。
SCL 上升沿或高电平期间的 SDA 电平就是这一位的数值。从 START 之后开始数:第 1~8 个 SCL 高电平对应地址字节,第 9 个高电平对应 ACK。地址字节的 8 位怎么读?第一位在最左边,按顺序读出来,注意 I2C 地址是 MSB 先发。举个例子,如果第 1~7 位是 0111000,第 8 位 R/W=0,那么这是在向地址 0x38 的器件发起写操作。如果第 9 位 SDA 是高电平,说明从机没有 ACK,这时候直接去查地址配置和器件上电状态。
提示:手动读数容易看花眼,建议把屏幕网格调亮,用光标功能逐位标定每个 SCL 高电平位置,配合“暂停”键慢慢数。很多示波器支持两个光标,能标记位边界,实测好用的很。
4. ACK/NAK 问题专项排查
前面反复提到 ACK,因为 I2C 通信里 90% 的“诡异问题”最后都指向 ACK 异常。这一节专门拆解 ACK 的产生机制、波形特征和排查方法。
4.1 ACK 到底怎么产生、在哪看
ACK 是 I2C 协议里的应答机制,用来告诉发送方“我已收到并且处理了这个字节”。它由接收方在第 9 个时钟周期内,把 SDA 拉低并保持到 SCL 高电平结束。这里“保持”是重点,SDA 必须在整个第 9 个时钟的高电平期间都是低电平,才算有效 ACK。
在波形上找 ACK,技巧是先把屏幕停在起始条件后的第 9 个上升沿,然后看 SDA 在这一跳后的状态。如果是低电平,说明接收方 ACK 了;如果是高电平,就是 NACK。实际操作中,我习惯把触发设置成“第 9 个周期附近放大显示”,看不清就放大,再不行用单次采集重新抓一次。
4.2 NACK 的 5 种常见原因与波形特征
NACK 分好几种情况,每一种对应的根因和处理方式都不同:
地址错误或设备不存在:主机发送的地址总线上没有任何设备匹配,从机自然不应答。波形特征是地址字节后的第 9 位 SDA 保持高电平。这种 NACK 往往出现在换了从机芯片没有同步改程序、地址跳线拨错、或者器件根本没上电时。
从机未上电或复位异常:从机芯片没有工作,无法驱动 SDA,自然不会产生 ACK。注意从机可能供电与主控不同源,上电时序不对也会导致启动异常,表现为“有时 ACK、有时 NACK”。
总线速率太高:从机跟不上主机的速率,比如标准模式器件被配置成 400kHz,从机可能来不及响应,会漏 ACK。降低速率试试,往往瞬间就恢复。
上拉电阻过大:上升沿太慢,从机或主机采样 SDA 时还没稳定,导致应答电平被误判。波形特征就是上升沿很长,第 9 时钟期间 SDA 虽然开始下落,但还没落到低电平。
总线挂了,SDA 一直低,主机无法读取 ACK 状态:这个是最隐蔽的情况。如果某个从机异常,把 SDA 持续拉低,主机的读操作就永远看到低电平,这时你甚至看不到“正常的 NACK 高电平”,波形显示一峰低平。用万用表先测总线空闲电压就能发现端倪。
4.3 从 ACK 波形反推设备状态
ACK 不仅能告诉设备是否正常应答,还能反推设备的工作状态。比如你连续读一个传感器,第一次读有 ACK,第二次读就 NACK,那很可能是从机的内部状态机出问题了,常见原因包括从机繁忙(比如还在处理上一次命令)、FIFO 溢出、或者寄存器地址越界。这时候不能用“换主控”的思路,而是应该仔细看从机的 datasheet,确认忙标志的处理逻辑。
还有一种情况:同一个设备,写操作正常,读操作首字节正常,第二个字节后 NACK。这种情况多半是主机在第二次读取时没有正确响应从机的“传输结束条件”,或者主机在应该发 ACK 时发了 NACK,导致从机认为主机不要了,主动终止传输。
4.4 逻辑分析仪与示波器的配合使用
示波器虽然强大,但捕捉一次 I2C 传输再加手动解码,效率不算高。我遇到需要反复调协议层的场景时,会把逻辑分析仪接上,用现成的 I2C 解码插件直接读出地址和数据,比手动数波形快得多。逻辑分析仪的采样率只要有 20M 以上,抓 400kHz 的 I2C 绰绰有余。
但逻辑分析仪有个短板:它看不到模拟波形,比如上升沿过缓、信号振铃、电平幅度不够等问题,逻辑分析仪只能给你“0/1”的结果,边沿质量问题它感知不到。所以正确姿势是:先用示波器看信号电气质量,再用逻辑分析仪看协议层内容。如果你的示波器本身带 I2C 解码功能,那就更省事了,两件事一台机器全搞定,还能同时看模拟波形和解码结果。
5. 实战排查流程与常见问题速查
到这里,原理和单点操作都过了一遍,接下来把这些串成一个可供复用的排查流程。每次调 I2C 遇到问题,按这个顺序走一遍,绝大多数问题能在十分钟内定位。
5.1 我常用的五步排查流程
第一步,量电源和地。用万用表确认主控和从机的供电电压正常,共地正常,不存在压差过大。
第二步,量总线空闲状态。上电后万用表直流电压档量 SDA 和 SCL,正常都应该接近 VCC。如果有一根被拉低,不要急着看波形,先查哪个设备在拖总线。
第三步,示波器抓波形。触发选下降沿,接 SDA 通道,抓一帧完整的传输,确认有起始条件,有地址帧,能看到 ACK。
第四步,看 ACK 状态。第 9 个时钟周期 SDA 是否被拉低,拉低则设备在应答,不拉低说明地址、上电、速率或硬件连接有问题。
第五步,如果 ACK 正确但还是通信出错,把波形放大看数据位,确认每个字节内容是否和预期一致。这时候示波器的 I2C 解码功能最省力。
5.2 常见问题速查表
我把日常调试中遇到最多的几类问题整理成一张速查表,方便对照使用:
| 现象 | 可能原因 | 优先排查手段 |
|---|---|---|
| SDA/SCL 空闲电压为 0V | 总线被设备拉死、上拉电阻失焊、引脚短路 | 万用表通断档查短路,断电测对地电阻 |
| 有波形但看不到 START | 触发设置错误或触发源接错通道 | 改用 SDA 通道下降沿触发 |
| 地址后第 9 位为高(NACK) | 地址错误、从机未上电、速率过高 | 核对 datasheet 地址,降低速率,确认供电 |
| ACK 位有下拉但不干净 | 上拉电阻过大、总线电容过高 | 测上拉电阻,换更小阻值(如 2.2kΩ 或 1kΩ) |
| 通信时好时坏,偶尔卡死 | 时序竞争、上电时序、从机未复位 | 加延时、检查复位引脚、看从机 busy 标志 |
| 数据读回全 0xFF | 从机未驱动 SDA、读方向时序错误 | 确认读时序,主机在第 9 位不要拉低 SDA |
| 低速正常,400kHz 失败 | 从机不支持快速模式、总线电容大 | 降低速率,或换支持快速模式的器件 |
这张表不覆盖所有问题,比如 PCB 走线串扰、电源纹波等,但覆盖了最常见的 70% 以上的场景。实际排查时,先从表格前三行开始一个个排除,效率是最高的。
5.3 几个容易踩的坑
最后分享几个我踩过的坑,算是给后来人避雷。
第一个坑:用示波器探头直接去怼芯片引脚,接地夹又没有短接好,导致看到“重影”一样的波形。I2C 上升沿本身就不陡,如果探头接地线太长,会看到明显的过冲和振铃,非常容易误判成信号质量问题。正确做法是尽量用短接地弹簧,或者把手放在探头接地环上(某些探头可以直接接触接地环)。
第二个坑:没有按住示波器的单次触发(Single)就以为抓到了完整帧。I2C 通信不是恒定不断的,如果示波器处于自动滚动模式,很可能你看到的只是某个瞬间的毛刺,并不是完整帧。一定要用 Single 模式去抓一帧完整的通信过程,才能准确判断地址和数据。
第三个坑:忽略从机本身的“忙”状态。有些从机在内部处理数据时,不会响应主机的读请求,表现为偶尔 NACK。如果你只看示波器波形,很容易误判为硬件问题。处理方式是在主机端做重试,或者在连续读之前等待从机就绪信号。
第四个坑:上拉电阻和总线电容不匹配,导致高速模式不稳定。这种情况非常隐蔽,因为低速测试一切正常,一上高速就随机失败。用示波器看上升沿,如果明显像“斜坡”而非“台阶”,优先减小上拉电阻。常见 I2C 上拉 4.7kΩ 适用于玩具级调试,到了量产板或长走线场景,要根据实际电容重算。
我在实际调试中还有一个习惯:每次排查 I2C 问题,都会先把 SCL 频率降到最低(比如 10kHz),看能不能稳定通信。这个动作可以快速区分“协议逻辑问题”和“电气质量问题”。如果 10kHz 下通信正常、400kHz 下故障重现,问题大概率出在上升沿或者从机速度等级上;如果 10kHz 下依然异常,那就要优先检查地址、供电和复位这些基础项。这个“降速二分法”帮我定位过好几个疑难问题,比拿着示波器盲目扫波形有效得多。
I2C 说起来简单,只有两根线,但真正现场排查时,涉及的环节远比想象多。从万用表测静态电平,到示波器抓动态波形,再到 ACK 位的精细判读,每一步都有它的使用场景和局限性。工具不在多,关键是把每个工具该干的事分清楚,然后按流程走。希望这篇梳理能帮你在下次遇到 I2C 问题时,少走几次弯路。