SPI驱动开发Flash读写与DMA传输速率配置 - 第1节

1.1 SPI总线定义与物理层

SPI(Serial Peripheral Interface,串行外设接口)由Motorola公司于1980年代提出,是一种同步、全双工、主从式的串行通信总线。在嵌入式系统中,SPI因其极低的引脚开销(仅4根线)和高达数十MHz的时钟速率,成为连接Flash存储器、ADC/DAC、传感器、LCD控制器等外设的首选总线之一。

1.1.1 四线制信号定义

信号名称 缩写 方向(主→从) 功能描述
串行时钟 SCLK / SCK 主→从 由主设备产生,决定数据传输速率;每个时钟周期传输1位数据
主出从入 MOSI 主→从 主设备发送数据至从设备的数据线
主入从出 MISO 从→主 从设备发送数据至主设备的数据线
片选 CS / SS 主→从 低电平有效,主设备选中特定从设备开始通信
关键概念:SPI是全双工通信——在每一个SCLK周期内,主设备通过MOSI发送1位数据的同时,从设备通过MISO返回1位数据。这意味着SPI的物理层天然支持双向同时传输,无需像I²C那样切换数据线方向。

1.1.2 SPI物理连接拓扑

下图展示了一个主设备与三个从设备的标准SPI总线连接方式。每个从设备拥有独立的CS线,而SCLK、MOSI、MISO三根总线被所有设备共享。

SPI多从设备总线拓扑 主设备 (Master) 从设备1 Flash 从设备2 ADC 从设备3 LCD SCLK MOSI MISO CS1 CS2 CS3 每个从设备独占一根CS线,SCLK/MOSI/MISO三线共享;同一时刻只能有一个CS被拉低 从设备MISO输出高阻态(Hi-Z)直到其CS被选中,避免总线冲突
硬件设计要点:当多个从设备共享MISO总线时,未被选中的从设备必须将其MISO引脚置为高阻态(Hi-Z)。如果从设备不支持三态输出,则需要在每个从设备的MISO线上串联一个三态缓冲器(如74HC125),否则多个从设备同时驱动MISO会导致信号冲突甚至损坏引脚。

1.2 SPI信号时序与全双工原理

1.2.1 基本时序单元

SPI通信以SCLK的每个周期为基本传输单元。在一个SCLK周期内,主设备和从设备各完成1位数据的发送和接收。下图展示了SPI单字节(8位)传输的完整时序波形:

SPI单字节传输时序图(CPOL=0, CPHA=0) CS SCLK 1 2 3 4 5 6 7 8 MOSI MSB b6 b5 b4 b3 b2 b1 LSB MISO MSB b6 b5 b4 b3 b2 b1 LSB ↑采样 ↑采样 ↑采样 ↑采样 ↑采样 ↑采样 ↑采样 ↑采样 CPOL=0(空闲低电平),CPHA=0(第一个时钟沿采样)—— 数据在SCLK上升沿被采样 MOSI和MISO上的数据在SCLK下降沿更新,在上升沿被接收端锁存

1.2.2 全双工通信原理

SPI的全双工能力来源于其独立的发送和接收数据路径。与半双工总线(如I²C、单线UART)不同,SPI在硬件层面为每个方向分配了专用信号线:

  • MOSI:主设备发送移位寄存器的输出端 → 从设备移位寄存器的输入端
  • MISO:从设备移位寄存器的输出端 → 主设备移位寄存器的输入端

在每一个SCLK周期内,主从双方的移位寄存器同时左移或右移一位:主设备移出的位进入从设备,从设备移出的位进入主设备。这意味着一次SPI传输本质上是一次寄存器交换——主设备发送的数据和接收的数据在同一个时钟周期内完成。

全双工的实际含义:当主设备向Flash发送“读命令+地址”时,Flash在接收命令的同时,通过MISO向主设备返回数据。但Flash在命令解码完成前无法提供有效数据,因此前几个字节的MISO数据通常是无效的(垃圾数据)。驱动开发中必须考虑这种“管道延迟”,在发送读命令后主动发送若干“哑字节”(dummy bytes)以产生时钟,等待Flash输出有效数据。

1.3 SPI四种工作模式(CPOL/CPHA)

SPI协议定义了时钟极性(CPOL)和时钟相位(CPHA)两个参数,组合出四种工作模式。主设备和从设备必须使用相同的模式才能正确通信。

模式 CPOL CPHA 空闲时钟电平 数据采样沿 数据更新沿
模式0 0 0 低电平 上升沿 下降沿
模式1 0 1 低电平 下降沿 上升沿
模式2 1 0 高电平 下降沿 上升沿
模式3 1 1 高电平 上升沿 下降沿
常见兼容性问题:绝大多数SPI Flash器件默认工作在模式0(CPOL=0, CPHA=0)或模式3(CPOL=1, CPHA=1)。这两种模式的数据采样沿都是SCLK的上升沿,区别仅在于空闲时钟电平。如果主设备配置为模式1而Flash要求模式0,则采样沿错位会导致所有数据位偏移一位,通信完全失败。驱动初始化时必须查阅器件数据手册确认模式配置。

1.4 SPI传输速率与系统约束

1.4.1 理论最大吞吐量

SPI的传输速率由SCLK频率直接决定。对于N位数据,传输时间为:

T_transfer = N / f_SCLK

示例:f_SCLK = 20 MHz,传输1字节(8位)
T_transfer = 8 / 20e6 = 0.4 µs

理论吞吐量 = f_SCLK × 1字节/8位 = 20e6 / 8 = 2.5 MB/s

1.4.2 实际速率限制因素

实际系统中,SPI有效吞吐量远低于理论值,主要受以下因素制约:

  1. CS切换开销:每次传输前后需要拉低和释放CS,CS建立时间(t_css)和保持时间(t_csh)通常为几十ns
  2. 帧间间隔:连续传输之间需要至少一个SCLK周期的空闲间隔
  3. 软件中断延迟:CPU通过轮询或中断方式处理每个字节时,ISR入栈/出栈时间可能超过SPI硬件传输时间
  4. DMA启动延迟:DMA传输的配置和启动需要数十个CPU周期
SPI传输速率瓶颈分析图 SPI实际吞吐量 = f_SCLK × 效率因子 理论吞吐量 f_SCLK / 8 (MB/s) 效率因子 η 0.3 ~ 0.8 实际吞吐量 η × 理论值 效率因子 η 的主要影响因素: • CS建立/保持时间(t_css / t_csh):每次传输额外消耗 20~100 ns • 帧间间隔(Inter-frame spacing):至少 1 个SCLK周期 • 软件处理延迟:轮询模式下每字节 0.5~5 µs,DMA模式下可降至 0.1 µs 以下 • 从设备响应延迟:Flash读操作需要 tR(通常 25~100 µs)后才能输出有效数据

1.5 SPI与Flash的典型连接

在嵌入式系统中,SPI Flash(如W25Q64、MX25L256)是最常见的SPI从设备之一。下图展示了MCU与SPI Flash的典型硬件连接:

MCU (主设备) ← 上一章 📖 返回目录 下一章 →