快速掌握SPI总线测试原理和测试方法
1. SPI通信概述
SPI(Serial Peripheral Interface,串行外设接口)是一种由摩托罗拉公司于20世纪80年代初提出的高速、全双工、同步串行通信总线。作为一种事实上的行业标准,SPI广泛应用于微控制器(MCU)与外部设备之间的短距离通信,特别适用于闪存、传感器、显示模块、模数转换器(ADC)等高速数据传输场景。
SPI采用主从架构,通过串行时钟线同步数据传输,支持双向同时发送和接收数据。与I2C等其他总线相比,SPI具有通信速率高、硬件实现简单、协议开销低等显著优势,但也存在占用引脚资源较多、仅支持单主设备等局限性。随着技术的发展,SPI协议不断演进,衍生出双线、四线及八线等扩展模式,以满足日益增长的高速数据传输需求。
1.1. SPI接口定义
4根信号线(包含SCLK,CS,MOSI,MISO),无地址、无起始位、无停止位、无校验,协议极简、速度快;
| 信号 | 全称 | 方向 | 作用 |
|---|---|---|---|
| SCLK | 串行时钟 | 主机→从机 | 主机输出时钟,同步所有数据采样 |
| MOSI | 主发从收 | 主机→从机 | 主机发数据给从机 |
| MISO | 从发主收 | 从机→主机 | 从机回传数据给主机 |
| CS/SS | 片选 | 主机→从机 | 低电平选中某一个从设备,高电平断开 |
1.2. SPI工作模式
模式0(CPOL=0,CPHA=0):
时钟极性(Clock Polarity)为0,表示时钟空闲状态为低电平。
时钟相位(Clock Phase)为0,表示数据在时钟信号的第一个边沿(时钟上升沿)进行采样和稳定。
2. 模式1(CPOL=0,CPHA=1):
时钟极性为0,时钟空闲状态为低电平。
时钟相位为1,数据在时钟信号的第二个边沿(时钟下降沿)进行采样和稳定。
3. 模式2(CPOL=1,CPHA=0):
时钟极性为1,时钟空闲状态为高电平。
时钟相位为0,数据在时钟信号的第一个边沿(时钟下降沿)进行采样和稳定。
4. 模式3(CPOL=1,CPHA=1):
时钟极性为1,时钟空闲状态为高电平。
时钟相位为1,数据在时钟信号的第二个边沿(时钟上升沿)进行采样和稳定。
| 模式 | CPOL | CPHA | 空闲电平 | 采样边沿 | 常用场景 |
|---|---|---|---|---|---|
| Mode0 | 0 | 0 | 低 | 上升沿 | Flash、传感器、最常用 |
| Mode1 | 0 | 1 | 低 | 下降沿 | LCD、部分 ADC |
| Mode2 | 1 | 0 | 高 | 下降沿 | 小众外设 |
| Mode3 | 1 | 1 | 高 | 上升沿 | EEPROM、射频芯片 |
1.3. SPI通信协议
SPI 是移位寄存器对接:主机一个移位寄存器 ↔ 从机一个移位寄存器每来一个 SCLK 时钟脉冲:
- 主机移出 1bit → MOSI 送入从机
- 从机移出 1bit → MISO 送入主机
一个时钟周期,同时收发 1bit,天然全双工。
- 数据传输的基本规则
- 数据传输以字节(8bit)为单位,高位在前(MSB-first)是行业通用约定。
- SCLK 的每一个时钟周期,会同时完成1bit MOSI 发送和1bit MISO 接收,实现全双工通信。
- 通信仅在CS 拉低(选中从设备)期间进行,CS 拉高后,从设备进入空闲状态。
2. 数据传输的完整流程
以主设备向从设备发送 1 字节数据、同时接收 1 字节数据为例:
- 片选从机:主设备拉低对应从设备的 CS 信号,从设备被唤醒并进入通信状态。
- 时钟启动:主设备开始输出 SCLK 时钟脉冲。
- 逐位传输:
- 主设备在 SCLK 的有效边沿,将 MOSI 上的 1bit 数据发送给从设备。
- 同时,从设备在同一时钟边沿,将 1bit 数据通过 MISO 发送给主设备。
- 字节完成:经过 8 个时钟周期,主从双方各完成 1 字节数据的发送与接收。
- 结束通信:主设备拉高 CS 信号,结束本次通信,从设备回到空闲状态。
1.4. SPI与其他常见串行总线对比
- SPI通信优势:
- 高速率:仅受主设备时钟限制,常见速率可达 10MHz~100MHz,远高于 I2C/UART。
- 全双工:MOSI/MISO 独立传输,同时收发数据,效率高。
- 协议简单:无复杂的地址帧、应答机制,主从设备交互逻辑简单,硬件实现成本低。
- 无仲裁 / ACK:无需总线仲裁,主设备完全控制通信节奏,适合短距离、板内通信。
2. SPI局限性:
- 无内置流控 / 校验:没有 ACK 应答,也无错误校验,通信可靠性依赖上层协议实现。
- 多从机扩展复杂:每个从设备需要一根独立的 CS 线,设备数量多时占用引脚多。
- 无标准统一规范:不同厂商设备的时序、模式、数据位宽可能存在差异,兼容性依赖双方配置匹配。
| 特性 | SPI | I2C | UART |
|---|---|---|---|
| 通信方式 | 同步 | 同步 | 异步 |
| 信号线 | 4 线(SCLK/MOSI/MISO/CS) | 2 线(SDA/SCL) | 2 线(TX/RX) |
| 速率 | 高(可达 100MHz+) | 中(常见 100kHz~400kHz,最高 5MHz+) | 中低(常见 9600~115200bps) |
| 拓扑 | 一主多从,独立 CS | 一主多从,地址寻址 | 点对点 |
| 全双工 | 支持 | 半双工 | 全双工 |
| 应用场景 | 板内高速外设通信(Flash、ADC、显示屏) | 低速外设(EEPROM、传感器) | 设备间通用异步通信 |
2. SPI测试方法
2.1. 示波器配置
- 示波器带宽常用选型:100MHz~200MHz以上(覆盖50MHz SPI最高速率测试);
- 示波器通道:4通道,同时测试SCLK、MOSI、MISO、CS,通过示波器自带协议分析解码;
- 探头:10:1,通道设置也设为10:1(避免电压读数错误);
- 地线:短弹簧地(减少振铃 / 过冲假信号);
- 通信功能与协议参数如下:
| 参数 | 含义 | 测量方法 | 合格标准 |
|---|---|---|---|
| 帧完整性 | 每帧传输是否完整 | 示波器 SPI 解码结果,查看是否有 “不完整帧” | 无异常帧,每帧数据字节数与预期一致 |
| 数据正确性 | MOSI 发送与 MISO 接收的应答是否匹配 | 对比解码数据与预期协议(如命令、地址、校验) | 应答数据符合设备协议定义 |
| 波特率稳定性 | 多帧通信的实际波特率偏差 | 统计多帧的传输时间,计算实际波特率 | 偏差≤±10%,无大幅波动 |
2.2. SPI测量参数
根据datasheet主要测量以下信号质量和信号时序等参数;
- 片选信号时序(CS)
| 参数 | 定义 | 测量方法 | 典型要求 |
|---|---|---|---|
| CS 建立时间 (t_SU-CS) | CS 拉低到第一个 SCLK 有效边沿的时间 | 光标测量 CS 下降沿 → 第一个 SCLK 边沿的时间差 | ≥ 从机手册最小值(如 100ns) |
| CS 保持时间 (t_HOLD-CS) | 最后一个 SCLK 边沿到 CS 拉高的时间 | 光标测量 最后一个 SCLK 边沿 → CS 上升沿的时间差 | ≥ 从机手册最小值 |
| CS 高电平宽度 | 两次通信之间 CS 保持高电平的时间 | 光标测量 CS 上升沿 → 下一次 CS 下降沿的时间差 | 需保证从机复位 / 就绪 |
2. 时钟信号时序(SCLK)
| 参数 | 定义 | 测量方法 | 典型要求 |
|---|---|---|---|
| 时钟周期 (T) | SCLK 相邻两个上升沿(或下降沿)的时间差 | 示波器周期自动测量,或光标测量 | 1µs(1MHz),误差≤±5% |
| 高 / 低电平宽度 | SCLK 一个周期内高 / 低电平的持续时间 | 光标测量 | 理论值为 T/2,偏差≤±10% |
| 上升 / 下降时间 (t_RISE/t_FALL) | 信号从 10% 到 90% 电平的跳变时间 | 示波器上升 / 下降时间自动测量 | 通常要求 ≤ 10%×T,避免过冲 / 振铃 |
3. 数据信号时序(MOSI/MISO)
| 参数 | 定义 | 测量方法 | 典型要求 |
|---|---|---|---|
| 数据建立时间 (t_SU-DATA) | 数据有效到 SCLK 采样边沿的时间 | 光标测量 MOSI/MISO 数据稳定点 → SCLK 采样边沿的时间差 | ≥ 从机手册最小值(如 50ns) |
| 数据保持时间 (t_HOLD-DATA) | SCLK 采样边沿到数据变化的时间 | 光标测量 SCLK 采样边沿 → MOSI/MISO 数据变化点的时间差 | ≥ 从机手册最小值 |
4. 电气信号完整性参数
| 参数 | 含义 | 测量方法 | 合格标准 |
|---|---|---|---|
| 高电平 (V_IH) | 信号逻辑高电平电压 | 示波器高电平自动测量 | ≥ 从机 V_IH (min),如 0.7×VDD |
| 低电平 (V_IL) | 信号逻辑低电平电压 | 示波器低电平自动测量 | ≤ 从机 V_IL (max),如 0.3×VDD |
| 幅度 | 信号峰峰值电压 | 示波器幅度自动测量 | 接近 VDD(如 3.3V),无明显衰减 |
| 过冲 / 下冲 | 信号跳变时超出 VDD 或低于 GND 的电压 | 光标测量跳变尖峰的峰值 | 过冲≤10%×VDD,无负向过冲(避免锁存损坏) |
| 噪声 / 纹波 | 信号电平上的高频波动 | 开启平均模式,测量电平的标准差 | 噪声峰峰值 ≤ 10%×VDD,不影响逻辑判决 |
3. SPI测试常见问题排查
3.1. 信号时序问题
| 常见问题 | 现象 | 根本原因 | 示波器排查 | 解决措施 |
|---|---|---|---|---|
| CPOL/CPHA 模式不匹配 | 波形都有,解码全乱码,通信完全不通 | 主从时钟极性、相位不一致 | 看 SCLK 空闲电平判断 CPOL;看采样边沿判断 CPHA | 统一主从 SPI 模式,示波器解码同步匹配 |
| 建立时间不足 | 偶尔丢字节、随机错码、高频率更严重 | 数据变化离时钟采样边沿太近,时序裕量不够 | 光标测:数据稳定到 SCLK 采样沿 tSU | 降 SPI 时钟、加大走线时序裕量、调整 IO 驱动 |
| 保持时间不足 | 高位采样错误、帧尾数据出错 | 时钟采样沿过后数据马上跳变 | 光标测:SCLK 采样沿到数据跳变 tHD | 软件微调收发延时、降低波特率 |
| CS 片选时序不满足 | 第一字节错误、从机不响应、帧截断 | CS 拉低后等待时钟太短;时钟结束后 CS 立刻拉高 | 光标测:CS 下降沿→第一个 SCLK、末时钟→CS 上升沿 | 软件加长 CS 前置、后置保持时间 |
3.2. 信号质量问题
| 常见问题 | 现象 | 根本原因 | 示波器排查 | 解决措施 |
|---|---|---|---|---|
| 信号过冲 / 下冲 | 边沿有尖峰、电压超 3.3V 甚至负压 | 走线长、阻抗不匹配、无串联电阻、地环路 | 关闭带宽限制,放大边沿看峰值 | 串 22~100Ω 电阻、缩短地线、用探头短弹簧地 |
| 振铃 / 反射震荡 | 电平上下抖动、逻辑误判、随机通信错 | 高速 SPI、走线阻抗不连续、未端接 | 放大高低电平平台,看是否周期震荡 | 终端匹配、减小走线长度、降低时钟频率 |
| 高低电平不达标 | 高电平偏低、低电平偏高,临近阈值 | IO 驱动弱、上拉不合理、负载过重 | 自动测量 Vhigh、Vlow,对比芯片 VIH/VIL | 增强 IO 驱动、调整上拉电阻、减少负载 |
| 线间串扰 | SCLK 跳变时,MOSI/MISO 出现毛刺 | 四线并行走线过长、间距太小 | 同时看 4 路,跳变时刻观察其他通道扰动 | 加大线间距、用地线隔离、减少并行长度 |
3.3. 时钟信号SCLK异常问题
| 常见问题 | 现象 | 根本原因 | 示波器排查 | 解决措施 |
|---|---|---|---|---|
| SCLK 时钟抖动大 | 周期忽快忽慢、波特率漂移 | 软件模拟 SPI、时钟源不稳、分频异常 | 长时间抓取测周期波动 | 改用硬件 SPI、校准系统时钟 |
| 占空比严重不对称 | 高电平和低电平宽度差很多 | MCU 时钟配置、寄存器分频设置异常 | 光标测高 / 低电平宽度,算占空比 | 重新配置 SPI 分频与时序寄存器 |
| 时钟缺失、中途断时钟 | 传输半截无 SCLK,帧不完整 | 软件打断 SPI、底层驱动 BUG | 观察整帧 SCLK 是否连续 | 优化驱动,禁止中途打断传输 |
3.4. 协议解码与数据问题
| 常见问题 | 现象 | 根本原因 | 示波器排查 | 解决措施 |
|---|---|---|---|---|
| 不完整帧、半截帧 | 示波器解码提示 Incomplete | CS 提前拉高、传输被打断、触发设置不对 | 观察 CS 是否提前跳变 | CS 下降沿单次触发、软件保证帧完整 |
| 高低位序反了 (MSB/LSB) | 波形正常,数据全部倒置 | 主从位序配置不一致 | 示波器解码切换 MSB/LSB 对比 | 统一主从高位先发 / 低位先发 |
| 单向正常、单向异常 | MOSI 正常 MISO 乱;或反过来 | 从机未片选、从机损坏、主机 IO 配置错 | 单独看异常通道波形和 CS 有效性 | 检查从机供电、片选、IO 初始化 |
3.5. 测试环境问题
| 常见问题 | 现象 | 原因 | 正确做法 |
|---|---|---|---|
| 探头地线太长 | 假振铃、假过冲、波形畸变 | 长线引入高频干扰 | 必须用短弹簧地 |
| 探头倍率不匹配 | 电压测量全部偏高 / 偏低 | 探头 10:1,示波器设 1:1 | 探头与通道倍率统一 10:1 |
| 开启带宽限制 | 边沿变圆滑,测不出过冲时序 | 限制滤除高频分量 | 关闭带宽限制 |
| 触发选错通道 | 乱抓波形、抓不到完整帧 | 用 SCLK 自动触发 | 固定CH1-CS 下降沿单次触发 |
| 采样率过低 | 边沿采样点少,时序测量不准 | 时基太大、采样率被拉低 | 调高采样率,一屏只看 1~2 帧 |
