2. SPI 协议基础:四线制、工作模式与全双工原理

SPI(Serial Peripheral Interface,串行外设接口)是一种同步、全双工、主从式的串行通信总线。在全志 T113 的 SPI 控制器驱动开发中,理解 SPI 协议的底层信号机制是正确配置中断触发条件、优化读写吞吐量的前提。本节从物理层信号、时钟极性/相位配置、以及全双工数据流三个维度展开。

2.1 SPI 四线制信号定义

标准 SPI 总线使用四条信号线完成主从设备之间的数据交换。下表列出了每条信号线的名称、方向与功能描述:

信号线 全称 方向(主→从) 功能描述
SCLK Serial Clock 主→从 由主设备产生的同步时钟,决定数据采样与跳变时刻
MOSI Master Out Slave In 主→从 主设备发送数据、从设备接收数据
MISO Master In Slave Out 从→主 从设备发送数据、主设备接收数据
CS Chip Select 主→从 片选信号,低电平有效,选中目标从设备
驱动提示: 在全志 T113 的 SPI 控制器寄存器中,SCLK 频率由 SPI_CLK_CTL 寄存器中的分频系数决定。CS 信号的极性(高有效或低有效)可通过 SPI_CS_CTL 配置,务必与从设备数据手册匹配,否则通信将完全失败。
SPI 四线制主从连接拓扑 SPI 主设备 (全志 T113) SCLK 发生器 移位寄存器 CS 控制逻辑 SPI 从设备 (Flash / ADC / 传感器) 移位寄存器 片选响应 SCLK MOSI MISO CS(低有效) 全双工:每个时钟周期,MOSI 发送一位数据,MISO 同时接收一位数据

2.2 工作模式:CPOL 与 CPHA

SPI 协议通过时钟极性(CPOL)和时钟相位(CPHA)的组合定义四种工作模式。CPOL 决定 SCLK 空闲时的电平,CPHA 决定数据采样发生在 SCLK 的第一个还是第二个边沿。

模式 CPOL CPHA 空闲时钟电平 数据采样边沿 数据输出边沿
模式 0 0 0 低电平 上升沿 下降沿
模式 1 0 1 低电平 下降沿 上升沿
模式 2 1 0 高电平 下降沿 上升沿
模式 3 1 1 高电平 上升沿 下降沿
常见错误: 全志 T113 的 SPI 控制器默认工作在模式 0。如果外接的 SPI Flash 或 ADC 芯片要求模式 3,必须在驱动初始化阶段通过 SPI_MODE_CTL 寄存器设置 CPOL=1、CPHA=1。模式不匹配会导致数据错位或 CRC 校验失败。
SPI 模式 0 与模式 3 时序对比 模式 0(CPOL=0, CPHA=0) SCLK ↑ ↑ ↑ ↑ 采样在上升沿,数据在下降沿变化 模式 3(CPOL=1, CPHA=1) SCLK ↑ ↑ ↑ ↑ 空闲高电平,采样在上升沿,数据在下降沿变化 驱动配置要点:T113 的 SPI_CPHA 位决定采样边沿,SPI_CPOL 位决定空闲电平 务必在片选拉低之前完成模式配置,否则从设备可能误采样

2.3 全双工通信原理

SPI 的全双工特性意味着主设备在发送数据的同时也在接收数据。每个时钟周期内,主设备通过 MOSI 线移出一位数据,同时从设备通过 MISO 线移入一位数据。这种对称结构使得 SPI 的读写操作在硬件层面是“成对”发生的。

性能关键点: 在全志 T113 的 SPI 驱动中,如果只需要读取从设备的数据(例如读取 Flash ID),主设备仍然必须通过 MOSI 发送“哑字节”(dummy byte)来产生时钟。驱动中通常使用 spi_write_then_read() 或直接操作 FIFO 完成这一过程。忽略哑字节会导致时钟缺失,从设备无法输出数据。

全双工通信的典型时序流程如下:

  1. 片选拉低: 主设备将 CS 信号置为低电平,通知从设备准备通信。
  2. 时钟启动: 主设备开始输出 SCLK 时钟信号,频率由 SPI 控制器分频配置决定。
  3. 数据移位: 每个 SCLK 周期,主设备移位寄存器将 MOSI 上的数据移出,同时从设备移位寄存器将 MISO 上的数据移入主设备接收缓冲区。
  4. 传输完成: 发送完指定字节数后,主设备停止 SCLK,并将 CS 拉高,结束本次传输。
SPI 全双工数据移位过程 主设备移位寄存器 发送缓冲区 → MOSI MISO → 接收缓冲区 从设备移位寄存器 MOSI → 接收缓冲区 发送缓冲区 → MISO MOSI 数据流 MISO 数据流 每个 SCLK 周期:主设备发送 1 位(MOSI)⇔ 从设备同时发送 1 位(MISO) 8 个时钟周期完成 1 字节的全双工交换 示例:主设备发送 0xA5,同时接收从设备数据 MOSI: 1 0 1 0 0 1 0 1 → 从设备接收 0xA5 MISO: 0 1 1 0 1 0 1 0 → 主设备接收 0x6A

2.4 驱动开发中的协议配置要点

在全志 T113 的 SPI 驱动中,协议相关的配置集中在以下几个寄存器或接口参数中:

  • 时钟频率: 通过 SPI_CLK_CTL 设置分频系数,典型值 12 MHz ~ 48 MHz,需根据从设备上限频率调整。
  • 数据位宽: 支持 8 位、16 位、32 位模式,通过 SPI_MODE_CTL 中的 DATA_WIDTH 字段配置。
  • CS 控制: 支持硬件自动 CS 和软件手动 CS,中断驱动中通常使用硬件自动 CS 以减少 CPU 干预。
  • FIFO 阈值: 触发中断的 FIFO 深度阈值,直接影响中断频率和吞吐量。