SPI Flash驱动开发实战 - 第1节
1.1 SPI 协议概述
SPI(Serial Peripheral Interface,串行外设接口)是一种由 Motorola 公司提出的全双工、同步、串行通信总线。它广泛应用于嵌入式系统中,用于微控制器与各种外设(如 SPI Flash、传感器、ADC/DAC、LCD 驱动器等)之间的短距离高速数据交换。
SPI 总线的主要特点包括:
- 全双工通信:数据发送与接收可同时进行。
- 主从模式:总线中只有一个主设备(Master)控制时钟和片选,一个或多个从设备(Slave)响应。
- 四线制接口:使用 SCK、MOSI、MISO、CS 四根信号线。
- 高速率:时钟频率通常可达数十 MHz,适合批量数据传输。
- 无地址机制:通过片选信号直接选中从设备,无需像 I²C 那样发送从机地址。
提示:SPI 协议没有标准的应答机制,主设备通过片选信号和时钟脉冲直接控制数据传输的起止。开发者需要确保从设备在片选有效期间准备好数据。
1.2 四线制信号线工作原理
SPI 总线使用四根信号线完成通信,每根线的作用如下表所示:
| 信号线 | 全称 | 方向(主设备视角) | 功能描述 |
|---|---|---|---|
| SCK | Serial Clock | 输出 → 从设备 | 由主设备产生,同步数据传输。每个时钟脉冲传输一位数据。 |
| MOSI | Master Out Slave In | 输出 → 从设备 | 主设备发送数据给从设备。数据在 SCK 的边沿被从设备采样。 |
| MISO | Master In Slave Out | 输入 ← 从设备 | 从设备发送数据给主设备。数据在 SCK 的边沿被主设备采样。 |
| CS | Chip Select | 输出 → 从设备 | 由主设备控制,低电平有效。选中特定的从设备进行通信。 |
通信过程的基本时序如下:
- 主设备将目标从设备的 CS 引脚拉低,启动通信。
- 主设备在 SCK 线上产生连续的时钟脉冲。
- 在每个时钟周期,主设备通过 MOSI 线发送一位数据,同时从设备通过 MISO 线返回一位数据。
- 数据传输完成后,主设备将 CS 引脚拉高,结束通信。
关键点:SPI 是全双工协议,主设备每发送一个字节,同时也会接收一个字节。即使主设备只关心从设备返回的数据,也必须发送时钟和填充字节(通常为 0x00 或 0xFF)来驱动从设备输出。
1.3 主从模式与多从机拓扑
1.3.1 单主单从模式
这是最简单的 SPI 拓扑结构。一个主设备与一个从设备直接连接,CS 线直接连接从设备的片选引脚。主设备独占总线,无需仲裁。
1.3.2 多从机拓扑:独立片选方式
当系统中存在多个 SPI 从设备时,最常用的拓扑是独立片选方式。主设备为每个从设备分配一个独立的 GPIO 作为 CS 线,所有从设备共享 SCK、MOSI、MISO 总线。
- 优点:从设备之间完全独立,互不干扰;支持任意数量从设备(受限于主设备 GPIO 数量)。
- 缺点:占用主设备较多的 GPIO 引脚;从设备的 MISO 引脚必须支持三态输出(高阻态),否则多个从设备同时驱动 MISO 会导致总线冲突。
1.3.3 多从机拓扑:菊花链方式
菊花链(Daisy-Chain)是一种特殊的 SPI 拓扑,适用于从设备数量较多但主设备 GPIO 有限的场景。从设备的 MISO 连接到下一个从设备的 MOSI,形成一个链状结构。主设备通过一个 CS 信号同时选中所有从设备,数据在链中逐级传递。
- 优点:仅需一个 CS 引脚,可连接大量从设备。
- 缺点:数据传输延迟随链长度增加;所有从设备必须支持菊花链模式;软件处理复杂。
注意:在 SPI Flash 驱动开发中,绝大多数场景使用独立片选拓扑。菊花链方式主要用于移位寄存器或特定 LED 驱动芯片,SPI Flash 通常不支持菊花链模式。本课程后续内容均基于独立片选拓扑展开。
1.4 SPI 模式(CPOL / CPHA)
SPI 协议定义了四种工作模式,由时钟极性(CPOL)和时钟相位(CPHA)组合决定。主设备和从设备必须使用相同的模式才能正常通信。
| 模式 | CPOL | CPHA | 时钟空闲电平 | 数据采样边沿 | 常见应用 |
|---|---|---|---|---|---|
| 模式 0 | 0 | 0 | 低电平 | 第一个跳变沿(上升沿) | 大多数 SPI Flash(如 Winbond、Macronix) |
| 模式 1 | 0 | 1 | 低电平 | 第二个跳变沿(下降沿) | 某些传感器 |
| 模式 2 | 1 | 0 | 高电平 | 第一个跳变沿(下降沿) | 某些 ADC |
| 模式 3 | 1 | 1 | 高电平 | 第二个跳变沿(上升沿) | 部分 SPI Flash 也支持 |
实践要点:在驱动 SPI Flash 时,务必查阅数据手册确认其支持的 SPI 模式。绝大多数 SPI Flash 默认工作在模式 0(CPOL=0, CPHA=0)。如果主设备配置错误,Flash 将无法正确响应指令。
1.5 SPI 与 I²C 对比
在嵌入式系统中,SPI 和 I²C 是最常用的两种串行总线。下表从多个维度对比两者的差异,帮助开发者根据应用场景选择合适的总线。
| 对比维度 | SPI | I²C |
|---|---|---|
| 信号线数量 | 4 根(SCK, MOSI, MISO, CS) | 2 根(SCL, SDA) |
| 通信方式 | 全双工 | 半双工 |
| 从设备寻址 | 硬件片选(CS 引脚) | 软件地址(7 位或 10 位) |
| 传输速率 | 高(通常 10~80 MHz) | 中(标准 100 kHz,快速 400 kHz,高速 3.4 MHz) |
| 总线仲裁 | 不需要(主设备独占) | 需要(多主模式时) |
| 从设备数量 | 受限于 GPIO 数量 | 受限于地址空间(最多 127 个) |
| 硬件复杂度 | 较低(无地址解析) | 较高(需地址比较和 ACK 检测) |
| 典型应用 | SPI Flash、LCD、ADC、SD 卡 | 传感器、EEPROM、RTC |
选型建议:对于需要高速、大批量数据传输的场景(如 SPI Flash 读写),SPI 是首选。对于引脚数量受限、从设备较多且速率要求不高的场景,I²C 更合适。
1.6 本章小结
- SPI 是一种全双工、同步、主从模式的串行总线,使用 SCK、MOSI、MISO、CS 四根信号线。
- 主设备通过 CS 线选中从设备,通过 SCK 提供时钟,数据在 MOSI/MISO 线上同时传输。
- 多从机拓扑中,独立片选方式最常用,要求从设备 MISO 支持三态输出。
- SPI 有四种工作模式(CPOL/CPHA 组合),SPI Flash 通常使用模式 0。
- 与 I²C 相比,SPI 速率更高、硬件更简单,但占用更多引脚。