Linux驱动SPI总线实战:设备树描述与数据收发实现 - 第1节

1.1 SPI总线历史

SPI(Serial Peripheral Interface,串行外设接口)由摩托罗拉(Motorola)公司在20世纪80年代中期提出,最初用于其MC68000系列微控制器与外围芯片之间的短距离高速通信。与同期流行的I²C总线相比,SPI以全双工、高速率、简单协议栈为设计目标,迅速成为嵌入式系统中传感器、ADC/DAC、存储器(EEPROM/Flash)、显示驱动、无线收发器等外设的标准接口之一。

时间节点 里程碑事件 关键特性
1985年前后 摩托罗拉推出SPI规范 4线制、全双工、主从架构
1990年代 各大半导体厂商广泛采纳 成为MCU标配外设接口
2000年代 Linux内核引入SPI子系统 统一驱动框架,支持设备树
2010年代至今 SPI协议扩展(Dual/Quad SPI) 高速Flash、FPGA配置、MEMS传感器
要点:SPI从未像I²C那样形成统一的国际标准组织规范,各厂商在时序参数、命令集上存在差异,但电气和协议基础高度兼容,这为Linux SPI子系统带来了“控制器驱动 + 通用设备驱动”的分层设计思路。

1.2 SPI总线物理层特性

1.2.1 信号线定义

标准SPI总线使用4根信号线(4-wire模式),在高速或远距离场景下可扩展为6线(增加中断和复位)。

  • SCLK(Serial Clock):由主设备驱动,决定数据传输速率。
  • MOSI(Master Out Slave In):主设备输出,从设备输入。
  • MISO(Master In Slave Out):主设备输入,从设备输出。
  • CS/SS(Chip Select / Slave Select):由主设备控制,低电平有效,选中特定从设备。
物理层关键参数:
• 最大速率:典型10~50 MHz,高速器件可达100 MHz以上。
• 电平标准:3.3V为主流,兼容1.8V/5V(需电平转换)。
• 驱动能力:CMOS推挽输出,扇出能力取决于走线长度和负载电容。
• 抗干扰:差分SPI(如LVDS SPI)用于长距离或高噪声环境。

1.2.2 多从设备拓扑

SPI总线支持一主多从,每个从设备独占一根CS线,SCLK、MOSI、MISO共享。从设备数量受限于主设备的CS引脚数量和总线负载电容。

SPI 一主多从拓扑结构 主设备 (Master) 从设备1 (Slave) 从设备2 (Slave) 从设备3 (Slave) SCLK MOSI MISO CS1/CS2/CS3 拓扑要点 • 每个从设备独占一根CS线 • SCLK/MOSI/MISO 共享 • 从设备数量受限于CS引脚 • 总线电容限制总速率

1.3 SPI总线协议基础

1.3.1 工作模式:CPOL与CPHA

SPI协议通过时钟极性(CPOL)和时钟相位(CPHA)的组合定义4种工作模式。CPOL决定SCLK空闲电平,CPHA决定数据采样边沿。

模式 CPOL CPHA 空闲时钟电平 数据采样边沿 典型应用
模式0 0 0 低电平 上升沿采样 最常用,兼容性最好
模式1 0 1 低电平 下降沿采样 部分ADC器件
模式2 1 0 高电平 下降沿采样 某些存储器
模式3 1 1 高电平 上升沿采样 高速Flash、FPGA配置
驱动开发注意:主设备和从设备必须工作在相同的SPI模式下,否则数据采样会错位,导致通信失败。Linux SPI子系统通过设备树中的 spi-cpol 和 spi-cpha 属性指定模式。

1.3.2 数据收发流程

SPI数据收发是同步全双工过程:主设备每输出一个时钟脉冲,MOSI线发送1位数据,同时MISO线接收1位数据。一次传输以CS拉低开始,以CS拉高结束。

SPI 模式0 数据收发时序 CS SCLK MOSI D7 D6 D5 D4 D3 D2 D1 D0 MISO D7 D6 D5 D4 D3 D2 D1 D0 ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ 上升沿采样 模式0 特点 • CPOL=0:空闲低电平 • CPHA=0:上升沿采样 • 下降沿数据变化

1.3.3 传输单位与数据格式

SPI传输的基本单位是字节(8位),但许多控制器支持可编程字长(4~16位)。数据通常以MSB(最高有效位)优先传输,部分器件支持LSB优先。

数据收发关键步骤:
  1. 主设备拉低CS,选中从设备。
  2. 主设备输出SCLK时钟,同时通过MOSI发送数据。
  3. 从设备在采样边沿读取MOSI数据,同时在MISO上输出响应数据。
  4. 传输完成后,主设备拉高CS,释放从设备。

1.3.4 SPI与I²C对比

特性 SPI I²C
信号线数量 4线(SCLK, MOSI, MISO, CS) 2线(SCL, SDA)
通信方式 全双工 半双工
最大速率 典型10~50 MHz,可达100 MHz+ 标准100 kHz,快速400 kHz,高速3.4 MHz
从设备选择 硬件CS引脚,独立片选 软件地址(7位或10位)
协议复杂度 简单,无内置应答机制 较复杂,包含应答、仲裁、时钟拉伸
功耗 较高(推挽输出) 较低(开漏输出)
多主支持 不原生支持 原生支持多主仲裁
典型应用 高速ADC/DAC、Flash、传感器、显示 EEPROM、温度传感器、RTC、低速外设
选型建议:在Linux驱动开发中,SPI适合对速率和实时性要求高的场景;I²C适合引脚受限、多设备挂载、功耗敏感的场合。两者在设备树中的描述方式有显著差异,后续章节将详细展开。

1.4 本章小结

SPI总线以其全双工、高速、简单协议的特点,在嵌入式系统中占据重要地位。物理层采用主从架构,通过4根信号线实现点对多点的可靠通信。协议层通过CPOL/CPHA组合定义4种工作模式,数据收发以字节为单位、MSB优先、同步全双工进行。理解这些基础概念,是后续学习Linux SPI子系统架构、设备树绑定和驱动编写的必要前提。