1. SPI协议基础:总线工作原理与四线制信号时序

SPI(Serial Peripheral Interface,串行外设接口)是嵌入式系统中使用最广泛的同步全双工串行通信协议之一,由Motorola公司在20世纪80年代提出。它采用主从(Master-Slave)架构,通过四根信号线实现高速、低延迟的数据交换。理解SPI的底层工作原理、四线制时序以及全双工模式,是后续进行Linux驱动参数配置与调试优化的前提。

1.1 SPI总线物理层:四线制信号定义

标准的SPI总线使用四根信号线完成通信,每根线都有明确的角色和电气特性:

信号线 全称 方向(主设备视角) 功能描述
SCLK Serial Clock 输出 由主设备产生,同步所有数据传输;每个时钟周期传输1位数据
MOSI Master Out Slave In 输出 主设备发送数据到从设备的数据线
MISO Master In Slave Out 输入 从设备发送数据到主设备的数据线
CS Chip Select 输出 片选信号,低电平有效;主设备通过拉低CS选择特定的从设备
关键概念:SPI总线上的所有数据传输都由主设备控制的SCLK驱动。从设备不能主动发起通信,只能被动响应主设备的时钟信号。CS信号实现了多从设备共享同一组SCLK/MOSI/MISO总线的能力,每个从设备独占一根CS线。

1.2 四线制信号时序详解

SPI的通信过程围绕CS的下降沿开始、上升沿结束展开。一个完整的SPI传输事务包含以下时序阶段:

  1. CS拉低(下降沿):主设备将要通信的从设备对应的CS引脚从高电平拉至低电平,通知该从设备准备接收数据。
  2. 时钟启动与数据移位:主设备开始在SCLK线上产生连续的时钟脉冲。在每个时钟周期内,主设备通过MOSI线发送1位数据,同时从设备通过MISO线返回1位数据。
  3. 数据采样与更新:根据SPI模式(CPOL/CPHA)的配置,数据在SCLK的上升沿或下降沿被采样,在相反的边沿被更新。
  4. CS拉高(上升沿):传输完成后,主设备将CS拉回高电平,结束本次事务,从设备停止驱动MISO线。
时序要点:SPI没有像I2C那样的设备地址帧和应答位,因此协议开销极低。CS的下降沿标志着传输开始,CS的上升沿标志着传输结束。在CS有效期间,SCLK必须连续且稳定。
SPI四线制信号时序图 SPI四线制信号时序图(CPOL=0, CPHA=0) CS 下降沿(开始) 上升沿(结束) SCLK T1 T2 T3 T4 T5 T6 T7 T8 MOSI bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 MISO bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 采样点(上升沿) 说明:CS拉低后,SCLK产生8个时钟周期;每个周期MOSI和MISO同时传输1位数据,实现全双工通信

1.3 全双工通信模式解析

SPI最显著的特性是全双工(Full-Duplex)通信,即在同一时刻,数据可以在两个方向上同时传输。这与半双工协议(如I2C、单线UART)有本质区别。

1.3.1 全双工的工作原理

在SPI的每个时钟周期内,主设备通过MOSI线发送1位数据到从设备,同时从设备通过MISO线发送1位数据到主设备。这种并行传输机制使得SPI的吞吐量是同等时钟频率下半双工协议的两倍。

  • 移位寄存器机制:主设备和从设备内部各有一个8位(或16位)的移位寄存器。时钟每触发一次,两个寄存器同时左移或右移一位,高位数据从MOSI/MISO线输出,低位数据从对方移入。
  • 数据交换的对称性:主设备发送一个字节的同时,必然接收一个字节。即使从设备没有有效数据返回,MISO线上也会返回一个默认值(通常为0xFF或0x00)。
  • 无帧间隙:在CS有效期间,数据可以连续传输,不需要像I2C那样插入应答位或起始/停止条件。
驱动开发启示:在Linux SPI驱动中,spi_transfer结构体同时包含tx_buf和rx_buf指针。如果只需要发送数据而不关心接收,可以将rx_buf设为NULL,但底层硬件仍然会在MISO线上采样数据,只是驱动层丢弃了接收值。反之,如果只接收不发送,tx_buf为NULL时,主设备会发送全0或全1的填充数据。

1.3.2 全双工 vs 半双工对比

特性 SPI(全双工) I2C(半双工) UART(全双工)
数据方向 同时双向 分时双向 同时双向
时钟线 独立SCLK SCL(主设备产生) 无(异步)
数据线数量 2(MOSI + MISO) 1(SDA,开漏) 2(TX + RX)
协议开销 极低(无地址/应答) 高(地址+应答+起停) 低(起止位)
典型速率 10-80 MHz 100 kHz - 3.4 MHz 115200 bps - 10 Mbps
多从设备支持 每设备一根CS 7位/10位地址 点对点

1.4 SPI通信模式:CPOL与CPHA

SPI协议定义了4种通信模式,由时钟极性(CPOL)和时钟相位(CPHA)两个参数决定。这两个参数直接影响数据采样和更新的时序,是驱动配置中的关键参数。

模式 CPOL CPHA 时钟空闲电平 数据采样边沿 数据更新边沿
Mode 0 0 0 低电平 上升沿 下降沿
Mode 1 0 1 低电平 下降沿 上升沿
Mode 2 1 0 高电平 上升沿 下降沿
Mode 3 1 1 高电平 下降沿 上升沿
常见配置陷阱:大多数SPI从设备默认使用Mode 0(CPOL=0, CPHA=0),但部分传感器或ADC芯片可能使用Mode 3。在Linux设备树中,spi-cpol和spi-cpha属性必须与从设备数据手册严格匹配。配置错误会导致数据移位或采样错误,表现为通信数据全为0或随机值。
SPI四种模式(CPOL/CPHA)时序对比 Mode 0 (CPOL=0, CPHA=0) 空闲低,上升沿采样 Mode 1 (CPOL=0, CPHA=1) 空闲低,下降沿采样 ← 上一章 📖 返回目录 下一章 →