逻辑分析仪使用手册:抓包与协议分析实战
逻辑分析仪使用手册:抓包与协议分析实战
干了嵌入式这行的人,迟早会遇到这类场景:I²C 设备死活读取不到数据,SPI 传感器的寄存器明明写了却读回 0xFF,又或者 UART 波特率配了 115200 还是满屏乱码。这时候示波器往往不够用——它能告诉你波形电平对不对,却很难帮你把一位一位的协议报文梳理清楚。真正顺手的是另一件东西:逻辑分析仪。
本文不讲参数堆砌,而是从实操出发,讲讲怎么用逻辑分析仪把一段”看不见摸不着”的通信数据抓下来、解出来、定位到问题。文中的例子都以嵌入式开发里最常见的场景为主。
一、示波器和逻辑分析仪,到底差在哪
示波器看的是模拟世界的细节:边沿陡不陡、有没有过冲、噪声大不大。这类问题是它擅长的。但一旦数据流到了一定长度,比如一句 Modbus 请求、一帧完整的 SPI 读写,示波器那点有限的存储深度和人工逐位译码的方式,效率就下来了。
逻辑分析仪反过来了:它只关心 0 和 1。输入超过阈值记 1,低于记 0,然后把一段长长的数字序列存下来,按协议套上去解码。所以它的强项是:
- 通道多:主流入门款 8 路、16 路,几十块就能买到,同时抓一路总线加几条控制线不在话下。
- 深度大:即便几十块钱的克隆版,抓上百 KB、上 MB 的样本也很常见,足够覆盖长帧。
- 自动译码:I²C、SPI、UART、1-Wire、CAN、甚至红外 NEC 都能自动解析成人类可读的报文,不用你一位位去数。
两者不是替代关系,是互补。逻辑问题优先抓逻辑分析仪,波形质量问题再搬示波器。
二、一个典型的抓包流程
不管什么牌子的逻辑分析仪,实际使用的大致套路都差不多,这里以最常见的场景——调试一块 I²C EEPROM——举例。
第一步:接线。 把通道接到数据线上,同时把 GND 接上。这一步最容易忽视:很多人只接信号线没共地,抓到的波形会充满毛刺,时准时不准。逻辑分析仪的 GND 一定要和设备的地连在一起。
第二步:设采样率与深度。 逻辑分析仪的采样率通常是目标信号频率的 5~10 倍以上才比较稳。比如 100 kHz 的 I²C,采样率设 1 MHz 就够;但如果你要抓一个 10 MHz 的 SPI,采样率至少得 50 MHz 往上,否则边沿会糊,误码率上去。
第三步:设触发。 这是逻辑分析仪最有价值的功能之一。你可以设”SCL 出现下降沿时开始抓”,也可以设”在指定数据字节出现后停止”。触发设得好,能让你在一片连续数据里精确截取想看的帧;设不好,抓回来的全是没用的空闲电平。
第四步:抓取并译码。 抓到波形后,选对应协议插件,给它指定哪个通道是 SCL、哪个是 SDA,软件就会自动把时序翻译成一条条 读/写 操作。
三、实战:I²C 读写 EEPROM
假设你用 STM32 读写一块 AT24C02,读回来的数据总是不对。先把逻辑分析仪接到 SDA、SCL 两根线上,采集 I²C 报文。抓到的典型波形经过译码,会变成这样一串事务:
Start | 0xA0 | Ack | 0x00 | Ack | 0x10 | Ack | Stop ← 写入地址 0x00,数据 0x10
Start | 0xA1 | Ack | 0x10 | Nack | Stop ← 读回,数据 0x10
拆开看每个字节,就能发现问题到底出在哪个环节。比如这段报文的含义是:
0xA0:设备地址(7 位地址 0x50 左移一位,写方向)。0x00:要读的寄存器/存储单元地址。0x10:数据。
如果译码显示芯片回了 Nack 而不是 Ack,说明设备地址不对,或者芯片没上电、上拉电阻没接好。如果地址正确但数据不对,那就要检查你发的数据字节顺序。
一个常见坑是 I²C 地址的 7 位/ 8 位写法。0x50 是 7 位地址,实际在总线上的首字节是 0x50 << 1 | 读写位,也就是 0xA0 或 0xA1。很多新手在库函数里填了 0x50,结果软件把 0x50 当 8 位地址左移后变成了 0xA0——碰巧对了;但如果有人直接填 0xA0,某些库会再左移一次变成 0x140,怎么都通信不上。用逻辑分析仪抓一下首字节,一眼就能定位是地址搞错了。
四、实战:SPI 读传感器
SPI 的问题往往更隐蔽,因为它同时牵扯四根线:SCK、MOSI、MISO、CS(或 NSS)。逻辑分析仪可以四路同时抓,然后帮你把主从两个方向的数据分开显示。
比如读一颗 ADC,配置寄存器的写入命令是这样的:
CS 拉低
MOSI: 0x01 0x00 ← 写命令 + 寄存器地址
MISO: 0x00 0x00 ← 从机返回垃圾值(还没准备好)
CS 拉高
接着读数据:
CS 拉低
MOSI: 0x81 0x00 ← 读命令(最高位 1)+ 寄存器地址
MISO: 0x00 0x3C ← 从机返回真实数据
CS 拉高
用逻辑分析仪抓下来的关键点在于 MOSI 和 MISO 的时序对齐。SPI 是主从同时双向传输的,主时钟 SCK 每跳一次,两边各移一位。如果你的软件读回来的数据整体左移或右移了一位,很可能是采样时机不对——在 SCK 的哪个边沿采样、数据是否建立足够时间,这些在波形上一清二楚。
一个特别值得注意的坑是 CPOL/CPHA 配置。STM32 的 SPI 有个极性(CPOL)和相位(CPHA)组合,配置成模式 0、1、2、3。配错了的表现通常是”数据读出来全是偶数或者高二位对、低两位错”,或者干脆全错。逻辑分析仪抓一段波形,看 SCK 的空闲电平和数据在哪个边沿变化,对着芯片手册的表一查,就知道该用哪个模式。
五、实战:UART 抓乱码
UART 是逻辑分析仪最友好的调试对象。乱码问题的排查套路很固定:
- 先确认波特率。 逻辑分析仪很多软件带自动测波特率功能,抓一段串口波形,量出最窄脉冲的宽度,就能反推出波特率。如果你主设备发的是 9600,而接收端配成 115200,那乱码是必然的。
- 看数据位、停止位、校验位。 一个字节是 8 位还是 9 位?停止位是 1 位还是 2 位?有没有奇偶校验?这些在译码器里都能设置,设对之后乱码基本就变成了正常文本。
- 看电平是否反相。 有些信号是反相输出的,逻辑分析仪源码里直接
~一下就能看清。
一个真实案例:板子串口输出全部是”乱码但结构规律”。用逻辑分析仪抓下来一看,波形本身是干净的,波特率算出来也对,但译码怎么都对不上。最后发现是数据位配成了 9 位而发端是 8 位,导致每个字节多读了一位,全部错位。这种问题,不用逻辑分析仪几乎没有其他直观的定位手段。
六、协议分析之外的技巧
逻辑分析仪的价值不止于串行协议解码。几个容易被忽略但很实用的玩法:
1. 抓多路并行总线
老一点的设备还保留着 8 位并行总线(比如 8080 并口屏、并口 Flash)。逻辑分析仪可以同时抓 8 位数据线加读、写、片选信号,直接还原出一次并口传输。这时它也扮演着”并行总线解码器”的角色。
2. 时序测量
逻辑分析仪的游标(cursor)功能可以量任意两个事件之间的时间。比如测量”片选拉低到第一个时钟沿”的建立时间,判断器件时序是否满足要求。对于没有示波器精度预算、只关心数字时序的场景,这已经够用。
3. 长期监测偶发故障
有些 bug 是偶发的,几天才出现一次。逻辑分析仪支持”触发后停止”模式,可以一直挂在那里,直到特定条件出现才停下,帮你抓到那个转瞬即逝的异常帧。这对排查”设备运行一段时间后通信挂掉”这类问题尤其有效。
七、怎么选一台合适的逻辑分析仪
预算和需求决定选择,不盲目追求参数。几个参考维度:
- 入门 / 学习:几十块的 8 通道 USB 逻辑分析仪(配合 sigrok / PulseView 等开源软件)就够用,采样率 24 MHz 上下,抓 I²C、UART、低速 SPI 没有压力。
- 中端 / 日常工作:16 通道、采样率 100~500 MHz,带电平可调、协议插件齐全,能抓更高速度的 SPI、CAN,以及更多路并行信号。
- 高端 / 高速总线:如抓 DDR、USB、以太网这类高速总线,才需要考虑专业品牌(如 Saleae、DSLogic、Keysight 等),采样率在 1 GHz 级别起跳。
对绝大多数嵌入式工程师来说,一块百元级 16 通道分析仪 + PulseView 开源软件,已经能覆盖日常 95% 的串行协议调试需求。软件建议优先选开源的 PulseView,协议解码器丰富,社区活跃,跨平台,还免费。
八、写在最后
逻辑分析仪是嵌入式工程师工具箱里”看起来简单、用起来极深”的一件装备。它不解决模拟信号质量的问题,但能把数字世界的通信过程完整、可读地摊开在你面前。很多让人抓狂的”通信不上”,其实就藏在某个地址位、某个字节序、某个采样沿里,抓一段波形,答案往往自动浮出水面。
如果你还没认真用过逻辑分析仪,建议从手头的 I²C 或 UART 设备开始:接好线,设好触发,抓一段报文,对着协议逐字节读一遍。这个”看见数据流动”的过程,比任何文档都更能帮你建立对通信协议的手感。
建议动手实践:找一块带 I²C EEPROM 或串口输出的开发板,用 PulseView 抓一段真实的 I²C / UART 通信,手动把报文和你代码里发的数据对齐。当你第一次在波形上”读”出自己发出的每一个字节时,协议分析对你来说就不再是抽象概念了。