ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

I2C信号怎么测?万用表、示波器到ACK的完整排查流程

I2C信号怎么测?万用表、示波器到ACK的完整排查流程 I2C 信号怎么测从万用表、示波器到 ACK 的完整排查流程前阵子调一块板子从机设备偶尔不响应主机请求时序看起来“差不多”但就是偶发丢数据。排查了半天最后发现是 SDA 线上的上升沿太慢超过了从机对 setup time 的要求。这让我重新把 I2C 信号的测量方法完整捋了一遍从万用表测静态电平到示波器看时序边沿再到逻辑分析仪抓 ACK 响应每一步都有它不可替代的作用也有各自的“坑”。这篇文章就把这套排查流程完整分享出来写给正在跟 I2C 较劲的同行们。I2C 的排查难点在于它只有两根线SDA 和 SCL但承载的信息量却不小起始条件、停止条件、地址、数据、ACK/NACK全靠电平变化和时间关系来表达。设备不响应时你得先搞清楚是根本没收到数据还是收到了但没法正确回复这就需要一套从易到难、从粗到细的排查工具链。下面我按实际排查时的工具递进关系来讲每一步对应什么场景、能确认什么问题、有什么局限性都会说清楚。1. 排查前必须理解的三件事电平、时序、ACK1.1 为什么 I2C 往往“量着有电、跑着失败”很多初学者一上来就拿万用表量 SCL 和 SDA发现都有 3.3V或者 5V就觉得总线没问题。这个判断其实只对了一小半。I2C 是开漏结构两根线靠上拉电阻拉到高电平设备通过拉低来传输数据。所以静态时两根线确实都应该处于高电平这一点没毛病但真正通信时总线上的信号是不断在高低之间跳变的万用表根本反映不出这种动态行为。我用万用表测到过的最典型的“假象”是SDA 被某个设备拉死在了低电平万用表一量发现是 0V这时确实能发现问题但更多时候总线静态电压正常、通信却失败问题藏在边沿时间、时序关系甚至 ACK 回复上这些万用表完全无能为力。搞清楚这一点你就不会在排查初期在万用表上浪费太多时间也不会因为万用表读数正常就草率排除总线问题。还有一个很容易被忽略的点I2C 的上拉电阻阻值直接决定信号边沿的陡峭程度。阻值太大上升沿会变得很缓在 400kHz 快速模式下尤其容易出问题阻值太小又会增加功耗、可能拉不低电平。所以排查时如果发现波形边沿异常第一步不是怀疑从机而是检查上拉电阻选型。1.2 时序参数和 ACK 是排查的两个核心抓手I2C 通信能不能成功从物理层看就是时序参数是否满足要求。标准模式100kHz下SCL 高电平最小时间 4.0us低电平最小时间 4.7usSDA 和 SCL 之间的建立时间、保持时间也都有明确要求。快速模式400kHz则把这些时间压缩到原来的四分之一左右。如果你的 MCU 主频不够或者软件模拟 I2C 的延时写得不对这些时序参数就很容易超标。而从协议层看ACK 是排查的重中之重。每一字节传输完成后接收方需要在第 9 个时钟周期拉低 SDA 来表示“我收到了”。如果从机没拉低主机就会看到 NACK通信也就进行不下去。实际排查中ACK 异常的原因多种多样地址不对、从机没上电、从机忙、总线被占用甚至 SDA 上拉失效都会表现为 ACK 阶段异常。所以我做排查时一定是先确认物理层电平正常再用示波器抓时序确认波形符合规格最后才用逻辑分析仪或者深入看 ACK 阶段去定位协议层问题。这个顺序基本能覆盖 90% 以上的 I2C 故障场景。2. 万用表阶段静态电平与通断检查能定位哪些问题2.1 上电后的四个必测项目用万用表排查 I2C主要干四件事。第一是量 SCL 和 SDA 的静态电压确认上拉电阻是否正常工作正常应该是 VCC 电平比如 3.3V第二是量上拉电阻的阻值确认是不是在合理范围第三是量从机设备供电引脚电压确认设备是否正常上电第四是通断测试确认 SCL/SDA 连线没有虚焊、断路或者焊桥短路。量电阻这一步有个细节最好在板上断电状态下测而且要把其中一端从电路中断开或者至少意识到测量结果会受并联电路影响。如果上拉电阻旁边还并了其他东西比如 ESD 保护器件测出来的阻值会偏小不要因此误判。通断测试也值得一提。PCB 打样或者手工焊接的板子最烦的就是虚焊和焊桥。SDA 和 SCL 相邻引脚之间如果有一点点锡渣就可能把两根线短路在一起。用万用表蜂鸣档量一下 SDA 和 SCL 之间是否导通能快速排除这类低级问题。我见过不少“I2C 通信失败”其实只是飞线接触不良万用表一量就现原形了。2.2 万用表能看到 ACK 吗实测给你结论这个问题我经常被问到。直接说结论普通万用表看不到 ACK。ACK 是第 9 个时钟周期内 SDA 被拉低的短暂动作以 100kHz 为例一个 bit 的时间只有 10us万用表的采样速度根本跟不上。不过有一种特殊情况如果你用的是带频率档或者占空比档的万用表在总线持续通信时量 SCL能看到一个接近通信频率的读数这至少能帮你确认“SCL 上有没有时钟在跑”。有个更实用的技巧是利用万用表的电压档看总线活动的大致情况。当 I2C 总线正在持续通信时SDA 线上会有大量数据跳变用直流电压档量读数会介于 0 和 VCC 之间而不是稳定的 VCC。如果通信比较密集读数可能接近 VCC 的一半如果总线空闲读数是 VCC如果总线被拉死读数是 0 或者很低。这个“模糊判断”虽然不能替代示波器但在现场快速判断“总线到底有没有在动”时非常管用。万用表阶段的排查结论本质上只能覆盖“物理层静态状态”。它能告诉你线上有没有短路、上拉是否正常、设备有没有供电但回答不了“时序对不对”“波形成不成立”“ACK 有没有回复”这些问题。所以万用表没问题不代表总线没问题但万用表有问题一定先解决万用表的问题。3. 示波器阶段从“有没有波形”到“时序对不对”3.1 示波器测 I2C 的四个关键设置到了示波器这一步很多人会用默认设置直接去戳结果屏幕上什么都抓不到。I2C 信号是突发性的可能几百毫秒才来一笔默认的时基根本看不到。我一般按这个思路设置时基先设到 10ms/格或者更慢触发方式选下降沿触发触发电平设在 VCC 的一半左右。这样一旦主机发起起始条件SCL 高电平时 SDA 拉低示波器就能稳定抓到起始位置。通道CH1 接 SCLCH2 接 SDA并确保两个通道的垂直档位一致比如都设 1V/格这样才能准确对比两根线的逻辑关系。采样率至少 100MSa/s 以上。标准模式 100kHz 下一个 bit 10us采样率太低会让波形失真快速模式 400kHz 下更要注意。存储深度有条件的话开大。I2C 一帧数据可能包含多个字节存储深度不够就只能看到一两个字节没法判断完整事务。触发是一个大坑。如果示波器没有 I2C 触发解码功能一般用下降沿触发就够了因为 I2C 的起始条件必然是 SDA 的下降沿但如果总线清闲、很久才有一次通信你得把示波器设成“等待触发”状态耐心等。有的示波器支持“滚动模式”在这种低频突发信号下反而比触发模式更好用能一直看到总线上的变化过程。3.2 单通道测量判断起始条件、地址和 ACK 节奏用示波器抓 I2C 信号不建议一上来就开解码功能先把原始波形看明白更利于建立直观感觉。我习惯先只接 SDA 单通道触发在下降沿抓一帧完整的通信波形。这时你能清楚看到SDA 上先出现一个下降沿起始条件然后是一串高低变化地址和数据的每一位中间有一个明显的短脉冲第 9 个周期的 ACK 位最后是一个上升沿停止条件。如何从单通道波形判断 ACK 位有个很实用的方法观察地址字节和数据字节之间SDA 是否有一个明显的“额外跳变”。如果没有这个跳变说明对应字节没有被 ACK通信会中断。但这个判断需要经验更可靠的做法还是用双通道同时抓 SCL 和 SDA数出第 9 个时钟周期的 SDA 状态低电平就是 ACK高电平就是 NACK。双通道测量时把 SCL 接到外触发通道能稳定锁定每一字节的边界分析起来更顺手。如果观察到 NACK接下来要判断是谁的责任。常见情况是主机发送了从机地址后第 9 个时钟 SLA 没被拉低。可能原因包括从机没上电、地址写错、从机地址配置引脚不对、或者从机总线时钟还没初始化好。这时要先用万用表确认从机供电再对照数据手册确认地址位最后用示波器观察复位时序基本能定位问题。3.3 实测波形和“协议解码”怎么配合现代示波器大多支持 I2C 协议解码能把地址、读写位、ACK/NACK 直接标出来极大提高排查效率。但解码功能是把双刃剑它把原始波形“翻译”成了协议层面的信息如果波形本身质量很差解码结果可能误导人。我遇到过解码显示从机 NACK但实际问题是 SDA 上升沿太缓从机根本没机会在第 9 个时钟前完整采样到高电平。示波器解码工具看的是“逻辑电平”而非“波形质量”所以它会照常解析而真正的物理层问题藏在波形边沿里。建议的流程是先用原始波形确认每个 bit 的边沿都清晰、没有台阶、没有缓坡再切换到解码模式读协议内容。只看解码结果不看原始波形是排查 I2C 最容易踩的坑。另外示波器上还可以借助 SCL 的频率做粗判。比如显示 SCL 频率是 90kHz 还是 410kHz可以在一定程度上确认通信速率模式是否与从机规格匹配。部分从机只支持 100kHz如果主机在 400kHz 下运行通信不稳定测 SCL 频率就能发现问题。用示波器自带的频率测量功能就能看到这个数据。4. ACK 深度排查总线仲裁、从机不回复与手动 ACK4.1 第 9 个时钟周期到底发生了什么回到开头说的那个案例。当时我用示波器抓波形起始条件、地址、数据看起来都对但偶尔会出现一次 NACK且没有什么明显规律。后来才发现问题不在某个单独的事务上而是总线上的另一个主设备在和我们抢总线。I2C 总线是支持多主机仲裁的两个主机同时发数据时谁先拉低 SDA 谁就赢得总线。我们板子上的两个 MCU 都跑 I2C 主机模式又没有做完善的仲裁处理结果偶发出现总线冲突。表现就是从机收到了数据但主机的控制逻辑已经错乱没等到 ACK 位就继续发下一个字节或者从机在 ACK 位上被另一路信号干扰。要定位这类问题仅靠单台示波器比较吃力最好用逻辑分析仪同时抓 SCL、SDA 以及两个主机的控制信号把时序对齐来看。如果没有逻辑分析仪也可以在软件层面加上总线空闲检测和错误重试机制至少保证一条总线上同一时间只有一个主机在讲话。从机不回复 ACK 的原因也值得展开。常见的有几种地址不匹配。I2C 地址有 7 位和 10 位两种格式很多芯片还有地址引脚A0/A1/A2用来配置多个器件。地址引脚悬空或者接错会导致从机实际地址和主机发送的不一致。从机未完成初始化。有些从机需要几十毫秒甚至更长时间才能进入可通信状态如果主机在从机上电瞬间就发起通信大概率会遇到 NACK。从机处于忙状态。比如 EEPROM 正在执行内部写入周期此时对它的任何读写都不会被 ACK。这种情况在 EEPROM 项目里非常常见正确做法是检测到 NACK 后等待内部写入完成再重试。SDA 被其他设备干扰。前面提到的多主机仲裁就是典型例子还有外部干扰导致 SDA 上出现毛刺、从机采样出错。4.2 I2C 自由数据模式和手动 ACK 的调试用法示波器上还有个功能叫“I2C 自由数据模式”对排查来说很实用。它不依赖完整的协议帧结构只要 SCL 上有时钟示波器就会把 SDA 上的数据逐个 bit 解析出来。这在协议解码功能因波形异常而失效时特别管用你可以一 bit 一 bit 地数确认主机发送的每一位是否正确再对照数据手册的帧格式找问题出在哪一个 bit。手动 ACK 则是逻辑分析仪或者某些协议分析工具提供的交互功能默认情况下工具会自动回复 ACK但你可以改用手动模式决定要不要对某个字节回复 ACK。这在调试从机行为时意义很大。比如你写了一个 I2C 从机程序想验证它发送数据后对主机 ACK 的处理是否正确就可以用手动 ACK 故意让主机发送 NACK看从机程序能不能正确处理这种情况。这两个功能对软件调 I2C 驱动的人尤其有用。我在调一个用 GPIO 模拟 I2C 从机的固件时就是靠自由数据模式逐 bit 检查主机发的地址发现原来程序里把从机地址的左移一位操作写反了导致读写位始终不对。这类逻辑错误在协议层面非常隐蔽但在物理波形层面一眼就能看出来。4.3 从 ACK 波形反推硬件问题的一个实例有一次排查一个传感模块从机地址确认无误、供电也正常但就是第一个字节就 NACK。示波器抓下来发现 ACK 位 SDA 确实处于高电平也就是没拉低。从机规格书明确说支持标准 I2C于是我把怀疑点转向了 SCL 和 SDA 的上拉电阻。实测发现 SDA 上拉电阻焊接成了 10kSCL 却焊成了 4.7k阻值不对称。I2C 规范要求 SDA 和 SCL 的上升时间相近如果 SDA 上拉过弱从机回复 ACK 时拉低 SDA 的时间点可能正好落在 SCL 采样窗口之外导致主机认为没有 ACK。更换为两支 4.7k 电阻后问题消失。从 ACK 波形反推硬件问题这是很典型的例子。这个案例也说明排查 I2C 时不要只盯逻辑物理层的电阻、电容、布线长度都直接影响信号质量。特别是线缆连接的外部 I2C 设备走线长、分布电容大上拉电阻不相应调小的话边沿时间很容易超标。5. 逻辑分析仪与进阶工具把 I2C 通信“翻译”成人话5.1 逻辑分析仪的 I2C 解码如何快速定位 ACK 问题示波器看 I2C 波形体验是不错但如果有逻辑分析仪效率能再上一个台阶。逻辑分析仪的优势有两个一是通道多可以同时抓 SCL、SDA、从机的中断引脚、使能引脚等多路信号二是协议解码做得更细能把起始、地址、ACK、数据、停止条件按帧结构清晰展示出来。我用逻辑分析仪排查 I2C 问题的惯用流程是先设置好采样率和触发条件下降沿触发抓一段总线上的完整波形然后在解码设置里选 I2C 协议、配置好 SCL 和 SDA 通道软件就会自动列出每一帧的地址、读写方向、ACK 状态、数据内容。遇到 ACK 异常时直接看解码结果中标红的那一帧再双击跳转到原始波形检查第 9 个时钟附近 SDA 的实际状态。和示波器解码比逻辑分析仪在“自动识别 ACK 问题”上做得更顺手它能统计总线上有多少 ACK 错误、哪些设备的地址没有 ACK、频率分布如何。之前调一个多从机系统用逻辑分析仪一眼就看到地址 0x27 的从机在所有会话中都没 ACK一查发现是那一路的地址线焊错位了。5.2 上位机脚本和总线工具带来的调试效率提升到了软件层面逻辑分析仪配合上位机分析脚本可以把“人工查波形”变成“自动跑脚本”。比如用 Python 的 pylibiio 或者 pandas 解析导出的 CSV 波形数据自动统计 ACK 错误率再用 matplotlib 画出 SCL 频率分布图。这在大批量验证产线板卡或者长时稳定性测试时很有用。如果手上既没有高端示波器也没有逻辑分析仪还有一类纯软件工具可以帮忙用 MCU 自身实现一个“I2C 总线嗅探器”把总线上所有数据抓下来通过串口打印。这个方案在排查“设备偶发不响应”时非常有效因为你可以把 MCU 挂在总线上长时间监听而不用像示波器那样守在现场。我之前用过 STM32 的 I2C 从机模式配合 DMA 实现过这类抓包工具成本低效果却出奇的好。5.3 PMBus 和 I2C 的异同以及什么时候该怀疑协议栈和 I2C 高度相关的还有 PMBus电源管理总线上很常见。PMBus 基于 I2C 物理层但加了更多命令层协议。排查 PMBus 问题时物理层的排查方法完全一样上拉、时序、ACK。但 PMBus 多了命令响应超时、分组错误检查等机制出现通信异常时除了查物理信号还要查协议层的命令格式是否正确。有一个容易忽略的场景如果 I2C 总线上的设备同时使用了 PMBus 协议主设备对某个命令没收到预期响应从设备会主动拉低 SDA 并保持直到主设备处理错误状态。这时候示波器上看到的现象是总线 SDA 被拉死低电平很多人会以为是物理短路或者从机死机其实是 PMBus 的 SMBus 超时机制在起作用。区分方法是量一下 SCL如果 SCL 还在持续跳说明从机还活着是协议层的问题如果两根线都静默那才需要怀疑硬件。6. 一套可复用的 I2C 排查流程和速查手册6.1 从我实际经验总结出来的排查顺序每次遇到 I2C 问题我基本都按照下面这套顺序走一遍能在多数情况下快速收敛万用表确认 SCL/SDA 静态电压、上拉电阻阻值、供电电压排除低级硬件问题。示波器单通道抓 SDA 波形确认有没有通信发生、有没有起始/停止条件的基本形态。示波器双通道抓 SCL/SDA设置下降沿触发检查一帧完整波形的每一位时序。检查关键时序参数建立时间、保持时间、上升时间是否符合标准模式或快速模式的规格。重点看每个字节的第 9 个时钟周期确认 ACK/NACK 是否正确。如果 ACK 异常回到硬件层从机供电、地址引脚、上拉电阻、总线仲裁。如果波形正常、ACK 也正常但通信仍然失败上逻辑分析仪抓长时波形查协议层逻辑错误。这套流程的优点是从简单工具到复杂工具递进不会一上来就搬出昂贵设备排查思路也始终围绕“先物理层、再时序层、再协议层”展开。在产线或者现场排查时这个顺序能帮你快速缩小范围避免在错误方向上浪费大量时间。6.2 常用参数速查列表参数标准模式 100kHz快速模式 400kHz排查时怎么确认SCL 高电平最小时间4.0us0.6us示波器测量 SCL 高电平宽度SCL 低电平最小时间4.7us1.3us示波器测量 SCL 低电平宽度SDA 建立时间最小250ns100ns示波器测量 SDA/SCL 交叉沿间隔SDA 保持时间最小0ns0ns确认 SDA 在 SCL 下降沿后维持SCL/SCL 上升时间最大1000ns300ns示波器测量 10%~90% 边沿时间上拉电阻推荐范围1k~10k1k~4.7k结合总线电容和 VCC 计算选择快速模式下如果 SCL 上升时间超过 300ns就很容易出现不稳定问题。这时候优先检查上拉电阻阻值和 PCB 走线电容不要急着改软件时序大概率是硬件参数不匹配。6.3 常见问题速查现象-原因-对策现象可能原因优先排查动作SDA 一直为低SDA 被某个设备拉死、短路断开各设备 SDA 逐个排除SCL 无时钟输出MCU 配置错误、引脚复用错用万用表/示波器量 MCU 引脚输出波形边沿呈现斜坡上拉电阻过大、总线电容过大减小上拉电阻检查走线长度起始条件后无响应从机没有上电、地址错误测供电、查地址引脚配置地址后 ACK 正常但数据 NACK从机命令不支持、数据格式错误查从机规格书命令格式偶发 NACK、无规律总线仲裁冲突、干扰逻辑分析仪抓长时波形定位冲突点带 EEPROM 写入后 NACK正在内部写入周期软件增加写入轮询等待机制通信速率提高后不稳定时序参数超规格示波器测边沿时间调整上拉电阻关于 EEPROM 的那种情况多说一句很多 EEPROM 在写入一个页之后需要几毫秒到几十毫秒来完成内部编程这个过程总线上不会回 ACK。写入前先查一下规格书里的写周期时间写入流程里加上“检测到 NACK 就延时重试”的逻辑省得你在 NACK 上纠结半天最后发现是器件正常工作状态。6.4 最后分享两个小技巧第一个技巧排查 I2C 时准备一个带鳄鱼夹的杜邦线把参考地夹在离测量点最近的 GND 焊盘上。示波器探头的地线夹如果距离太远会引入不少噪声波形边沿看起来会比实际“脏”容易误判。这是我从一次测 400kHz 快速模式波形时踩坑学到的地线缩短之后波形瞬间干净不少。第二个技巧如果怀疑总线上存在毛刺干扰把示波器触发模式改为“脉宽触发”设定触发条件为“小于 50ns 的窄脉冲”。这样就能把偶发毛刺单独抓出来看看它出现在什么位置——如果在 ACK 阶段出现毛刺十有八九是干扰导致从机采样错误这时要检查布局和屏蔽而不是继续调上拉电阻。I2C 排查本身并不复杂难的是在现象和原因之间找到那条可靠的线索链。从万用表的静态电平到示波器的动态时序再到 ACK 的逐位确认每一层工具都在回答不同的问题。希望这套流程能让你在面对 I2C 故障时少走一些我当年走过的弯路。如果你也有过类似的排查经历欢迎试试文中这组方法尤其是把 ACK 阶段的原始波形和协议解码结果逐一对照相信你会有不少新发现。
返回列表