全志T113 SPI Flash驱动适配与读写性能调优 - 第3节

3.1 SPI 总线四线制信号定义

SPI(Serial Peripheral Interface,串行外设接口)是一种同步、全双工、主从式的串行通信总线。在物理层上,标准 SPI 总线由 四根信号线 构成,这也是嵌入式开发中最常见的接口形态。理解这四根线的功能与连接关系,是后续驱动开发和性能调优的基础。

核心要点: SPI 四线制中的每一根线都有唯一且不可替代的作用。SCK 提供时钟节拍,MOSI/MISO 构成数据环,CS 负责片选寻址。任何一根线的信号异常都会导致通信失败。

3.1.1 四线功能与连接拓扑

信号线名称 缩写 方向(主→从) 功能描述
串行时钟 SCK 主→从 由主设备产生,决定数据传输的速率和时序
主出从入 MOSI 主→从 主设备发送数据给从设备
主入从出 MISO 从→主 从设备发送数据给主设备
片选 CS 主→从 低电平有效,主设备选中特定的从设备进行通信

在典型的 SPI 总线拓扑中,主设备(如全志 T113 的 SPI 控制器)的 SCK、MOSI、CS 引脚连接到所有从设备的对应引脚,而每个从设备的 MISO 引脚则通过三态输出或独立引脚连接到主设备的 MISO 上。当 CS 为高电平时,从设备的 MISO 输出呈高阻态,避免总线冲突。

SPI 四线制主从连接拓扑 主设备 T113 SPI 控制器 SCK MOSI MISO CS 从设备 1 SPI Flash 从设备 2 SCK MOSI MISO CS1 CS2 连接规则 • SCK/MOSI 共享总线 • MISO 分时复用(高阻隔离) • CS 独立引脚,低电平选中

3.2 时钟极性(CPOL)与时钟相位(CPHA)

SPI 协议没有固定的数据采样标准,而是通过 CPOL 和 CPHA 两个参数来定义时钟空闲状态和数据采样时刻。这两个参数共同决定了 SPI 的四种工作模式(Mode 0 ~ Mode 3)。在全志 T113 的 SPI 控制器中,通过寄存器 SPI_CTL 的 CPOL 和 CPHA 位进行配置。

3.2.1 CPOL:时钟极性

CPOL 定义了 SCK 在空闲状态(即 CS 为高电平、无数据传输时)的电平。

  • CPOL = 0:空闲时 SCK 为低电平(0)。
  • CPOL = 1:空闲时 SCK 为高电平(1)。

3.2.2 CPHA:时钟相位

CPHA 定义了数据采样和切换发生在 SCK 的哪个时钟边沿。

  • CPHA = 0:在 SCK 的第一个边沿(上升沿或下降沿,取决于 CPOL)采样数据,在第二个边沿切换数据。
  • CPHA = 1:在 SCK 的第二个边沿采样数据,在第一个边沿切换数据。
记忆技巧: CPOL 决定“空闲时是什么电平”,CPHA 决定“第一个边沿做什么”。CPHA=0 时第一个边沿采样,CPHA=1 时第一个边沿切换。

3.2.3 四种工作模式对照表

模式 CPOL CPHA 空闲 SCK 电平 数据采样边沿 数据切换边沿
Mode 0 0 0 低电平 上升沿 下降沿
Mode 1 0 1 低电平 下降沿 上升沿
Mode 2 1 0 高电平 下降沿 上升沿
Mode 3 1 1 高电平 上升沿 下降沿

在全志 T113 平台上,SPI Flash 通常默认工作在 Mode 0 或 Mode 3。驱动开发时需要查阅 Flash 数据手册确认支持的 SPI 模式,并在控制器初始化时正确配置。

SPI 四种工作模式时序对比 Mode 0 (CPOL=0, CPHA=0) SCK MOSI D0 D1 D2 D3 Mode 1 (CPOL=0, CPHA=1) SCK MOSI D0 D1 D2 Mode 2 (CPOL=1, CPHA=0) SCK MOSI D0 D1 D2 Mode 3 (CPOL=1, CPHA=1) SCK MOSI D0 D1 采样边沿示意 CPHA=0:第一个边沿采样 CPHA=1:第二个边沿采样 采样 采样

3.3 全双工通信模式

SPI 最显著的特性之一是 全双工(Full-Duplex)通信。在一个完整的 SPI 时钟周期内,主设备通过 MOSI 发送数据的同时,从设备通过 MISO 发送数据。这意味着每次数据传输都包含一次双向交换。

3.3.1 全双工通信机制

在 SPI 总线中,数据以 移位寄存器 的方式工作。主设备和从设备内部各有一个 8 位(或更多位)的移位寄存器。当 SCK 产生 8 个时钟脉冲后,主设备移位寄存器中的 8 位数据通过 MOSI 移入从设备,同时从设备移位寄存器中的 8 位数据通过 MISO 移入主设备。因此,一次完整的 SPI 传输总是同时完成发送和接收。

重要推论: 在 SPI 协议中,不存在“只发送不接收”或“只接收不发送”的纯单向操作。即使主机只需要发送命令(如 SPI Flash 的写使能命令),也必须同时从 MISO 读取数据(通常丢弃)。驱动开发中,发送缓冲区和接收缓冲区必须成对出现。

3.3.2 全双工与半双工对比

特性 SPI(全双工) I²C(半双工) UART(全双工)
数据方向 同时双向 分时双向 同时双向
时钟源 主设备提供 主设备提供 双方独立时钟
线数 4 线(标准) 2 线(SDA+SCL) 2 线(TX+RX)
传输效率 高(无总线仲裁) 中(需应答位) 高(异步)
典型速率 数十 MHz 数百 KHz ~ 数 MHz 数 Mbps

3.3.3 全双工模式下的数据流

下图展示了 SPI 全双工通信中一个字节的传输过程。主设备将 tx_buf[0] 通过 MOSI 发出,同时从设备将 rx_buf[0] 通过 MISO 返回。8 个 SCK 时钟周期后,主设备收到从设备的数据,从设备收到主设备的数据。

SPI 全双工通信数据流(1 字节传输) 主设备 移位寄存器 tx: 0xA5 从设备 移位寄存器 tx: 0x3C MOSI: 0xA5 MISO: 0x3C SCK: 8 个时钟脉冲 传输结果 主设备收到 0x3C,从设备收到 0xA5,一次全双工交换完成

3.4 本章小结与驱动开发要点

  • 四线制信号:SCK(时钟)、MOSI(主出从入)、MISO(主入从出)、CS(片选)。CS 低电平有效,MISO 通过高阻态避免总线冲突。
  • CPOL/CPHA 配置:决定了 SPI 的工作模式。全志 T113 的 SPI 控制器通过 SPI_CTL 寄存器配置。SPI Flash 通常使用 Mode 0 或 Mode 3。
  • 全双工特性:每次传输同时完成发送和接收。驱动中 tx 和 rx 缓冲区必须成对存在,即使不需要接收数据也要提供虚拟缓冲区。
  • 性能影响:SPI 模式的选择会影响信号建立时间和保持时间,进而影响最高稳定时钟频率。在后续性能调优章节中,我们会通过调整 CPOL/CPHA 和时钟分频来优化读写吞吐量。
常见错误: 在编写 SPI Flash 驱动时,如果只配置了发送缓冲区而未配置接收缓冲区,或者接收缓冲区指针为 NULL,会导致内核 Oops 或数据错位。务必在每次传输前确保 rx_buf 有效,即使接收的数据不会被使用。