4、逻辑分析仪入门:用逻辑分析仪抓取 SPI / I2C / UART 总线波形,定位时序异常
烧录失败,十有八九是通信时序出了问题。
你固件写得再漂亮,配置再完美,只要物理层时序不对,烧录器就是不理你。这时候,逻辑分析仪就是你的“照妖镜”。
我个人习惯,遇到烧录失败,第一件事不是翻代码,而是先上逻辑分析仪。看一眼波形,问题在哪基本就清楚了。
4.1 逻辑分析仪 vs 示波器:什么时候用它?
很多工程师会问:我有示波器,为什么还要买逻辑分析仪?
说白了,两者分工不同。示波器看模拟信号,比如电压纹波、上升沿过冲。逻辑分析仪只看高低电平,也就是0和1。但它通道多,一次能抓十几路信号,还能帮你把二进制数据解码成十六进制或ASCII。
| 对比项 | 逻辑分析仪 | 示波器 |
|---|---|---|
| 信号类型 | 数字信号(0/1) | 模拟信号(电压波形) |
| 通道数 | 8~32通道常见 | 2~4通道常见 |
| 采样深度 | 深(几M~几十M样本) | 浅(几K~几M样本) |
| 协议解码 | 内置SPI/I2C/UART解码器 | 需手动测量或选配 |
| 适用场景 | 抓取长时间通信数据 | 观察信号质量、毛刺 |
我在项目中遇到过一种情况:示波器看波形很漂亮,但烧录就是失败。后来用逻辑分析仪一抓,发现I2C的SCL时钟线上多了一个毛刺,导致从机误判了起始条件。示波器触发不到这种偶发毛刺,但逻辑分析仪靠深度采样抓到了。
4.2 硬件连接与采样参数设置
逻辑分析仪的使用,其实没那么玄乎。你只需要记住几个关键点。
4.2.1 接线原则
- 共地:逻辑分析仪的GND必须和目标板的地连在一起。不共地,波形就是一团乱码。
- 通道对应:比如抓SPI,把CLK接通道0,MOSI接通道1,MISO接通道2,CS接通道3。我习惯把时钟线固定接通道0,这样看波形时一眼就能找到时钟。
- 探头不要反插:逻辑分析仪的探头一般是排线,有防呆设计。但有些便宜的没有,插反了信号就反了。
4.2.2 采样率与触发设置
采样率怎么设?有个简单公式:采样率 ≥ 4倍信号频率。
比如SPI时钟是10MHz,那采样率至少设40MHz。设低了,波形会失真,解码也会出错。
触发设置也很关键。我一般这样设:
- SPI:触发在CS下降沿,因为CS拉低表示一次传输开始。
- I2C:触发在起始条件(SCL高电平时SDA下降沿)。
- UART:触发在起始位(RX线从高到低的跳变)。
4.3 三大总线波形解读与异常定位
下面我分别说说SPI、I2C、UART的波形怎么看,以及常见的异常长什么样。
4.3.1 SPI总线
SPI是同步串行总线,有单独的时钟线。波形看起来最规整。
正常波形特征:
- CS拉低后,时钟开始输出。
- 每个时钟沿对应一位数据。
- 传输结束后CS拉高。
常见异常:
- 时钟缺失:主设备没输出足够的时钟周期。比如你要发8位,结果只发了6个时钟。这通常是SPI配置的字节长度不对。
- 数据线无变化:MOSI或MISO一直保持高或低。可能是GPIO没配置成复用功能,或者引脚被其他外设占用了。
- CS毛刺:CS在传输过程中抖动了一下。这会导致从机复位,传输中断。
4.3.2 I2C总线
I2C只有两根线:SCL(时钟)和SDA(数据)。它靠时序协议来区分地址、数据和应答。
正常波形特征:
- 起始条件:SCL高时,SDA从高变低。
- 停止条件:SCL高时,SDA从低变高。
- 每个字节后跟一个应答位(ACK),从机拉低SDA表示应答。
常见异常:
- 无应答(NACK):从机没拉低SDA。原因可能是地址不对、从机没上电、或者总线被拉死了。
- SDA被一直拉低:这叫“总线锁死”。通常是某个从机没释放总线,或者主设备在传输过程中异常复位了。解决办法:给SCL发9个时钟脉冲,让从机释放总线。
- 时钟拉伸:从机把SCL拉低,告诉主机“我还没准备好”。如果主机没处理这个情况,就会超时。
4.3.3 UART总线
UART是异步通信,没有时钟线。它靠波特率来同步。
正常波形特征:
- 空闲时,TX/RX线为高电平。
- 起始位:一个低电平脉冲。
- 数据位:5~8位,LSB在前。
- 停止位:高电平,1位或2位。
常见异常:
- 波特率不匹配:波形看起来数据位宽度不对。比如9600波特率,每位约104μs。如果实际宽度偏差超过5%,就会丢数据。
- 起始位丢失:RX线上一直高,没有低脉冲。可能是TX和RX接反了,或者对方没发数据。
- 数据位错位:波形看起来像乱码。通常是数据位长度、校验位或停止位配置不一致。
4.4 实战:用逻辑分析仪抓取一次SPI烧录失败
我拿一个真实案例来说吧。
某次烧录,烧录器报“通信超时”。我接上逻辑分析仪,采样率设50MHz,触发在CS下降沿。抓到的波形如下:
通道0 (CLK): ██░░██░░██░░██░░██░░██░░
通道1 (MOSI): ░███░█░██░█░░███░█░██░█
通道2 (MISO): ░░░░░░░░░░░░░░░░░░░░░░░░
通道3 (CS): ░░░██████████████████░░░
一眼就看出来了:MISO线全程低电平,没有数据返回。这说明从机(目标芯片)根本没应答。
检查硬件发现,从机的供电引脚虚焊了。补焊后,波形恢复正常:
通道0 (CLK): ██░░██░░██░░██░░██░░██░░
通道1 (MOSI): ░███░█░██░█░░███░█░██░█
通道2 (MISO): ░█░░███░█░██░█░░███░█░█
通道3 (CS): ░░░██████████████████░░░
你看,MISO有数据了,烧录一次通过。
4.5 知识体系:逻辑分析仪调试流程
下面这张图,是我自己总结的逻辑分析仪调试流程。每次遇到烧录失败,我就按这个步骤走,基本都能定位问题。
4.6 总结:用好逻辑分析仪的三个习惯
- 先看波形,再查代码:硬件问题比软件问题更容易定位。波形对了,再怀疑代码。
- 保存正常波形做参考:我每次调通一个通信接口,都会保存一份正常波形截图。下次出问题,直接对比,差异一目了然。
- 别迷信自动解码:自动解码很方便,但有时候解码器配置错了,会给你错误的结果。我建议先肉眼看一下原始波形,确认时钟和数据线的逻辑关系对不对,再去看解码结果。
嗯,逻辑分析仪这东西,用熟了就是你的第三只眼。下次烧录失败,别急着砸电脑,先上逻辑分析仪看一眼。