SPI驱动实战:片选时序调整与全双工传输性能调优 - 第1节

1.1 SPI 总线四线制工作原理

SPI(Serial Peripheral Interface,串行外设接口)是一种由 Motorola 公司推出的全双工同步串行通信总线。在嵌入式系统中,SPI 因其高速、简单、可靠的特点,被广泛应用于传感器、ADC/DAC、LCD 驱动、存储器(Flash/SRAM)、无线模块等外设的通信。

标准 SPI 总线采用 四线制 架构,四条信号线各司其职,共同完成主从设备之间的数据交换。

1.1.1 四线制信号定义

信号线 全称 方向(主→从) 功能描述
SCLK Serial Clock 主→从 由主设备产生的同步时钟,决定数据传输速率和时序
MOSI Master Out Slave In 主→从 主设备发送数据到从设备的单向数据线
MISO Master In Slave Out 从→主 从设备发送数据到主设备的单向数据线
CS Chip Select 主→从 片选信号,低电平有效,选中特定从设备进行通信
关键概念: SPI 是 同步 通信,所有数据移位操作都依赖 SCLK 时钟边沿;SPI 是 全双工 通信,在每一个时钟周期内,主设备通过 MOSI 发送一位数据,同时通过 MISO 接收一位数据,收发并行进行。

1.1.2 SPI 总线拓扑结构

SPI 总线采用 一主多从 的拓扑结构。主设备(通常是 MCU 或 SoC)控制 SCLK 和 CS 信号,所有从设备共享 SCLK、MOSI、MISO 三条总线,但每个从设备拥有独立的 CS 引脚。

SPI 一主多从四线制拓扑结构 主设备 (Master) 从设备 1 (Slave) 从设备 2 (Slave) 从设备 3 (Slave) SCLK MOSI MISO CS1 CS2 CS3 SCLK 实线 MOSI 虚线 MISO 点线 CS 独立片选
拓扑要点:
  • SCLK、MOSI、MISO 是 共享总线,所有从设备都连接到这三条线上。
  • CS 是 独立信号,主设备通过拉低某个从设备的 CS 引脚来选中该设备,未选中的从设备必须将 MISO 置为高阻态,避免总线冲突。
  • 同一时刻 只能有一个从设备被选中,否则 MISO 数据会发生碰撞。

1.2 全双工通信机制

SPI 最显著的特性是 全双工(Full-Duplex)通信。与 I²C 或 UART 的半双工模式不同,SPI 在每一个时钟周期内同时完成一位数据的发送和接收。

1.2.1 全双工移位原理

SPI 通信的核心是一个 环形移位寄存器 结构。主设备和从设备内部各有一个相同位宽的移位寄存器(通常为 8 位或 16 位)。在 SCLK 的驱动下,数据从主设备的 MOSI 引脚移出,同时从设备的 MISO 引脚数据移入主设备,形成一次完整的字节交换。

SPI 全双工移位寄存器数据交换 主设备移位寄存器 发送数据: 0xA5 (10100101) 从设备移位寄存器 发送数据: 0x3C (00111100) MOSI MISO SCLK 时钟驱动:每个时钟周期移位一次 主设备接收: 0x3C (从设备发来的数据) 从设备接收: 0xA5 (主设备发来的数据)

1.2.2 全双工通信时序流程

一次完整的 SPI 全双工数据传输遵循以下步骤:

  1. 片选阶段:主设备将目标从设备的 CS 引脚从高电平拉低,选中该从设备。
  2. 时钟启动:主设备开始产生 SCLK 时钟信号,频率由 SPI 时钟分频器决定。
  3. 数据移位:在每个 SCLK 时钟边沿(上升沿或下降沿,由 CPOL/CPHA 配置决定),主设备和从设备同时将移位寄存器中的最高位移出到 MOSI/MISO 线上,同时将对方发送的数据位移入自己的移位寄存器。
  4. 字节完成:经过 8 个(或 16 个)时钟周期后,主设备和从设备的移位寄存器内容完成一次完整的交换。
  5. 片选释放:主设备将 CS 拉高,结束本次通信。
常见误区: 很多初学者认为 SPI 的发送和接收是独立的两个操作。实际上,SPI 的 每一次发送必然伴随着一次接收。即使主设备只关心从设备发来的数据,也必须发送一个虚拟字节(通常为 0x00 或 0xFF)来产生时钟,驱动从设备输出数据。

1.2.3 全双工 vs 半双工对比

特性 SPI(全双工) I²C(半双工) UART(全双工)
数据方向 同时双向 分时双向 同时双向
时钟源 主设备提供 主设备提供 双方独立时钟
线数 4 线 2 线 2 线
最大速率 通常 10~50 MHz 标准 100/400 kHz 通常 1~10 Mbps
从设备选择 独立 CS 引脚 地址寻址 点对点
数据吞吐效率 高(每时钟 2 位) 中(每时钟 1 位) 高(每时钟 2 位)
性能优势: 在相同的时钟频率下,SPI 的全双工特性使其数据吞吐量是 I²C 的 2 倍。例如,10 MHz 的 SPI 总线实际数据传输速率可达 10 Mbps(发送)+ 10 Mbps(接收)= 20 Mbps 等效带宽。这使得 SPI 成为高速数据采集(如 ADC、图像传感器)和存储设备(如 Flash)的首选接口。

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

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

1.3.1 CPOL 与 CPHA 定义

参数 取值 含义
CPOL 0 空闲时 SCLK 为低电平
CPOL 1 空闲时 SCLK 为高电平
CPHA 0 数据在 SCLK 的第一个边沿(上升沿或下降沿)采样
CPHA 1 数据在 SCLK 的第二个边沿采样

1.3.2 四种模式速查表

模式 CPOL CPHA 空闲时钟电平 数据采样边沿 数据输出边沿
模式 0 0 0 低电平 上升沿 下降沿
模式 1 0 1 低电平 下降沿 上升沿
模式 2 1 0 高电平 下降沿 上升沿
模式 3 1 1 高电平 上升沿 下降沿
经验法则: 绝大多数 SPI 从设备默认使用 模式 0(CPOL=0, CPHA=0) 或 模式 3(CPOL=1, CPHA=1)。在驱动开发中,务必查阅从设备数据手册的时序图,确认设备支持的 SPI 模式,否则可能导致数据错位或通信失败。

1.4 本章小结

  • SPI 四线制包括 SCLK(时钟)、MOSI(主出从入)、MISO(主入从出)、CS(片选),采用一主多从拓扑。
  • SPI 是 全双工 通信,每个时钟周期同时完成一位数据的发送和接收,基于环形移位寄存器实现数据交换。
  • SPI 有 四种工作模式,由 CPOL(时钟极性)和 CPHA(时钟相位)组合决定,主从设备必须匹配。
  • 与 I²C 和 UART 相比,SPI 在 速率 和 吞吐量 上具有显著优势,适合高速外设通信。