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 全双工数据传输过程:
全双工 vs 半双工: 与 I²C 或单线 UART 不同,SPI 不需要切换数据方向。主设备发送数据的同时就能收到从设备的应答或数据,这对传感器读取、Flash 编程等场景非常有利。
1.4 SPI 系统架构与主从关系
一个典型的 SPI 系统包含一个主设备(Master)和多个从设备(Slave)。主设备负责产生时钟信号并控制片选线,从设备在片选有效时响应主设备的时钟和数据。
常见误区: 多个从设备共享 MOSI/MISO/SCLK 时,必须确保未选中的从设备 MISO 引脚输出高阻态(Hi-Z),否则多个从设备同时驱动 MISO 会导致总线冲突,严重时可能损坏引脚。
1.5 SPI 通信流程与数据帧结构
一次完整的 SPI 传输遵循以下步骤:
- 片选拉低: 主设备将目标从设备的 CS 引脚从高电平拉至低电平,激活从设备。
- 时钟启动: 主设备开始产生 SCLK 时钟信号,频率由 SPI 时钟分频器决定。
- 数据移位: 每个时钟周期,主设备通过 MOSI 移出 1 bit,同时从设备通过 MISO 移出 1 bit。
- 帧结束: 传输完指定字节数后,主设备停止 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 时序适配的核心参数,直接影响数据采样和驱动时刻。