第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 探头连接方法
探头接不好,数据全白搞。这话一点都不夸张。
基本连接规则
- 共地必须接:逻辑分析仪的GND要连到板子的GND。不接的话,信号全是乱的。
- 通道对应好:SCL接通道0,SDA接通道1。我习惯这样接,解码时方便。
- 线越短越好:长线会引入噪声,尤其是高频信号。
实际连接步骤
我一般这么操作:
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条件。解决方案是:
- 加一个延迟触发,等总线稳定后再开始
- 或者用地址触发,只抓特定设备的通信
重要提醒:触发条件别设得太严格。比如用地址触发时,如果地址设错了,你永远抓不到数据。我建议先用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调试高手。