第3章:逻辑分析仪入门

说实话,我刚入行那会儿,对逻辑分析仪又爱又怕。爱的是它能同时看几十个信号,怕的是设置太复杂,一不小心就抓了一堆没用的数据。今天我就把这些年用逻辑分析仪抓I2C Bug的经验,掰开了揉碎了讲给你听。

3.1 逻辑分析仪的工作原理

逻辑分析仪这东西,说白了就是个「数字信号录像机」。它不像示波器那样看模拟波形,它只关心一件事:信号是高电平还是低电平。

我打个比方你就明白了。示波器像高清相机,能拍出信号的每个细节。逻辑分析仪像监控摄像头,只记录「有人经过」还是「没人经过」。对于I2C这种数字协议,逻辑分析仪反而更实用。

它的工作流程是这样的:

  • 采样:以固定频率读取引脚电平
  • 存储:把采样结果存到内存里
  • 触发:遇到特定条件才开始存或停止存
  • 解码:把高低电平翻译成I2C的地址、数据、ACK

核心要点:逻辑分析仪只认「0」和「1」,不关心电压具体是多少。所以探头接反了它也不知道,只会显示反相的数据。

3.2 采样率与存储深度

这两个参数,是逻辑分析仪最关键的指标。我见过太多人在这上面栽跟头。

采样率

采样率就是每秒采多少次,单位是MHz。比如100MHz的采样率,意味着每10ns采一次。

那采样率设多少合适?我有个经验公式:

采样率 ≥ I2C时钟频率 × 10

举个例子:

  • 标准模式100kHz → 至少1MHz采样率
  • 快速模式400kHz → 至少4MHz采样率
  • 高速模式3.4MHz → 至少34MHz采样率

为什么是10倍?因为要看清每个时钟周期内的细节。我曾经用8倍采样率抓一个400kHz的I2C,结果ACK位老是显示不对。后来换成10倍,问题就解决了。嗯,这就是血的教训。

我的习惯:采样率设成I2C时钟的20倍。虽然多占点存储空间,但波形看起来舒服,分析起来也省心。

存储深度

存储深度就是能存多少个采样点,单位是Mpts(百万采样点)。它决定了你能抓多长时间的波形。

计算公式很简单:

可抓时长 = 存储深度 ÷ 采样率

比如你的逻辑分析仪有10Mpts存储深度,采样率设20MHz:

可抓时长 = 10,000,000 ÷ 20,000,000 = 0.5秒

才半秒?对,这就是为什么抓I2C通信时,要合理设置触发条件。不然你抓到的全是没用的空闲电平。

场景 推荐采样率 推荐存储深度 可抓时长
调试I2C初始化 10MHz 1Mpts 100ms
分析I2C通信异常 20MHz 10Mpts 500ms
抓取I2C批量传输 5MHz 100Mpts 20秒

注意:别把采样率设得太高。我见过有人用200MHz采样率抓100kHz的I2C,结果存储深度全浪费在空闲电平上,真正有用的数据只抓了一点点。

3.3 探头连接方法

探头接不好,数据全白搞。这话一点都不夸张。

基本连接规则

  1. 共地必须接:逻辑分析仪的GND要连到板子的GND。不接的话,信号全是乱的。
  2. 通道对应好:SCL接通道0,SDA接通道1。我习惯这样接,解码时方便。
  3. 线越短越好:长线会引入噪声,尤其是高频信号。

实际连接步骤

我一般这么操作:

1. 先断电
2. 把逻辑分析仪的GND夹子夹到板子GND
3. 通道0的探钩勾到SCL引脚
4. 通道1的探钩勾到SDA引脚
5. 检查连接是否牢固
6. 上电,开始抓取

小技巧:如果引脚间距太小,探钩容易短路。我习惯用杜邦线先焊到引脚上,再夹探钩。虽然麻烦点,但安全。

常见连接错误

  • GND没接:波形乱跳,根本没法看
  • 通道接反:SCL和SDA互换,解码全错
  • 接触不良:波形时有时无,以为是Bug,其实是探头松了

我曾经花了一整天查一个I2C通信失败的问题,最后发现是探钩没夹紧。从那以后,我每次抓波形前都会先用手轻轻拉一下探头,确认夹牢了再开始。

3.4 触发设置

触发设置是逻辑分析仪最强大的功能,也是最容易被忽视的。没有触发,你就是在大海捞针。

什么是触发

触发就是告诉逻辑分析仪:「当看到这个信号时,开始记录」。比如:

  • 检测到START条件时触发
  • 检测到特定设备地址时触发
  • 检测到数据错误时触发

常用触发方式

触发类型 适用场景 设置方法
边沿触发 检测SCL或SDA的跳变 选择上升沿或下降沿
码型触发 检测特定数据组合 设置SCL和SDA的电平组合
协议触发 检测I2C协议事件 选择START、STOP、ACK等
地址触发 检测特定从机地址 输入7位或10位地址

我的触发设置习惯

调试I2C时,我一般这么设:

场景1:抓整个通信过程
触发方式:START条件触发
触发位置:25%(抓触发前25%,触发后75%)

场景2:抓特定从机通信
触发方式:地址触发
触发地址:0x50(比如EEPROM的地址)
触发位置:50%(前后各一半)

场景3:抓异常情况
触发方式:NACK触发
触发位置:75%(多抓触发前的数据,便于分析原因)

关键点:触发位置决定了你能看到触发前多少数据。如果怀疑是初始化阶段的问题,就把触发位置设小一点(比如10%),多看看触发前的情况。

避坑指南

我曾经遇到过一个问题:用START触发抓I2C,结果每次抓到的数据都不一样。后来发现,是因为板子上电后I2C总线有毛刺,触发了START条件。解决方案是:

  1. 加一个延迟触发,等总线稳定后再开始
  2. 或者用地址触发,只抓特定设备的通信

重要提醒:触发条件别设得太严格。比如用地址触发时,如果地址设错了,你永远抓不到数据。我建议先用START触发确认通信正常,再逐步细化触发条件。

3.5 实战:第一次抓取I2C波形

说了这么多,我们来实际操作一次。假设你要抓一个EEPROM的读写过程:

步骤1:连接探头
  - GND → 板子GND
  - CH0 → SCL
  - CH1 → SDA

步骤2:设置采样率
  - EEPROM使用400kHz
  - 采样率设8MHz(20倍)

步骤3:设置触发
  - 触发方式:START条件
  - 触发位置:25%

步骤4:开始抓取
  - 点击「开始」按钮
  - 让MCU执行EEPROM读写操作

步骤5:查看结果
  - 检查是否抓到START条件
  - 查看地址、数据是否正确
  - 检查ACK位是否正常

如果抓不到波形,先检查:

  • 探头接好了吗?
  • GND接了吗?
  • 采样率够吗?
  • 触发条件对吗?

这四步排查下来,90%的问题都能解决。剩下的10%,嗯,那才是真正的Bug。

最后说一句:逻辑分析仪是个工具,用得好是神器,用不好是摆设。多练、多试、多总结,你也能成为I2C调试高手。