SPI 协议详解与波形分析

Evek Golden Lv4

SPI(Serial Peripheral Interface)是由摩托罗拉公司提出的一种高速、全双工、同步的串行通信总线。相比于 I2C,SPI 以其更高的传输速度和简单的协议逻辑,被广泛用于 ADC、Flash、LCD 屏幕等对速度有要求的场合。

1. 物理层架构

SPI 采用主从架构(Master-Slave),支持一主多从。标准的 SPI 接口通常由 4 根线组成:

  1. **SCLK (Serial Clock)**:时钟信号,由主机产生。
  2. **MOSI (Master Output Slave Input)**:也就是数据线,主机发从机收。
  3. **MISO (Master Input Slave Output)**:也就是数据线,主机收从机发。
  4. **CS/SS (Chip Select / Slave Select)**:片选信号,低电平有效。

提示:有些数据手册可能会用 DO/DI (Data Out/In) 或 SDI/SDO 来标记。对于主机来说,SDO=MOSI,SDI=MISO;对于从机则相反。接线时需仔细确认方向。

2. 协议四种模式(核心难点)

SPI 协议最容易让人混淆的就是它的四种工作模式。这由两个参数决定:时钟极性(CPOL)时钟相位(CPHA)

2.1 时钟极性 CPOL (Clock Polarity)

决定了总线空闲时(CS 为高电平时)SCLK 的电平状态。

  • CPOL = 0:空闲时 SCLK 为低电平
  • CPOL = 1:空闲时 SCLK 为高电平

2.2 时钟相位 CPHA (Clock Phase)

决定了数据是在时钟的第几个边沿进行采样(Capture)和切换(Toggle)。

  • CPHA = 0:在时钟的第1个跳变沿(上升沿或下降沿)采样数据,在第2个跳变沿切换数据。
  • CPHA = 1:在时钟的第2个跳变沿采样数据,在第1个跳变沿切换数据。

2.3 模式汇总

模式CPOLCPHA描述
Mode 000空闲低电平,第1个边沿(上升沿)采样
Mode 101空闲低电平,第2个边沿(下降沿)采样
Mode 210空闲高电平,第1个边沿(下降沿)采样
Mode 311空闲高电平,第2个边沿(上升沿)采样

经验之谈:Mode 0 and Mode 3 是最常用的两种模式。大部分 SPI Flash 芯片都支持 Mode 0 或 Mode 3。如果你发现读出的数据错位(比如整体左移或右移了一位),很可能是 CPHA 设置错了。

3. 多从机连接方式

3.1 独立片选(常规方式)

主机为每一个从机分配一根独立的 CS 线。需要和哪个从机通信,就拉低对应的 CS 线。

  • 优点:控制简单,速度快。
  • 缺点:占用主机 GPIO 资源多。

3.2 菊花链(Daisy Chain)

虽然不如 RS-485 常见,但 SPI 也支持菊花链。
连接方式:MOU -> Slave1(MOSI) -> Slave1(MISO) -> Slave2(MOSI) -> Slave2(MISO) -> Host(MISO)。
所有从机共用一个 CS 和 SCLK。

  • 优点:节省 GPIO。
  • 缺点:协议复杂,数据需要在链路上通过移位寄存器依次传递,速度较慢,且当链路上某个节点故障时会导致整个链路中断。

4. 驱动编写建议

在编写 SPI 驱动时,建议分层设计:

  1. **硬件抽象层 (HAL)**:负责操作寄存器或调用库函数,实现 spi_read_write_byte(uint8_t data) 这样的基础函数。SPI 是全双工的,发送一个字节的同时必然会接收到一个字节,所以读写通常是一个函数。
  2. 设备驱动层:基于 HAL 层实现具体设备的逻辑。例如读取 Flash ID、写入数据等。
1
2
3
4
5
6
7
8
9
10
11
// 伪代码示例
uint8_t SPI_ReadWriteByte(uint8_t txData) {
// 1. 等待发送缓冲区空
while (!SPI_TX_BUFFER_EMPTY);
// 2. 发送数据
SPI_REG_DATA = txData;
// 3. 等待接收完成
while (!SPI_RX_COMPLETE);
// 4. 返回接收到的数据
return SPI_REG_DATA;
}

总结

SPI 简单高效,但缺乏流控机制(不像 I2C 有 ACK)。在高速传输或长距离(板间)通信时,需要注意信号完整性,适当串联匹配电阻,并检查时序裕量。

  • Title: SPI 协议详解与波形分析
  • Author: Evek Golden
  • Created at : 2025-06-04 23:55:00
  • Updated at : 2026-06-12 08:57:02
  • Link: https://blog.cocodemo.uno/posts/spi9x2k/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments