1. SPI基础:协议概述与四线制全双工通信
SPI(Serial Peripheral Interface,串行外设接口)由 Motorola 公司于 20 世纪 80 年代提出,是一种高速、全双工、同步的串行通信总线。在车载嵌入式系统中,SPI 广泛用于 MCU 与传感器(加速度计、陀螺仪)、ADC/DAC、数字电位器、CAN 控制器、外部 Flash 以及显示驱动芯片之间的短距离板级通信。
1.1 四线制信号定义与功能
标准 SPI 总线使用四条信号线完成主从设备之间的数据交换,每条线在通信过程中承担唯一且不可替代的角色:
| 信号线 | 全称 | 方向(主→从) | 核心功能 |
|---|---|---|---|
| SCLK | Serial Clock | 主→从 | 由主机产生,决定每一位数据的采样与切换时刻 |
| MOSI | Master Out Slave In | 主→从 | 主机输出数据线,从机在该线上接收数据 |
| MISO | Master In Slave Out | 从→主 | 从机输出数据线,主机在该线上接收数据 |
| CS | Chip Select | 主→从 | 片选信号,低电平有效,选中特定从机开始通信 |
车载设计要点: 在车规级应用中,CS 信号通常需要额外的上拉电阻(4.7kΩ–10kΩ)以确保在 MCU 复位或未初始化期间从机不被误选。同时,SCLK 与 MOSI/MISO 之间的走线长度差应控制在 5mm 以内,以减少信号偏移(Skew)对高速时序的影响。
1.2 全双工通信原理
SPI 的全双工特性源于其独特的 移位寄存器对 架构。主机和从机内部各有一个相同位宽的移位寄存器(通常为 8 位或 16 位),通过 MOSI 和 MISO 两条独立的数据线连接成一个环形移位路径。
通信过程可分解为以下四个步骤:
- 片选激活: 主机将 CS 信号拉低,从机检测到片选有效后进入通信就绪状态。
- 时钟启动: 主机在 SCLK 线上产生连续的时钟脉冲,每个时钟周期完成一次数据交换。
- 数据移位: 在 SCLK 的每个有效边沿(上升沿或下降沿,由 CPOL/CPHA 决定),主机通过 MOSI 移出当前最高位,同时从机通过 MISO 移出自身寄存器的最高位。经过 8 个时钟周期后,主机的数据完全移入从机,从机的数据完全移入主机。
- 片选释放: 主机将 CS 拉高,结束本次通信事务。
关键理解: 全双工意味着“发送”与“接收”在同一个时钟周期内同时完成。主机发送一个字节的同时必然接收到一个字节——即使从机没有有效数据要返回,MISO 线上也会收到一个默认值(通常为 0x00 或 0xFF)。因此,SPI 的每次传输本质上是一次“交换”,而非单纯的“发送”或“接收”。
1.3 数据交换的微观时序
为了更精确地理解全双工的数据流动,下面以一次 8 位传输为例,展示 SCLK、MOSI 和 MISO 在时间轴上的对应关系。假设 SPI 模式 0(CPOL=0, CPHA=0),即 SCLK 空闲为低,数据在上升沿采样。
车载时序风险提示: 在高速 SPI(≥10 MHz)下,MOSI 数据必须在 SCLK 采样沿之前至少满足 tsu(建立时间)并保持 th(保持时间)。车规 MCU 通常要求 tsu ≥ 5 ns、th ≥ 2 ns。若 PCB 走线过长或阻抗不匹配,可能导致采样错误,引发传感器数据跳变或 Flash 写入失败。
1.4 SPI 与 I2C 的初步对比
作为本课程的开篇,有必要将 SPI 与另一常见总线 I2C 进行横向对比,帮助学员建立选型直觉:
| 特性 | SPI | I2C |
|---|---|---|
| 信号线数量 | 4 线(SCLK, MOSI, MISO, CS) | 2 线(SCL, SDA) |
| 通信模式 | 全双工 | 半双工 |
| 从机选择 | 独立 CS 线(硬件片选) | 地址寻址(7 位或 10 位) |
| 典型速率 | 1–50 MHz | 100 kHz–1 MHz(标准/快速模式) |
| 总线仲裁 | 不支持(一主多从需独立 CS) | 支持多主机仲裁 |
| 车载典型应用 | ADC、DAC、Flash、传感器、显示驱动 | 温度传感器、EEPROM、PMIC 配置 |
选型建议: 在车载项目中,若外设需要高速连续数据流(如加速度计以 10 kHz 输出 16 位数据),优先选择 SPI;若仅需低速、间歇性配置寄存器(如 PMIC 电压设置),I2C 可节省 GPIO 引脚并简化布线。