1. I2C 信号排查的整体思路与工具选型
I2C 总线只有两根线,SDA 和 SCL,看起来简单得不行,但真正在板子上调不通的时候,很多人第一反应是“换一根线试试”或者“换个上拉电阻”,结果折腾半天还是没波形。我做了十多年硬件调试,踩过最多的坑就是:没有分层排查,直接上示波器看波形,结果连基本供电和上拉都没确认。所以这一节先把整体思路理清楚,再讲工具怎么选。
1.1 为什么 I2C 排查必须分层进行
I2C 通信失败的原因可以分成四层:物理层、电气层、协议层、应用层。物理层就是线有没有接对、有没有虚焊、SDA/SCL 有没有接反;电气层是上拉电阻是否合适、电源是否正常、电平是否匹配;协议层是起始条件、地址、ACK、数据帧格式对不对;应用层才是寄存器配置、时序参数、从机状态机的问题。
如果你一上来就用示波器抓波形,看到 SCL 有脉冲就以为没问题,但实际上可能是上拉电阻太大导致上升沿太缓,从机根本识别不到高电平。我见过一个案例,某工程师用 10k 上拉在 400kHz 速率下跑,示波器看波形“像那么回事”,但从机就是不应答,换成 2.2k 立刻通了。原因就是10k 上拉在 400kHz 下上升时间超过了 I2C 规范允许的最大值。
所以分层排查的逻辑是:先确认物理连接和供电,再用万用表测静态电平,然后用示波器看动态波形,最后用逻辑分析仪解码协议。每一步都有明确的通过标准,不通过就不要往下走。
1.2 万用表、示波器、逻辑分析仪各自能解决什么问题
很多人手里只有万用表,觉得测不了 I2C。其实万用表在 I2C 排查里作用很大,只是很多人不会用。万用表能测的是静态参数:SDA 和 SCL 对地电压、上拉电阻阻值、线路通断、电源电压。这些看起来简单,但 80% 的“I2C 不通”问题都出在这里。
示波器解决的是动态波形问题:上升沿时间、下降沿时间、时钟频率、占空比、毛刺、电平幅度。比如你怀疑从机把 SDA 拉低不放,示波器一看就知道。但示波器不能直接告诉你“ACK 是第几个时钟”,需要你自己数。
逻辑分析仪解决的是协议解码问题:起始条件、地址、读写位、ACK/NACK、数据字节。它能把 SDA 和 SCL 的波形直接翻译成十六进制数据,省去手动解码的麻烦。但逻辑分析仪只能看逻辑电平,看不到上升沿细节和毛刺,所以不能替代示波器。
我的建议是:万用表是必备,示波器是核心,逻辑分析仪是加速器。如果你只有万用表,也能排查大部分问题;如果有示波器,基本能定位到 90% 的故障;逻辑分析仪是在协议层快速定位的利器。
1.3 工具选型的几个关键参数
选示波器的时候,很多人只看带宽。对于 I2C 来说,带宽不是最重要的,采样率和存储深度才是。I2C 最高速率一般是 400kHz(快速模式)或 1MHz(快速模式+),但上升沿可能只有几十纳秒。如果你要用示波器看上升沿细节,带宽至少要是信号最高频率分量的 3 到 5 倍。I2C 的上升沿等效频率大概在 10MHz 到 30MHz 之间,所以100MHz 带宽的示波器足够。
采样率方面,至少要是信号频率的 10 倍以上。对于 400kHz 的 I2C,采样率 10MSa/s 就能看个大概,但要精确测量上升时间,建议 100MSa/s 以上。存储深度决定了你能抓多长时间的数据。I2C 一次传输可能几十个字节,每个字节 9 个时钟,加上起始和停止,大概几百个时钟周期。如果时钟是 100kHz,一次传输大概几毫秒。存储深度至少 1M 点,才能抓到完整的传输过程。
万用表方面,普通手持万用表就够用,但要注意输入阻抗。测 I2C 线路电压时,万用表输入阻抗一般是 10MΩ,对 I2C 线路影响很小。但如果你用万用表测上拉电阻,一定要断电测,否则并联的芯片引脚会影响读数。
逻辑分析仪方面,8 通道就够,因为 I2C 只用两根线。采样率建议 24MSa/s 以上,支持 I2C 解码就行。市面上几十块的和几千块的差别主要在软件易用性和协议支持数量上,对于 I2C 排查,便宜的也够用。
注意:不要用万用表的电流档去测 I2C 线路,万用表电流档内阻很小,相当于把线路短路,可能烧毁芯片。
2. 万用表静态排查:从供电到上拉的完整检查清单
万用表排查 I2C 的核心就一句话:确认线路在静态时处于正确的高电平状态。I2C 总线空闲时,SDA 和 SCL 都应该被上拉电阻拉到高电平。如果静态时不是高电平,那动态波形肯定不对。这一节我把万用表排查的完整流程拆开讲,每一步都有明确的判断标准。
2.1 供电与地线检查:最容易被忽略的第一步
很多人拿到板子直接测 SDA 和 SCL,结果发现电压不对,折腾半天才发现是从机芯片没供电。I2C 从机芯片的电源引脚如果没接好,SDA 和 SCL 可能通过内部 ESD 二极管被拉低,导致总线一直处于低电平。
用万用表测供电的步骤:先把万用表打到直流电压档,黑表笔接板子的地,红表笔依次测从机芯片的 VCC 引脚、主控芯片的 I2C 电源引脚、上拉电阻的上端。正常情况应该是 3.3V 或 5V,误差在 5% 以内。如果测到 0V,检查电源芯片是否工作;如果测到 1.5V 左右,可能是电源芯片限流了,或者有短路。
地线检查同样重要。主控和从机必须共地,如果两块板子分别供电但没有共地,I2C 电平没有参考点,通信肯定失败。用万用表通断档测主控的地和从机的地是否导通,正常应该蜂鸣器响。
我遇到过一个案例:某工程师用两块开发板做 I2C 通信,一块用 USB 供电,一块用外部电源供电,结果怎么都不通。后来发现两块板子的地没有连在一起,USB 供电的地和外部电源的地之间有几十伏的压差,I2C 芯片差点烧了。所以共地是 I2C 通信的绝对前提。
2.2 上拉电阻测量:阻值、位置、数量
上拉电阻是 I2C 的灵魂。没有上拉电阻,I2C 总线就是开漏输出,永远拉不到高电平。上拉电阻太大,上升沿太缓;上拉电阻太小,功耗太大,甚至可能超过芯片的灌电流能力。
用万用表测上拉电阻的方法:断电,把万用表打到电阻档,红黑表笔分别接上拉电阻的两端。正常读数应该在标称值附近,比如 4.7k 的电阻,读数在 4.6k 到 4.8k 之间都算正常。如果读数是 0Ω,说明电阻短路了;如果读数是无穷大,说明电阻开路或者虚焊。
但要注意:在线测电阻时,电阻可能和其他元件并联。比如上拉电阻和芯片的引脚并联,芯片内部可能有保护二极管,会影响读数。所以最准确的方法是把电阻一端焊下来测,或者至少确认并联路径的影响。
上拉电阻的位置也很关键。上拉电阻应该接在总线的最远端,而不是随便找个地方接。如果上拉电阻离从机太远,线路上的分布电容和电阻会导致上升沿变缓。一般来说,上拉电阻放在主控端或者总线中间都可以,但不要放在分支的末端。
上拉电阻的数量也要注意。整条总线上只需要一组上拉电阻,不要每个从机都加一组。如果多个从机都加了上拉电阻,并联后阻值变小,可能导致灌电流过大。比如两个 4.7k 并联就是 2.35k,在 3.3V 下灌电流约 1.4mA,一般芯片能承受,但如果是 1k 并联就是 500Ω,灌电流 6.6mA,很多芯片就受不了了。
2.3 SDA 和 SCL 静态电平判断
测完供电和上拉电阻,接下来测 SDA 和 SCL 的静态电压。总线空闲时,SDA 和 SCL 都应该是高电平,电压值等于上拉电阻上端的电压。如果是 3.3V 系统,SDA 和 SCL 都应该接近 3.3V;如果是 5V 系统,应该接近 5V。
如果测到 SDA 或 SCL 是 0V,说明有设备在拉低总线。可能的原因:从机芯片没供电但 SDA 引脚有电流灌入,导致内部二极管导通拉低总线;或者某个芯片的 SDA 引脚损坏短路到地;或者线路有短路。
如果测到 SDA 或 SCL 是中间电平,比如 1.8V,说明上拉电阻和下拉路径形成了分压。可能的原因:上拉电阻太大,而芯片内部有弱下拉;或者线路有漏电。
如果测到 SDA 和 SCL 电压不一样,比如 SCL 是 3.3V,SDA 是 1.5V,说明 SDA 线路有问题。I2C 空闲时 SDA 和 SCL 都应该是高电平,电压应该基本一致。
提示:测静态电平时,万用表黑表笔一定要接在从机芯片的地引脚上,不要随便找个螺丝孔接地。如果地线有压降,测出来的电压会不准。
2.4 线路通断与短路排查
线路通断排查用万用表的通断档。断电,测主控的 SDA 引脚到从机的 SDA 引脚是否导通,SCL 同理。正常应该蜂鸣器响,电阻接近 0Ω。如果不响,说明线路断了,可能是 PCB 走线断了、连接器接触不良、或者焊点虚焊。
短路排查同样重要。测 SDA 对地、SCL 对地、SDA 对 SCL 之间是否短路。正常应该不导通。如果短路,可能是焊接时锡渣搭桥、PCB 内部短路、或者芯片损坏。
我遇到过一个很隐蔽的案例:某板子 I2C 时通时不通,用万用表测通断,发现 SDA 线路电阻在 0Ω 到几十欧姆之间跳变。后来发现是连接器的针脚氧化了,接触电阻不稳定。所以测通断时不要只看蜂鸣器响不响,最好看电阻读数,如果读数超过 1Ω,就要怀疑接触不良。
3. 示波器动态波形分析:上升沿、时钟频率与 ACK 定位
万用表确认静态没问题后,接下来用示波器看动态波形。示波器能看到万用表看不到的东西:上升沿时间、时钟频率、占空比、毛刺、ACK 位。这一节我按“先看整体、再看细节、最后定位 ACK”的顺序讲。
3.1 示波器探头连接与触发设置
用示波器测 I2C,至少需要两个通道,一个接 SDA,一个接 SCL。如果示波器通道多,可以再接一个从机的电源或者中断引脚,方便观察时序关系。
探头连接要注意:使用 10:1 探头,不要用 1:1 探头。10:1 探头的输入电容小,对 I2C 线路影响小。1:1 探头输入电容可能几十 pF,会明显影响上升沿。探头的地线要尽量短,不要用那种带长鳄鱼夹的地线,长地线会引入振铃和噪声。最好用探头自带的弹簧地针,直接接在芯片地引脚附近。
触发设置是关键。触发源选 SCL,触发方式选下降沿,触发电平设在 1.5V 左右(3.3V 系统)。为什么选 SCL 下降沿?因为 I2C 的数据在 SCL 高电平期间有效,SCL 下降沿之后数据可以变化。用 SCL 下降沿触发,能稳定抓到每个时钟周期的开始。
触发模式选“正常”或“单次”。如果选“自动”,没有信号时示波器也会刷新,可能看到噪声。选“正常”模式,只有满足触发条件时才刷新,波形更干净。如果想抓一次完整的传输,选“单次”模式,然后让主控发起一次 I2C 传输。
时基设置:先设 100μs/div 看整体,如果能看到起始条件和几个字节,再放大到 10μs/div 看细节。如果 I2C 速率是 100kHz,一个时钟周期是 10μs,10μs/div 刚好一个格子一个周期。如果是 400kHz,一个周期 2.5μs,设 2μs/div 比较合适。
3.2 上升沿时间测量与上拉电阻匹配
上升沿时间是 I2C 排查里最容易被忽略的参数。I2C 规范对上升沿有明确要求:标准模式(100kHz)最大上升时间 1000ns,快速模式(400kHz)最大 300ns,快速模式+(1MHz)最大 120ns。如果上升沿超过这个值,从机可能识别不到高电平。
上升沿时间由上拉电阻和总线电容决定,公式是:t_r ≈ 0.847 × R_pullup × C_bus。其中 C_bus 是总线上的总电容,包括 PCB 走线电容、芯片引脚电容、探头电容。一般 PCB 走线电容约 1pF/cm,芯片引脚电容约 5pF 到 10pF,探头电容 10:1 约 10pF 到 15pF。
举个例子:如果总线电容是 100pF,上拉电阻是 4.7k,上升时间约 0.847 × 4700 × 100e-12 ≈ 398ns。这个值在 400kHz 下刚好超标(最大 300ns),所以 4.7k 上拉在 400kHz 下可能不够。换成 2.2k,上升时间约 186ns,就满足了。
用示波器测上升沿的方法:把时基放大到 1μs/div 或更小,用光标测量 SCL 从 0.3VDD 到 0.7VDD 的时间。I2C 规范定义的上升时间就是 0.3VDD 到 0.7VDD。如果是 3.3V 系统,就是 1V 到 2.3V 之间。
如果上升沿太缓,解决办法:减小上拉电阻。但要注意灌电流不能超过芯片能力。一般 I2C 芯片灌电流能力是 3mA,3.3V 下上拉电阻最小约 1.1k。如果减小上拉电阻后上升沿还是太缓,说明总线电容太大,需要检查线路是否太长、分支是否太多、探头电容是否太大。
3.3 时钟频率与占空比检查
时钟频率是 I2C 通信的基础。主控发出的 SCL 频率必须和从机支持的频率匹配。如果从机只支持 100kHz,主控发 400kHz,从机可能不响应。用示波器测频率的方法:用光标测两个相邻 SCL 下降沿之间的时间,取倒数就是频率。或者用示波器的自动测量功能,直接读频率值。
占空比也很重要。I2C 规范要求 SCL 高电平时间和低电平时间都有最小值。标准模式下,高电平最小 4.0μs,低电平最小 4.7μs。快速模式下,高电平最小 0.6μs,低电平最小 1.3μs。如果占空比太偏,比如高电平只有 0.1μs,从机可能来不及采样。
我遇到过一个案例:某主控的 I2C 时钟占空比是 90%,高电平 9μs,低电平 1μs。从机在低电平期间准备数据的时间不够,导致数据不稳定。后来调整了主控的 I2C 配置,把占空比改成 50%,问题解决。所以占空比不是随便设的,要看从机手册的要求。
3.4 用示波器定位 ACK 位
ACK 是 I2C 通信里最关键的信号。主控发送完 8 位数据后,第 9 个时钟周期,从机应该把 SDA 拉低,表示应答。如果从机没有拉低 SDA,就是 NACK,说明从机没收到或者地址不对。
用示波器定位 ACK 的方法:先找到起始条件。起始条件是 SCL 高电平期间,SDA 从高变低。然后数 SCL 的下降沿,第 1 到第 8 个下降沿对应 8 位数据,第 9 个下降沿对应 ACK 位。在第 9 个 SCL 高电平期间,看 SDA 是否被拉低。
具体操作:把时基设到能看清 9 个时钟周期,比如 100kHz 下,9 个周期是 90μs,设 20μs/div 能看到 4.5 个周期,设 50μs/div 能看到 9 个周期。然后用光标标记起始条件,再数 SCL 脉冲。
如果 SDA 在第 9 个时钟周期是高电平,说明 NACK。可能的原因:从机地址不对、从机没供电、从机忙、从机损坏。如果 SDA 在第 9 个时钟周期是低电平,说明 ACK 正常,问题在后面的数据或寄存器配置。
注意:示波器看 ACK 时,要确保探头地线接好,否则可能看到假波形。另外,如果总线上有多个从机,ACK 可能来自其他从机,要结合地址判断。
4. 逻辑分析仪协议解码与常见故障速查
示波器看波形很直观,但数时钟周期很累。逻辑分析仪能直接把 I2C 波形解码成地址、数据、ACK/NACK,效率高很多。这一节讲逻辑分析仪的使用方法,以及常见故障的速查表。
4.1 逻辑分析仪连接与 I2C 解码设置
逻辑分析仪的连接很简单:通道 0 接 SCL,通道 1 接 SDA,地线接板子地。注意逻辑分析仪的输入电压范围,一般是 0V 到 5V,如果是 3.3V 系统没问题,如果是 5V 系统要确认逻辑分析仪能承受 5V。
采样率设置:至少是 SCL 频率的 10 倍。100kHz 的 I2C,采样率 1MSa/s 就够;400kHz 的 I2C,采样率 4MSa/s 以上。但为了看清毛刺,建议设 24MSa/s 或更高。采样深度要足够抓一次完整传输,一般 1M 点够用。
解码设置:在逻辑分析仪软件里选择 I2C 解码器,指定 SCL 和 SDA 对应的通道,设置正确的电平标准。有些软件还需要设置地址格式(7 位或 10 位)。设置好后,软件会自动把波形翻译成类似这样的格式:
Start Address: 0x50 (Write) ACK Data: 0x00 ACK Data: 0xAB ACK Stop这样一眼就能看出地址对不对、ACK 有没有、数据是什么。
4.2 常见故障速查表
我把 I2C 排查中常见的故障整理成表格,方便快速定位。
| 现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| SDA/SCL 静态低电平 | 从机没供电、芯片损坏、线路短路 | 万用表测供电和通断 | 修复供电、更换芯片、排除短路 |
| SDA/SCL 静态中间电平 | 上拉电阻太大、线路漏电 | 万用表测上拉电阻和漏电 | 减小上拉电阻、清洁板子 |
| 上升沿太缓 | 上拉电阻太大、总线电容太大 | 示波器测上升时间 | 减小上拉电阻、缩短走线 |
| 时钟频率不对 | 主控配置错误 | 示波器测频率 | 修改主控 I2C 配置 |
| 地址 NACK | 从机地址错误、从机没就绪 | 逻辑分析仪看地址 | 核对从机手册、加延时 |
| 数据 NACK | 从机忙、寄存器地址错误 | 逻辑分析仪看数据 | 检查从机状态、核对寄存器 |
| 时通时不通 | 接触不良、电源纹波大 | 万用表测通断、示波器测电源 | 重新焊接、加滤波电容 |
| 多从机冲突 | 地址重复、上拉电阻过多 | 逻辑分析仪看地址 | 修改地址、去掉多余上拉 |
4.3 几个容易踩的坑与实操心得
坑一:忽略从机的时钟拉伸。有些从机在处理数据时会拉低 SCL,强制主控等待,这叫时钟拉伸。如果主控不支持时钟拉伸,可能会出错。用示波器看 SCL 是否被从机拉低,如果拉低时间很长,说明从机在忙。
坑二:上拉电阻接到错误的电源。比如主控是 3.3V,从机是 5V,上拉电阻接到 5V,主控的 SDA 引脚可能承受不了 5V。上拉电阻的电源应该和主控的 I2C 电源一致,或者用电平转换芯片。
坑三:忽略总线的分布电容。如果 I2C 走线很长,比如超过 30cm,分布电容可能超过 100pF,导致上升沿太缓。解决办法是减小上拉电阻,或者用 I2C 缓冲器。
坑四:用万用表测波形。万用表只能测平均值,测不了 I2C 的动态波形。有人用万用表测 SDA 电压,看到 1.5V 以为正常,其实是平均电压。测 I2C 必须用示波器或逻辑分析仪。
坑五:忘记共地。两块板子分别供电时,一定要共地。我见过有人用电池给从机供电,忘了共地,结果 I2C 怎么都不通。
4.4 从 ACK 失败到通信成功的完整案例
最后分享一个我最近处理的案例。某项目用 GT911 触摸屏,I2C 地址是 0x5D,主控是 Linux 系统。现象是:开机后触摸屏偶尔能用,大部分时间不能用。用逻辑分析仪抓波形,发现主控发送地址 0x5D 后,从机没有 ACK。
排查过程:先用万用表测 GT911 的供电,3.3V 正常;测上拉电阻,4.7k 正常;测 SDA 和 SCL 静态电平,都是 3.3V 正常。然后用示波器看波形,发现 SCL 频率是 400kHz,上升沿约 500ns,超过快速模式的最大 300ns。问题定位:上升沿太缓。
解决方案:把上拉电阻从 4.7k 换成 2.2k,上升沿降到约 230ns,通信立刻稳定。后来查 GT911 手册,发现它支持快速模式,但对上升沿要求比较严。所以不要以为上拉电阻随便选一个就行,要根据速率和总线电容计算。
这个案例的教训是:万用表确认静态没问题后,一定要用示波器看上升沿。如果只看逻辑分析仪的解码结果,可能看到地址发出去了但没 ACK,却不知道原因是上升沿太缓。
提示:换上拉电阻后,要重新测上升沿和灌电流。灌电流 = (VDD - VOL) / R_pullup,一般 VOL 约 0.4V,3.3V 下 2.2k 的灌电流约 1.3mA,在芯片承受范围内。
5. 不同速率下的参数计算与工具配置建议
I2C 有标准模式、快速模式、快速模式+、高速模式等不同速率等级,每个等级对上升沿、上拉电阻、总线电容的要求都不一样。这一节我把参数计算和工具配置整理清楚,方便你直接抄作业。
5.1 标准模式 100kHz 的参数计算
标准模式下,SCL 频率最高 100kHz,上升沿最大 1000ns,总线电容最大 400pF。上拉电阻的计算公式:R_pullup ≤ t_r / (0.847 × C_bus)。如果 C_bus 是 200pF,t_r 最大 1000ns,则 R_pullup ≤ 1000e-9 / (0.847 × 200e-12) ≈ 5.9k。所以标准模式下,4.7k 或 5.1k 上拉都可以。
灌电流计算:I_sink = (VDD - VOL) / R_pullup。3.3V 下,4.7k 的灌电流约 0.62mA,远小于 3mA 的限制。所以标准模式下上拉电阻选择很宽松。
示波器配置:时基 10μs/div,触发 SCL 下降沿,触发电平 1.5V。逻辑分析仪采样率 1MSa/s 以上。
5.2 快速模式 400kHz 的参数计算
快速模式下,SCL 频率最高 400kHz,上升沿最大 300ns,总线电容最大 400pF。上拉电阻:R_pullup ≤ 300e-9 / (0.847 × 200e-12) ≈ 1.77k。所以 4.7k 在 400kHz 下可能超标,建议用 2.2k 或 1.8k。
灌电流:3.3V 下,2.2k 的灌电流约 1.3mA,1.8k 约 1.6mA,都在 3mA 以内。但如果总线电容更大,比如 300pF,则 R_pullup ≤ 300e-9 / (0.847 × 300e-12) ≈ 1.18k,灌电流约 2.5mA,接近极限。
示波器配置:时基 2μs/div,触发 SCL 下降沿,触发电平 1.5V。逻辑分析仪采样率 4MSa/s 以上。
5.3 快速模式+ 1MHz 的参数计算
快速模式+下,SCL 频率最高 1MHz,上升沿最大 120ns,总线电容最大 550pF。上拉电阻:R_pullup ≤ 120e-9 / (0.847 × 200e-12) ≈ 0.71k。所以需要 680Ω 或更小的上拉电阻。
灌电流:3.3V 下,680Ω 的灌电流约 4.3mA,超过一般芯片的 3mA 限制。所以快速模式+通常需要专用的 I2C 缓冲器或电平转换芯片,不能直接用普通上拉电阻。
示波器配置:时基 1μs/div,触发 SCL 下降沿,触发电平 1.5V。逻辑分析仪采样率 10MSa/s 以上。
5.4 工具配置速查表
| 速率等级 | 频率 | 最大上升沿 | 推荐上拉 | 示波器时基 | 逻辑分析仪采样率 |
|---|---|---|---|---|---|
| 标准模式 | 100kHz | 1000ns | 4.7k | 10μs/div | 1MSa/s |
| 快速模式 | 400kHz | 300ns | 2.2k | 2μs/div | 4MSa/s |
| 快速模式+ | 1MHz | 120ns | 680Ω | 1μs/div | 10MSa/s |
| 高速模式 | 3.4MHz | 80ns | 专用缓冲 | 500ns/div | 20MSa/s |
注意:上表是典型值,实际选择要根据总线电容调整。如果走线长、分支多,总线电容大,上拉电阻要相应减小。
6. 从波形到代码:I2C 排查后的验证与优化
排查完硬件问题后,还要从软件层面验证和优化。这一节讲怎么用代码确认 I2C 通信正常,以及怎么优化 I2C 的稳定性。
6.1 用 i2c-tools 快速验证
Linux 系统下,i2c-tools是最常用的 I2C 调试工具。先用i2cdetect -l列出所有 I2C 总线,找到对应的总线编号。然后用i2cdetect -y 1扫描总线上的设备,正常会显示从机地址。
如果扫描不到设备,说明硬件还有问题。如果扫描到了但读写失败,用i2cget和i2cset读写寄存器。比如i2cget -y 1 0x50 0x00读地址 0x50 的 0x00 寄存器。
i2c-tools的好处是快速验证,但不能看波形。如果i2cdetect能扫到地址,说明 ACK 正常,硬件基本没问题。
6.2 用示波器触发抓取偶发故障
偶发故障最难排查。用示波器的单次触发模式,设置触发条件为 NACK。有些高端示波器支持协议触发,可以直接设“ACK 失败时触发”。如果没有协议触发,可以用 SCL 下降沿触发,然后让程序循环读写,直到抓到 NACK。
抓到 NACK 后,看 NACK 发生前的波形:是地址 NACK 还是数据 NACK?地址 NACK 说明从机没响应,数据 NACK 说明从机忙或寄存器错误。结合代码逻辑分析。
6.3 优化 I2C 稳定性的几个技巧
技巧一:加延时。有些从机在上电后需要一段时间才能响应 I2C,比如 GT911 需要 100ms。在主控初始化 I2C 后加 100ms 延时,能解决很多“第一次通信失败”的问题。
技巧二:降低速率。如果 400kHz 不稳定,先降到 100kHz 验证功能。功能正常后再逐步提高速率,找到稳定工作的最高速率。
技巧三:加滤波电容。在 SDA 和 SCL 对地加 10pF 到 100pF 的电容,能滤除高频噪声。但电容不能太大,否则上升沿会变缓。
技巧四:用差分探头。如果板子上有强干扰,用差分探头测 I2C 能看得更清楚。单端探头容易引入共模噪声。
技巧五:检查电源纹波。I2C 通信失败有时是电源纹波太大导致的。用示波器测从机电源的纹波,如果超过 50mV,加滤波电容或换 LDO。
6.4 一个完整的排查流程总结
最后我把整个排查流程串起来,方便你按步骤操作:
- 万用表测供电和地:确认从机 VCC 正常,主控和从机共地。
- 万用表测上拉电阻:确认阻值正确,位置合理,数量不多余。
- 万用表测静态电平:SDA 和 SCL 空闲时都是高电平,电压一致。
- 万用表测通断和短路:SDA 和 SCL 线路导通,对地不短路。
- 示波器看整体波形:有起始条件、时钟脉冲、停止条件。
- 示波器测上升沿:上升时间在规范以内。
- 示波器测时钟频率和占空比:频率匹配,占空比合理。
- 示波器定位 ACK:第 9 个时钟周期 SDA 被拉低。
- 逻辑分析仪解码:地址、数据、ACK 都正确。
- 软件验证:用 i2c-tools 读写寄存器,确认功能正常。
这个流程走下来,90% 的 I2C 问题都能定位。剩下的 10% 可能是芯片本身的问题,或者多主机冲突等复杂场景,需要结合具体芯片手册和系统架构分析。
我个人在实际操作中的体会是:I2C 排查最怕跳步。很多人觉得万用表测静态太简单,直接上示波器,结果在波形上纠结半天,最后发现是供电没接好。按流程一步步来,看起来慢,实际上最快。另外,示波器和逻辑分析仪不是替代关系,是互补关系。示波器看电气特性,逻辑分析仪看协议内容,两个都用上,排查效率翻倍。