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)用于长距离或高噪声环境。
• 最大速率:典型10~50 MHz,高速器件可达100 MHz以上。
• 电平标准:3.3V为主流,兼容1.8V/5V(需电平转换)。
• 驱动能力:CMOS推挽输出,扇出能力取决于走线长度和负载电容。
• 抗干扰:差分SPI(如LVDS SPI)用于长距离或高噪声环境。
1.2.2 多从设备拓扑
SPI总线支持一主多从,每个从设备独占一根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拉高结束。
1.3.3 传输单位与数据格式
SPI传输的基本单位是字节(8位),但许多控制器支持可编程字长(4~16位)。数据通常以MSB(最高有效位)优先传输,部分器件支持LSB优先。
数据收发关键步骤:
- 主设备拉低CS,选中从设备。
- 主设备输出SCLK时钟,同时通过MOSI发送数据。
- 从设备在采样边沿读取MOSI数据,同时在MISO上输出响应数据。
- 传输完成后,主设备拉高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子系统架构、设备树绑定和驱动编写的必要前提。