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 输出 → 从设备 由主设备控制,低电平有效。选中特定的从设备进行通信。

通信过程的基本时序如下:

  1. 主设备将目标从设备的 CS 引脚拉低,启动通信。
  2. 主设备在 SCK 线上产生连续的时钟脉冲。
  3. 在每个时钟周期,主设备通过 MOSI 线发送一位数据,同时从设备通过 MISO 线返回一位数据。
  4. 数据传输完成后,主设备将 CS 引脚拉高,结束通信。
关键点:SPI 是全双工协议,主设备每发送一个字节,同时也会接收一个字节。即使主设备只关心从设备返回的数据,也必须发送时钟和填充字节(通常为 0x00 或 0xFF)来驱动从设备输出。

1.3 主从模式与多从机拓扑

1.3.1 单主单从模式

这是最简单的 SPI 拓扑结构。一个主设备与一个从设备直接连接,CS 线直接连接从设备的片选引脚。主设备独占总线,无需仲裁。

单主单从 SPI 连接拓扑 主设备 (Master) MCU / SoC 从设备 (Slave) SPI Flash SCK MOSI MISO CS CS 线直接连接,主设备独占从设备,无总线竞争

1.3.2 多从机拓扑:独立片选方式

当系统中存在多个 SPI 从设备时,最常用的拓扑是独立片选方式。主设备为每个从设备分配一个独立的 GPIO 作为 CS 线,所有从设备共享 SCK、MOSI、MISO 总线。

  • 优点:从设备之间完全独立,互不干扰;支持任意数量从设备(受限于主设备 GPIO 数量)。
  • 缺点:占用主设备较多的 GPIO 引脚;从设备的 MISO 引脚必须支持三态输出(高阻态),否则多个从设备同时驱动 MISO 会导致总线冲突。
多从机独立片选拓扑 主设备 (Master) GPIO 输出 从设备 1 SPI Flash 从设备 2 传感器 从设备 3 LCD 驱动器 SCK (共享) MOSI (共享) MISO (共享) CS1 CS2 CS3 每个从设备有独立的 CS 线,共享 SCK/MOSI/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 速率更高、硬件更简单,但占用更多引脚。