3. SPI硬件接口理解
SPI(Serial Peripheral Interface)是一种全双工、同步、主从架构的串行通信协议,广泛应用于嵌入式系统中连接传感器、ADC/DAC、存储器及显示控制器。在 QNX 驱动开发中,正确理解 SPI 的硬件接口参数是配置 DMA 传输和调试通信故障的前提。本节将深入解析 SPI 的主从模式、时钟极性(CPOL)与相位(CPHA)组合、以及数据帧格式,并结合实际案例说明参数配置的要点。
3.1 SPI 主从模式与信号线定义
SPI 总线采用主设备(Master)控制时钟和片选,从设备(Slave)响应通信的机制。一个典型的 SPI 连接包含四条信号线:
| 信号线 | 全称 | 方向(主设备视角) | 功能描述 |
|---|---|---|---|
| SCLK | Serial Clock | 输出 | 由主设备产生,同步数据传输的时钟信号 |
| MOSI | Master Out Slave In | 输出 | 主设备发送数据至从设备 |
| MISO | Master In Slave Out | 输入 | 从设备发送数据至主设备 |
| CS/SS | Chip Select / Slave Select | 输出 | 主设备选择目标从设备,低电平有效 |
下图展示了一个主设备与两个从设备的典型 SPI 总线拓扑结构:
3.2 时钟极性(CPOL)与相位(CPHA)
SPI 协议通过时钟极性(CPOL)和时钟相位(CPHA)定义数据采样与切换的时序关系。这两个参数组合成四种模式(Mode 0 ~ Mode 3),决定了 SCLK 空闲电平以及数据在时钟边沿的采样时刻。
| SPI 模式 | CPOL | CPHA | 空闲时钟电平 | 数据采样边沿 | 数据切换边沿 |
|---|---|---|---|---|---|
| Mode 0 | 0 | 0 | 低电平 | 上升沿 | 下降沿 |
| Mode 1 | 0 | 1 | 低电平 | 下降沿 | 上升沿 |
| Mode 2 | 1 | 0 | 高电平 | 下降沿 | 上升沿 |
| Mode 3 | 1 | 1 | 高电平 | 上升沿 | 下降沿 |
下图以 Mode 0(CPOL=0, CPHA=0)和 Mode 3(CPOL=1, CPHA=1)为例,展示时钟与数据线的时序关系:
3.3 数据帧格式:字长、位序与传输顺序
SPI 数据帧格式定义了每次传输的数据单元结构,主要包括字长(Word Length)、位序(Bit Order)和传输顺序(Transfer Sequence)。这些参数直接影响 DMA 传输的数据组织方式。
3.3.1 字长(Word Length)
SPI 协议支持可变的字长,常见配置为 8 位、16 位或 32 位。字长决定了每次 CS 有效期间传输的数据位数。在 QNX SPI 驱动中,字长通过控制器寄存器配置,例如 i.MX8 ECSPI 的 CONREG 字段 BURST_LEN 设置传输位数。
3.3.2 位序(Bit Order)
位序定义数据在 MOSI/MISO 线上传输时,高位(MSB)还是低位(LSB)先发送。大多数 SPI 设备默认使用 MSB First,但部分设备(如某些 EEPROM 或 LCD 控制器)要求 LSB First。
| 位序模式 | 传输顺序 | 典型应用 |
|---|---|---|
| MSB First | bit[7] → bit[6] → ... → bit[0] | 大多数 SPI Flash、ADC、传感器 |
| LSB First | bit[0] → bit[1] → ... → bit[7] | 部分 LCD 控制器、特定协议芯片 |
3.3.3 传输顺序与数据对齐
当使用 DMA 进行多字传输时,数据在内存中的排列方式必须与 SPI 控制器的 FIFO 宽度对齐。例如,配置 16 位字长时,DMA 描述符应指向 16 位对齐的缓冲区,且传输计数以字为单位。
下图展示了一个 16 位字长、MSB First 的 SPI 数据帧结构:
3.4 参数配置调试案例:SPI 模式不匹配导致通信失败
在实际 QNX 驱动调试中,SPI 参数配置错误是最常见的故障原因之一。以下是一个典型的调试案例:
调试步骤:
- 检查硬件连接:使用示波器测量 SCLK、MOSI、MISO 和 CS 信号,确认信号电平正常,CS 有效期间波形完整。
- 核对 SPI 模式:查阅 ADXL345 数据手册,要求 SPI Mode 3(CPOL=1, CPHA=1)。检查驱动配置,发现误配置为 Mode 0(CPOL=0, CPHA=0)。