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三根总线被所有设备共享。
硬件设计要点:当多个从设备共享MISO总线时,未被选中的从设备必须将其MISO引脚置为高阻态(Hi-Z)。如果从设备不支持三态输出,则需要在每个从设备的MISO线上串联一个三态缓冲器(如74HC125),否则多个从设备同时驱动MISO会导致信号冲突甚至损坏引脚。
1.2 SPI信号时序与全双工原理
1.2.1 基本时序单元
SPI通信以SCLK的每个周期为基本传输单元。在一个SCLK周期内,主设备和从设备各完成1位数据的发送和接收。下图展示了SPI单字节(8位)传输的完整时序波形:
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有效吞吐量远低于理论值,主要受以下因素制约:
- CS切换开销:每次传输前后需要拉低和释放CS,CS建立时间(t_css)和保持时间(t_csh)通常为几十ns
- 帧间间隔:连续传输之间需要至少一个SCLK周期的空闲间隔
- 软件中断延迟:CPU通过轮询或中断方式处理每个字节时,ISR入栈/出栈时间可能超过SPI硬件传输时间
- DMA启动延迟:DMA传输的配置和启动需要数十个CPU周期
1.5 SPI与Flash的典型连接
在嵌入式系统中,SPI Flash(如W25Q64、MX25L256)是最常见的SPI从设备之一。下图展示了MCU与SPI Flash的典型硬件连接: