SPI协议抓取:模式配置与信号识别

SPI协议,说实话,是嵌入式里最常用的串行接口之一。速度快、接线少,但坑也多。我刚开始用逻辑分析仪抓SPI时,经常抓了一堆波形,却看不懂哪个是哪个。今天咱们就把SPI的四种模式、四根信号线,以及怎么解析数据帧,一次性说清楚。

核心要点:SPI的四种模式由时钟极性(CPOL)和时钟相位(CPHA)决定。搞懂这两个参数,你就能看懂任何SPI设备的波形。

SPI的四种模式(0/1/2/3)

SPI模式,说白了就是主设备和从设备之间约定好的“暗号”。这个暗号由两个参数决定:

  • CPOL(Clock Polarity):空闲时时钟线的电平。0=低电平,1=高电平。
  • CPHA(Clock Phase):数据在时钟的哪个边沿采样。0=第一个边沿,1=第二个边沿。

组合起来就是四种模式。我整理了一张表,你直接对照着看:

模式 CPOL CPHA 空闲时钟电平 数据采样边沿
模式0 0 0 低电平 第一个边沿(上升沿)
模式1 0 1 低电平 第二个边沿(下降沿)
模式2 1 0 高电平 第一个边沿(下降沿)
模式3 1 1 高电平 第二个边沿(上升沿)

我的经验:大部分SPI Flash和SD卡都用模式0或模式3。如果你不确定设备用哪种模式,先看数据手册里的时序图,找到空闲时钟电平,再找数据采样边沿,对照上表就能确定。

四根信号线的识别

SPI有四根线:SCLK、MOSI、MISO、CS。用逻辑分析仪抓波形时,你得先认出它们。我教你一个快速识别的方法:

  1. SCLK(时钟):波形最规律,像心跳一样稳定。频率固定,一看就知道。
  2. CS(片选):平时是高电平,通信时拉低。每次通信开始和结束,CS都会跳变。
  3. MOSI(主出从入):数据在时钟边沿变化。主设备发数据时,这根线才有信号。
  4. MISO(主入从出):从设备回复数据时才有信号。如果从设备没回复,这根线一直高阻或固定电平。

嗯,这里要注意:有些逻辑分析仪会自动解析SPI协议,但我不建议完全依赖它。我曾经遇到过分析仪把MOSI和MISO标反了,结果我查了半天bug,最后发现是通道接反了。

避坑指南:我曾经在调试一个温湿度传感器时,逻辑分析仪显示数据全是0xFF。折腾了两小时,才发现MISO和MOSI接反了。记住:MOSI是主设备发数据,MISO是从设备发数据。接反了,数据流就反了。

数据帧解析实战

抓到了波形,怎么解析数据帧?我拿一个实际例子来说。假设你抓到了SPI模式0的波形,CS拉低后,SCLK开始输出时钟,MOSI上出现数据。数据帧的结构通常是:

  • 命令字节:主设备先发一个字节,告诉从设备要做什么(读、写、擦除等)。
  • 地址字节:如果是读写操作,后面跟着地址(可能是1-4字节)。
  • 数据字节:读写的数据内容。
  • CS拉高:通信结束。

用逻辑分析仪解析时,你只需要做三件事:

  1. 找到CS下降沿,这是通信开始。
  2. 在SCLK的采样边沿读取MOSI和MISO的电平。
  3. 把电平组合成字节,对照数据手册解读。

举个例子,假设你抓到了以下波形(模式0,CPOL=0,CPHA=0,上升沿采样):

SCLK:  __|‾‾|__|‾‾|__|‾‾|__|‾‾|__|‾‾|__|‾‾|__|‾‾|__|‾‾|__
MOSI:  ___|‾‾‾‾‾‾‾|___|‾‾‾‾‾|___|‾‾‾‾‾‾‾|___|‾‾‾‾‾|___
        bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
        1    0    1    0    1    0    1    0

在上升沿采样,MOSI的电平依次是:1,0,1,0,1,0,1,0。组合成字节就是0xAA。如果这是命令字节,查数据手册,0xAA可能是“读状态寄存器”命令。

实战技巧:我习惯在逻辑分析仪软件里设置触发条件为CS下降沿,这样每次通信开始都会自动捕获。然后设置采样率为SCLK频率的4倍以上,确保每个时钟边沿都能采到至少2个点,避免漏采。

SPI协议抓取流程图

下面这张图总结了SPI协议抓取和解析的完整流程,从连接探头到解读数据,一步到位:

SPI协议抓取与解析流程图 1. 连接逻辑分析仪探头 2. 识别SCLK/CS/MOSI/MISO 3. 配置采样率与触发条件 4. 抓取SPI通信波形 5. 解析命令/地址/数据字节 关键提示 采样率 ≥ 4倍SCLK频率 触发条件:CS下降沿 先确认CPOL/CPHA 常见问题 MOSI/MISO接反 模式配置错误 CS未正确拉低

实战中的常见问题

抓SPI波形时,你可能会遇到这些问题。我列出来,你对照排查:

现象 可能原因 解决方法
CS一直高电平 主设备没发起通信 检查主设备代码,确认CS引脚配置
SCLK没有波形 时钟没输出 检查时钟配置,确认SPI外设已使能
MOSI全是0或1 数据线没驱动 检查MOSI引脚是否配置为推挽输出
MISO全是0xFF 从设备没回复或MISO接错 检查从设备供电和MISO连接
数据错位 模式配置错误 确认CPOL和CPHA是否匹配

我的习惯:每次调试SPI设备,我都会先用逻辑分析仪抓一次空通信(只发一个读命令),确认波形正常后再写完整驱动。这样能快速定位是硬件问题还是软件问题。

好了,SPI协议抓取的核心内容就这些。记住:先认信号线,再配模式,最后解析数据帧。按这个顺序来,SPI调试就不会乱。