SPI 协议详解与波形分析
SPI(Serial Peripheral Interface)是由摩托罗拉公司提出的一种高速、全双工、同步的串行通信总线。相比于 I2C,SPI 以其更高的传输速度和简单的协议逻辑,被广泛用于 ADC、Flash、LCD 屏幕等对速度有要求的场合。
1. 物理层架构
SPI 采用主从架构(Master-Slave),支持一主多从。标准的 SPI 接口通常由 4 根线组成:
- **SCLK (Serial Clock)**:时钟信号,由主机产生。
- **MOSI (Master Output Slave Input)**:也就是数据线,主机发从机收。
- **MISO (Master Input Slave Output)**:也就是数据线,主机收从机发。
- **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 模式汇总
| 模式 | CPOL | CPHA | 描述 |
|---|---|---|---|
| Mode 0 | 0 | 0 | 空闲低电平,第1个边沿(上升沿)采样 |
| Mode 1 | 0 | 1 | 空闲低电平,第2个边沿(下降沿)采样 |
| Mode 2 | 1 | 0 | 空闲高电平,第1个边沿(下降沿)采样 |
| Mode 3 | 1 | 1 | 空闲高电平,第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 驱动时,建议分层设计:
- **硬件抽象层 (HAL)**:负责操作寄存器或调用库函数,实现
spi_read_write_byte(uint8_t data)这样的基础函数。SPI 是全双工的,发送一个字节的同时必然会接收到一个字节,所以读写通常是一个函数。 - 设备驱动层:基于 HAL 层实现具体设备的逻辑。例如读取 Flash ID、写入数据等。
1 | // 伪代码示例 |
总结
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.