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在传输过程中抖动了一下。这会导致从机复位,传输中断。
注意:SPI的极性和相位(CPOL/CPHA)必须主从一致。我曾经调了一个下午,发现是CPHA设反了。波形上看,数据采样沿正好错开半个周期。

4.3.2 I2C总线

I2C只有两根线:SCL(时钟)和SDA(数据)。它靠时序协议来区分地址、数据和应答。

正常波形特征:

  • 起始条件:SCL高时,SDA从高变低。
  • 停止条件:SCL高时,SDA从低变高。
  • 每个字节后跟一个应答位(ACK),从机拉低SDA表示应答。

常见异常:

  • 无应答(NACK):从机没拉低SDA。原因可能是地址不对、从机没上电、或者总线被拉死了。
  • SDA被一直拉低:这叫“总线锁死”。通常是某个从机没释放总线,或者主设备在传输过程中异常复位了。解决办法:给SCL发9个时钟脉冲,让从机释放总线。
  • 时钟拉伸:从机把SCL拉低,告诉主机“我还没准备好”。如果主机没处理这个情况,就会超时。
避坑指南:我曾经遇到一个I2C设备,上电后需要100ms才能响应。主机在初始化时立即发地址,结果一直NACK。后来在发送前加了延时,问题解决。所以,看波形时别忘了检查时序间隔。

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 总结:用好逻辑分析仪的三个习惯

  1. 先看波形,再查代码:硬件问题比软件问题更容易定位。波形对了,再怀疑代码。
  2. 保存正常波形做参考:我每次调通一个通信接口,都会保存一份正常波形截图。下次出问题,直接对比,差异一目了然。
  3. 别迷信自动解码:自动解码很方便,但有时候解码器配置错了,会给你错误的结果。我建议先肉眼看一下原始波形,确认时钟和数据线的逻辑关系对不对,再去看解码结果。

嗯,逻辑分析仪这东西,用熟了就是你的第三只眼。下次烧录失败,别急着砸电脑,先上逻辑分析仪看一眼。