1. 什么是 SPI?
SPI (Serial Peripheral Interface) 是一种同步串行通信接口规范,主要用于微控制器(MCU/SoC)与各种外围设备(如传感器、Flash 存储器、RTC、ADC/DAC、显示屏等)之间的短距离通信。
它由摩托罗拉(Motorola)在 1980 年代中期开发,现已成为事实上的工业标准。
2. 接口信号
标准的 SPI 总线通常使用 4 条信号线:
- SCLK (Serial Clock):时钟信号,由主设备(Master)产生。
- MOSI (Master Out Slave In):主设备输出,从设备输入数据线。
- MISO (Master In Slave Out):主设备输入,从设备输出数据线。
- CS / SS (Chip Select / Slave Select):片选信号,通常由主设备控制,低电平有效。用于选择与之通信的从设备。
注:在某些文档中,MOSI 可能被称为 SDO (Serial Data Out),MISO 被称为 SDI (Serial Data In),具体取决于设备的角色。
3. 通信特点
- 主从模式 (Master-Slave):总线上有一个主设备和从设备。主设备控制时钟(SCLK)和片选(CS)。
- 同步通信:数据传输与时钟信号同步。
- 全双工 (Full Duplex):数据可以在两个方向上同时传输。在每个时钟周期,主设备发送一位数据,同时接收一位数据。
- 总线拓扑:
- 独立片选:每个从设备有独立的 CS 线。主设备拉低特定从设备的 CS 线来选择它。
- 菊花链 (Daisy Chain):较少见,设备级联。
4. 时钟极性和相位 (CPOL & CPHA)
SPI 定义了 4 种工作模式,由 时钟极性 (CPOL) 和 时钟相位 (CPHA) 决定。主从设备必须工作在相同的模式下才能正常通信。
- CPOL (Clock Polarity):决定空闲状态时的时钟电平。
- CPOL=0:空闲时 SCLK 为低电平。
- CPOL=1:空闲时 SCLK 为高电平。
- CPHA (Clock Phase):决定数据在哪个时钟沿采样。
- CPHA=0:在第 1 个跳变沿(前沿)采样数据,在第 2 个跳变沿(后沿)更改数据。
- CPHA=1:在第 1 个跳变沿(前沿)更改数据,在第 2 个跳变沿(后沿)采样数据。
四种模式总结:
| 模式 | CPOL | CPHA | 描述 |
|---|---|---|---|
| Mode 0 | 0 | 0 | 空闲低电平,上升沿采样,下降沿切换 |
| Mode 1 | 0 | 1 | 空闲低电平,上升沿切换,下降沿采样 |
| Mode 2 | 1 | 0 | 空闲高电平,下降沿采样,上升沿切换 |
| Mode 3 | 1 | 1 | 空闲高电平,下降沿切换,上升沿采样 |
Mode 0 和 Mode 3 是最常用的模式。
5. 数据传输时序
以 Mode 0 (CPOL=0, CPHA=0) 为例:
- CS 拉低:主设备将目标从设备的 CS 线拉低,选中该设备。
- SCLK 产生:主设备开始产生时钟信号。
- 数据传输:
- 在 SCLK 的上升沿,主设备读取 MISO 上的数据,从设备读取 MOSI 上的数据(采样)。
- 在 SCLK 的下降沿,主设备和从设备更新各自的数据输出(切换)。
- CS 拉高:传输结束后,主设备将 CS 线拉高,结束通信。
6. 优缺点
优点:
- 全双工通信,速度快(可达数十 MHz)。
- 协议简单,硬件实现容易(移位寄存器)。
- 没有复杂的寻址机制,通过片选线物理选择设备。
- 数据位宽灵活(通常 8 位,但也可以是 12、16 位等)。
缺点:
- 占用引脚多(每个从设备需要一根额外的 CS 线)。
- 没有标准的流控和应答机制(ACK),无法确认数据是否被正确接收。
- 通常仅限于短距离板级通信。
7. Linux 中的 SPI
在 Linux 内核中,SPI 子系统负责管理 SPI 控制器和设备。
- SPI Controller Driver:驱动 SoC 上的 SPI 控制器硬件。
- SPI Device Driver:驱动连接在 SPI 总线上的具体外设(如屏幕、传感器)。
- SPI Core:提供通用的 API 和框架,连接控制器驱动和设备驱动。