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。用逻辑分析仪抓波形时,你得先认出它们。我教你一个快速识别的方法:
- SCLK(时钟):波形最规律,像心跳一样稳定。频率固定,一看就知道。
- CS(片选):平时是高电平,通信时拉低。每次通信开始和结束,CS都会跳变。
- MOSI(主出从入):数据在时钟边沿变化。主设备发数据时,这根线才有信号。
- MISO(主入从出):从设备回复数据时才有信号。如果从设备没回复,这根线一直高阻或固定电平。
嗯,这里要注意:有些逻辑分析仪会自动解析SPI协议,但我不建议完全依赖它。我曾经遇到过分析仪把MOSI和MISO标反了,结果我查了半天bug,最后发现是通道接反了。
避坑指南:我曾经在调试一个温湿度传感器时,逻辑分析仪显示数据全是0xFF。折腾了两小时,才发现MISO和MOSI接反了。记住:MOSI是主设备发数据,MISO是从设备发数据。接反了,数据流就反了。
数据帧解析实战
抓到了波形,怎么解析数据帧?我拿一个实际例子来说。假设你抓到了SPI模式0的波形,CS拉低后,SCLK开始输出时钟,MOSI上出现数据。数据帧的结构通常是:
- 命令字节:主设备先发一个字节,告诉从设备要做什么(读、写、擦除等)。
- 地址字节:如果是读写操作,后面跟着地址(可能是1-4字节)。
- 数据字节:读写的数据内容。
- CS拉高:通信结束。
用逻辑分析仪解析时,你只需要做三件事:
- 找到CS下降沿,这是通信开始。
- 在SCLK的采样边沿读取MOSI和MISO的电平。
- 把电平组合成字节,对照数据手册解读。
举个例子,假设你抓到了以下波形(模式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波形时,你可能会遇到这些问题。我列出来,你对照排查:
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| CS一直高电平 | 主设备没发起通信 | 检查主设备代码,确认CS引脚配置 |
| SCLK没有波形 | 时钟没输出 | 检查时钟配置,确认SPI外设已使能 |
| MOSI全是0或1 | 数据线没驱动 | 检查MOSI引脚是否配置为推挽输出 |
| MISO全是0xFF | 从设备没回复或MISO接错 | 检查从设备供电和MISO连接 |
| 数据错位 | 模式配置错误 | 确认CPOL和CPHA是否匹配 |
我的习惯:每次调试SPI设备,我都会先用逻辑分析仪抓一次空通信(只发一个读命令),确认波形正常后再写完整驱动。这样能快速定位是硬件问题还是软件问题。
好了,SPI协议抓取的核心内容就这些。记住:先认信号线,再配模式,最后解析数据帧。按这个顺序来,SPI调试就不会乱。