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 输出 主设备选择目标从设备,低电平有效
驱动开发提示:在 QNX 的 SPI 驱动中,主设备通常由 SPI 控制器硬件(如 i.MX8 的 ECSPI、TI AM65x 的 MCSPI)承担。驱动初始化时需配置控制器为主模式,并设置片选极性(CS 高有效或低有效)。从设备模式在嵌入式系统中较少使用,但在多主设备仲裁场景中可能出现。

下图展示了一个主设备与两个从设备的典型 SPI 总线拓扑结构:

SPI 主从模式总线拓扑 SPI 主设备 (Master Controller) 从设备 1 (Slave) 从设备 2 (Slave) SPI 总线信号 SCLK MOSI MISO CS1 CS2 拓扑说明 主设备共享 SCLK、 MOSI、MISO 总线 每个从设备独立 CS 全双工同时收发

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 高电平 上升沿 下降沿
关键理解:CPOL 决定时钟空闲状态,CPHA 决定数据在哪个时钟边沿被采样。主设备和从设备必须工作在相同的 SPI 模式下,否则通信将完全失败。在 QNX 驱动中,模式配置通常通过 SPI 控制器的寄存器字段(如 i.MX8 ECSPI 的 CONREG 中的 SCLKPOL 和 SCLK_PHASE)实现。

下图以 Mode 0(CPOL=0, CPHA=0)和 Mode 3(CPOL=1, CPHA=1)为例,展示时钟与数据线的时序关系:

SPI 时钟极性与相位时序图(Mode 0 vs Mode 3) SPI 时序:Mode 0 (CPOL=0, CPHA=0) 与 Mode 3 (CPOL=1, CPHA=1) Mode 0 SCLK ↑采样 ↑采样 ↑采样 ↑采样 MOSI D0 D1 D2 D3 D4 D5 D6 Mode 3 SCLK ↑采样 ↑采样 ↑采样 MOSI D0 D1 D2 D3 D4 D5 D6 时序对比要点 Mode 0:空闲低电平,上升沿采样数据,下降沿切换数据 | Mode 3:空闲高电平,上升沿采样数据,下降沿切换数据 两种模式采样边沿相同(上升沿),但空闲电平相反,驱动配置时需严格匹配从设备数据手册

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 位对齐的缓冲区,且传输计数以字为单位。

常见配置陷阱:在 QNX 驱动调试中,字长配置错误会导致数据移位或丢失。例如,将从设备要求的 16 位字长误配为 8 位,则每个字节会被当作独立传输,CS 信号可能在每个字节后释放,导致从设备解析错误。务必核对从设备数据手册中的字长要求。

下图展示了一个 16 位字长、MSB First 的 SPI 数据帧结构:

SPI 16 位数据帧格式(MSB First) SPI 16 位数据帧格式(MSB First) CS 低电平有效 SCLK MOSI 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 高位字节(bit[15:8])先传输,低位字节(bit[7:0])后传输 DMA 传输时,内存缓冲区应按 16 位对齐,且每个字对应一次 CS 有效周期

3.4 参数配置调试案例:SPI 模式不匹配导致通信失败

在实际 QNX 驱动调试中,SPI 参数配置错误是最常见的故障原因之一。以下是一个典型的调试案例:

案例背景:某项目使用 i.MX8M Plus 处理器通过 SPI 与 ADXL345 加速度传感器通信。驱动初始化后,读取传感器 ID 寄存器始终返回 0xFF,而非预期的 0xE5。

调试步骤:

  1. 检查硬件连接:使用示波器测量 SCLK、MOSI、MISO 和 CS 信号,确认信号电平正常,CS 有效期间波形完整。
  2. 核对 SPI 模式:查阅 ADXL345 数据手册,要求 SPI Mode 3(CPOL=1, CPHA=1)。检查驱动配置,发现误配置为 Mode 0(CPOL=0, CPHA=0)。