通讯协议-SPI
SPI(Serial Peripheral Interface,串行外设接口)是一种同步串行通信接口,常用于 MCU 与 Flash、显示屏、ADC、DAC、传感器等器件之间的板级高速通信。SPI 没有统一的高层协议,具体命令、时序限制和数据格式必须以从设备手册为准。
信号线
| 信号 | 常见别名 | 主设备方向 | 作用 |
|---|---|---|---|
| SCLK | SCK、CLK | 输出 | 串行时钟 |
| MOSI | COPI、SDI | 输出 | 主设备发送、从设备接收 |
| MISO | CIPO、SDO | 输入 | 从设备发送、主设备接收 |
| CS | SS、NSS | 输出 | 片选,通常低电平有效 |
| GND | - | - | 公共参考地 |
标准四线 SPI 支持全双工。某些器件只使用单向数据线,或将 MOSI/MISO 合并成一根双向数据线,形成三线或半双工 SPI。
总线结构
主设备产生时钟并选择从设备。多个从设备可共享 SCLK、MOSI 和 MISO,但通常每个从设备需要独立的 CS。
+-- CS0 --> 从设备 0
主设备 -- SCLK --+-- SCLK -> 从设备 0/1/2
-- MOSI --+-- MOSI -> 从设备 0/1/2
<- MISO --+-- MISO <- 从设备 0/1/2
+-- CS1 --> 从设备 1
+-- CS2 --> 从设备 2
未被选中的从设备必须释放 MISO,使其处于高阻态。若多个从设备同时驱动 MISO,会造成总线冲突。
SPI 模式
SPI 模式由时钟极性 CPOL 和时钟相位 CPHA 决定:
| 模式 | CPOL | CPHA | 空闲时钟电平 | 采样边沿 | 数据改变边沿 |
|---|---|---|---|---|---|
| Mode 0 | 0 | 0 | 低 | 第一个边沿(上升沿) | 第二个边沿(下降沿) |
| Mode 1 | 0 | 1 | 低 | 第二个边沿(下降沿) | 第一个边沿(上升沿) |
| Mode 2 | 1 | 0 | 高 | 第一个边沿(下降沿) | 第二个边沿(上升沿) |
| Mode 3 | 1 | 1 | 高 | 第二个边沿(上升沿) | 第一个边沿(下降沿) |
“第一个/第二个边沿”是相对于 CS 有效后、从时钟空闲电平开始计算。主从设备的模式必须一致,否则可能出现整体移位或位值错误。
一次典型传输
- 主设备将目标从设备的
CS置为有效。 - 主设备按目标器件要求发送命令、地址和数据。
- 每产生一个 SCLK 周期,MOSI 与 MISO 通常各移入/移出一位。
- 传输完成后,主设备将
CS置为无效。
CS ──────┐____________________________┌──────
SCLK ______|_/-\_/-\_/-\_/-\_/-\_/-\_|______
MOSI | 命令 / 地址 / 写入数据 |
MISO | 状态 / 占位 / 读取数据 |
SPI 是全双工移位接口。主设备为了读取数据,也必须发送相同数量的占位字节;从设备可能在主设备发送命令时同时返回无效或状态数据。
关键参数
| 参数 | 说明 | 核对来源 |
|---|---|---|
| 最大 SCLK 频率 | 从设备可接受的最高时钟频率 | 从设备数据手册 |
| CPOL/CPHA | SPI 模式 | 从设备数据手册 |
| 位序 | MSB first 或 LSB first | 从设备数据手册 |
| 字长 | 常见为 8 位,也可能是 9、16、24、32 位 | 从设备数据手册 |
| CS 建立/保持时间 | CS 有效到首个时钟、末个时钟到 CS 无效的时间 | 从设备时序图 |
| 字节间隔 | 连续字节之间是否允许或要求停顿 | 从设备数据手册 |
| 电平 | 通信双方 IO 电压与阈值 | 双方数据手册 |
不要仅依据“器件支持 SPI”确定配置。不同器件可能使用不同模式、命令格式、片选行为和读取延迟。
优点与限制
| 优点 | 限制 |
|---|---|
| 全双工,吞吐量高 | 没有统一的寻址和命令协议 |
| 时序简单,硬件支持广泛 | 多从设备通常占用多个 CS 引脚 |
| 无需上拉,边沿通常较快 | 没有原生确认、重试和错误校验 |
| 可连续传输大量数据 | 不适合长距离或板外复杂环境 |
常见扩展
| 类型 | 数据线 | 特点 |
|---|---|---|
| 标准 SPI | MOSI + MISO | 全双工,一位数据宽度 |
| 三线 SPI | 单根双向数据线 | 节省引脚,需要切换方向 |
| Dual SPI | 2 根双向数据线 | 常用于串行 Flash |
| Quad SPI(QSPI) | 4 根双向数据线 | 提高 Flash 读取带宽 |
| Octal SPI | 8 根双向数据线 | 更高吞吐量,时序要求更严格 |
扩展模式的命令、地址阶段和数据阶段可能使用不同线宽,必须按器件手册配置。
常见问题与排查
| 现象 | 常见原因 | 排查方法 |
|---|---|---|
始终读到 0xFF | MISO 未被驱动、CS 无效、接线断开 | 观察 CS 和 MISO,确认器件供电与引脚方向 |
始终读到 0x00 | MISO 被拉低、器件复位或未启动 | 检查复位、供电和 MISO 电平 |
| 数据整体移位 | CPHA/CPOL 配置错误 | 依次核对四种模式或按手册配置 |
| 高速正常率低 | 走线、负载、串扰或建立保持时间不足 | 降低时钟,用示波器观察边沿和振铃 |
| 首字节正确,后续错误 | CS 行为或字节间隔不符合要求 | 对照器件时序图检查连续传输规则 |
| 多从设备冲突 | 非选中设备未释放 MISO | 分别断开设备或检查其 MISO 高阻要求 |
调试步骤
- 确认电源、电平、地线和器件复位状态。
- 从低 SCLK 频率开始,核对
CPOL、CPHA和位序。 - 用逻辑分析仪同时观察
CS、SCLK、MOSI和MISO。 - 对照器件手册拆分命令、地址、占位周期和返回数据。
- 检查 CS 的有效电平、建立时间、保持时间和字节间行为。
- 提高频率后,用示波器检查过冲、振铃、边沿速度和采样裕量。
适用场景
SPI 适合板内、短距离、高吞吐量的主从通信。需要多节点寻址、较少引脚或板外通信时,应根据速率、距离和可靠性要求考虑 I²C、CAN、RS-485 等接口。