SPI驱动适配实战:CPOL与CPHA参数调试方法 - 第1节

1.1 SPI 总线历史与演进

SPI(Serial Peripheral Interface,串行外设接口)由摩托罗拉(Motorola)于 20 世纪 80 年代中期提出,最初用于 MC68000 系列微控制器与外围芯片之间的短距离、高速串行通信。与同期流行的 I²C 总线相比,SPI 以全双工、无地址帧、硬件片选为特征,在速度、延迟和协议开销上具有明显优势。

时间节点 里程碑 关键特性
1985 年 摩托罗拉首次定义 SPI 协议 四线制、全双工、主从架构
1990 年代 SPI 成为嵌入式事实标准 ADC/DAC、传感器、存储器广泛采用
2000 年代 Linux 内核引入 SPI 子系统 spi-core、spi-dev、spi-driver 分层
2010 年代至今 高速 SPI 与 QSPI/OSPI 扩展 时钟频率突破 100 MHz,多线数据模式
调试提示: 虽然 SPI 没有像 I²C 那样严格的标准化文档,但几乎所有 SPI 器件都遵循“时钟极性(CPOL)+ 时钟相位(CPHA)”的时序约定。理解 CPOL/CPHA 是 SPI 驱动适配的第一步。

1.2 四线制信号定义

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

信号线 全称 方向(主→从) 功能描述
SCLK Serial Clock 主→从 由主设备驱动,决定数据传输速率和采样时刻
MOSI Master Out Slave In 主→从 主设备发送数据到从设备
MISO Master In Slave Out 从→主 从设备发送数据到主设备
CS Chip Select 主→从 低电平有效,选中目标从设备
硬件连线要点: 主设备的 MOSI 连接从设备的 MOSI(同名直连),MISO 连接 MISO,SCLK 连接 SCLK,CS 连接 CS。注意不要交叉连接,这与 UART 的 TX/RX 交叉不同。

1.3 全双工通信原理

SPI 的核心优势在于全双工(Full-Duplex)通信:在每一个时钟周期内,主设备通过 MOSI 发送 1 bit 数据,同时从设备通过 MISO 返回 1 bit 数据。发送和接收在硬件上并行进行,互不干扰。

下图展示了一次典型的 8-bit SPI 全双工数据传输过程:

SPI 全双工 8-bit 数据传输时序 SPI 全双工 8-bit 数据传输时序 SCLK 1 2 3 4 5 6 7 8 MOSI b7 b6 b5 b4 b3 b2 b1 b0 MISO b7 b6 b5 b4 b3 b2 b1 b0 CS CS 低电平有效(从设备被选中) 每个时钟周期内,MOSI 发送 1 bit,MISO 同时接收 1 bit,互不干扰 8 个时钟周期完成一个字节的全双工传输
全双工 vs 半双工: 与 I²C 或单线 UART 不同,SPI 不需要切换数据方向。主设备发送数据的同时就能收到从设备的应答或数据,这对传感器读取、Flash 编程等场景非常有利。

1.4 SPI 系统架构与主从关系

一个典型的 SPI 系统包含一个主设备(Master)和多个从设备(Slave)。主设备负责产生时钟信号并控制片选线,从设备在片选有效时响应主设备的时钟和数据。

SPI 多从设备系统架构 SPI 多从设备系统架构(独立片选) 主设备 Master SCLK / MOSI / MISO 从设备 1 Slave #1 从设备 2 Slave #2 从设备 3 SCLK MOSI MISO CS1 CS2 CS3 架构要点 SCLK / MOSI / MISO 三根总线共享 每个从设备独立 CS 同一时刻只选中一个从设备 未选中的从设备 MISO 为高阻
常见误区: 多个从设备共享 MOSI/MISO/SCLK 时,必须确保未选中的从设备 MISO 引脚输出高阻态(Hi-Z),否则多个从设备同时驱动 MISO 会导致总线冲突,严重时可能损坏引脚。

1.5 SPI 通信流程与数据帧结构

一次完整的 SPI 传输遵循以下步骤:

  1. 片选拉低: 主设备将目标从设备的 CS 引脚从高电平拉至低电平,激活从设备。
  2. 时钟启动: 主设备开始产生 SCLK 时钟信号,频率由 SPI 时钟分频器决定。
  3. 数据移位: 每个时钟周期,主设备通过 MOSI 移出 1 bit,同时从设备通过 MISO 移出 1 bit。
  4. 帧结束: 传输完指定字节数后,主设备停止 SCLK,并将 CS 拉回高电平。

数据帧结构通常以字节(8 bit)为单位,但部分器件支持 16 bit 或可变长度帧:

帧格式 位宽 典型应用
标准 SPI 8 bit 传感器、ADC/DAC、EEPROM
扩展 SPI 16 bit 音频编解码器、触摸控制器
QSPI / OSPI 多线并行 NOR Flash、FPGA 配置
驱动适配要点: 在 Linux SPI 子系统中,通过 spi_transfer 结构体描述一次传输,包含 tx_buf、rx_buf、len、speed_hz、bits_per_word 等字段。CPOL 和 CPHA 则在 spi_device 的 mode 字段中设置。

1.6 本章小结

  • SPI 总线由摩托罗拉发明,四线制(SCLK / MOSI / MISO / CS)实现全双工通信。
  • 全双工意味着每个时钟周期同时完成发送和接收,无需方向切换。
  • 主设备控制时钟和片选,从设备被动响应;多个从设备通过独立 CS 线区分。
  • CPOL 和 CPHA 是 SPI 时序适配的核心参数,直接影响数据采样和驱动时刻。