嵌入式笔记系列——SPI
SPI(串行外设接口)是一种高速同步串行通信协议,采用4线制(SCK、MOSI、MISO、CS)实现全双工通信。它具有主从架构,支持一主多从模式,提供四种通信模式(CPOL/CPHA组合)。SPI无固定帧格式,数据长度通常为8或16位,通信速度快但距离短。相比I2C,SPI引脚更多但速度更快,硬件实现简单但缺乏错误检测机制,广泛应用于Flash、传感器等外设连接。配置需匹配时钟频率、数据位长、模式
SPI(Serial Peripheral Interface)详解
一、SPI 概述
SPI(Serial Peripheral Interface)是一种同步串行通信协议,由摩托罗拉公司开发,广泛应用于嵌入式系统中连接微控制器与外围设备(如传感器、存储器、显示模块等)。SPI 以其高速、全双工、简单硬件实现的特点而著称。
二、物理连接
SPI 通常使用4 根信号线(有时可简化):
| 信号线 | 全称 | 说明 |
|---|---|---|
| SCK | Serial Clock | 时钟信号,由主机产生 |
| MOSI | Master Out Slave In | 主机发送,从机接收 |
| MISO | Master In Slave Out | 主机接收,从机发送 |
| CS/SS | Chip Select / Slave Select | 片选信号,由主机控制,低电平有效 |
🔹 注意:SPI 是主从架构,支持一主多从(每个从机需一个独立的 CS 线)。
三、通信时序与模式
1.通信时序
!
2.一主对多从的连接方式
2.1 多NSS

- 原理:每个从设备都有独立的CS线,主机通过拉低相应从设备的CS线来选中该设备进行通信。
- 优点:
- 控制简单:主机可以直接通过控制相应从设备的CS线来选择通信对象,无需复杂的协议或地址识别。
- 并行操作:可以同时选中多个从设备,实现并行操作,提高通信效率。
- 通用性强:适用于大多数支持SPI协议的从设备,无需对设备进行特殊配置。
- 缺点:
- 占用IO口多:每增加一个从设备,就需要占用一个额外的CS线,对于IO口资源有限的主机设备,可能会造成资源紧张。
- 布线复杂:随着从设备数量的增加,布线的复杂度也会相应提高。
2.2 菊花链

- 原理:将多个从设备串联起来,主机通过控制一个公共的CS线,将数据依次传输给各个从设备。
- 优点:
- 节省IO口:只需要一个CS线即可控制多个从设备,大大节省了主机的IO口资源。
- 布线简单:从设备之间的连接简单,只需将数据线依次连接即可。
- 缺点:
- 控制复杂:需要在数据中包含地址或命令来指定通信的从设备,增加了通信协议的复杂性。
- 速度受限:由于数据需要依次传输给各个从设备,通信速度会受到一定影响,不适用于对实时性要求较高的场景。
- 可靠性低:如果某个从设备出现故障,可能会影响整个通信链路的正常工作。
两种方式对比:
| 特性 | 独立片选 | 菊花链 |
|---|---|---|
| 控制方式 | 主机通过独立的CS线控制每个从设备 | 主机通过一个公共的CS线控制所有从设备,数据依次传输给各个从设备 |
| IO口占用 | 每增加一个从设备占用一个额外的CS线 | 只需要一个CS线 |
| 布线复杂度 | 随着从设备数量增加而提高 | 从设备之间连接简单 |
| 通信效率 | 可以并行操作多个从设备,效率较高 | 数据依次传输,效率相对较低 |
| 通用性 | 适用于大多数SPI从设备 | 需要从设备支持菊花链模式 |
| 可靠性 | 单个从设备故障不影响其他设备 | 一个从设备故障可能影响整个链路 |
SPI 的通信时序由时钟极性(CPOL) 和时钟相位(CPHA) 两个参数决定,组合成四种模式:
| 模式 | CPOL | CPHA | 说明 |
|---|---|---|---|
| 0 | 0 | 0 | 时钟空闲为低,数据在第一个边沿采样 |
| 1 | 0 | 1 | 时钟空闲为低,数据在第二个边沿采样 |
| 2 | 1 | 0 | 时钟空闲为高,数据在第一个边沿采样 |
| 3 | 1 | 1 | 时钟空闲为高,数据在第二个边沿采样 |
🔹 常用模式为 Mode 0 和 Mode 3。
四、数据帧格式
SPI 没有固定的数据帧格式,数据长度通常为 8 位或 16 位,也可配置为其他长度(如 12 位)。数据传输是全双工的,即主机在发送数据的同时也在接收数据。
五、通信流程(以 8 位数据为例)
- 主机拉低对应从机的 CS 信号,选中从机。
- 主机产生时钟信号 SCK,按照设定的模式(CPOL/CPHA)输出时钟。
- 主机通过 MOSI 发送数据位,同时从机通过 MISO 返回数据。
- 数据传输完成后,主机拉高 CS,结束通信。
六、配置参数(主机需与从设备一致)
| 参数 | 说明 |
|---|---|
| 时钟频率 | SCK 的频率,通常可配置 |
| 数据位长度 | 每次传输的数据位数(如 8 bits) |
| 时钟模式 | CPOL 和 CPHA 的组合(模式 0~3) |
| 字节序 | MSB First 或 LSB First |
七、优缺点对比
| 优点 | 缺点 |
|---|---|
| 全双工高速通信 | 需要较多引脚(每从机需一个 CS) |
| 硬件实现简单,无需波特率 | 无硬件错误检测机制 |
| 支持多从机 | 通信距离短(板级或短距离通信) |
| 时钟频率灵活可调 | 无标准协议,依赖设备手册 |
八、实际应用示例
- MCU ↔ Flash 存储器(如 W25Q64)
- MCU ↔ 显示屏(如 OLED、TFT)
- MCU ↔ 传感器(如 IMU、温度传感器)
- MCU ↔ 音频编解码器(如 VS1053)
九、SPI 变种与扩展
- Dual SPI / Quad SPI:使用更多数据线提高传输速率。
- QSPI:用于 Flash 存储器,支持四线模式。
- 3-Wire SPI:半双工模式,共用数据线。
十、嵌入式面试常见问题(SPI 部分)
1. SPI 和 I2C 的区别?
| 特性 | SPI | I2C |
|---|---|---|
| 线路数量 | 4 线(+每从机一条 CS) | 2 线(SDA, SCL) |
| 通信方式 | 全双工 | 半双工 |
| 速度 | 高(可达几十 MHz) | 中低速(通常 ≤ 400 kHz) |
| 硬件复杂度 | 简单 | 较复杂(需上拉电阻) |
| 多从机支持 | 每个从机需一个 CS | 地址寻址,支持多从机 |
2. SPI 的四种模式如何选择?
- 根据从设备的数据手册选择对应的 CPOL 和 CPHA。
- 常见设备如 Flash 多用 Mode 0 或 Mode 3。
3. 如何实现 SPI 多从机通信?
- 每个从机使用一个独立的 CS 引脚。
- 主机通过拉低对应从机的 CS 来选中设备。
4. SPI 最高速度受什么限制?
- 主机 SCK 输出能力。
- 从设备最大支持频率。
- PCB 布线长度和信号完整性。
5. 如何用 GPIO 模拟 SPI?
- 可用任意 GPIO 模拟 SCK、MOSI、MISO、CS。
- 需软件控制时序,适用于低速或调试场景。
十一、代码示例(STM32 HAL 库)
// SPI 初始化配置
SPI_HandleTypeDef hspi;
hspi.Instance = SPI1;
hspi.Init.Mode = SPI_MODE_MASTER;
hspi.Init.Direction = SPI_DIRECTION_2LINES;
hspi.Init.DataSize = SPI_DATASIZE_8BIT;
hspi.Init.CLKPolarity = SPI_POLARITY_LOW; // CPOL = 0
hspi.Init.CLKPhase = SPI_PHASE_1EDGE; // CPHA = 0
hspi.Init.NSS = SPI_NSS_SOFT;
hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
hspi.Init.FirstBit = SPI_FIRSTBIT_MSB;
HAL_SPI_Init(&hspi);
// 发送并接收一字节数据
uint8_t tx_data = 0xA5;
uint8_t rx_data;
HAL_SPI_TransmitReceive(&hspi, &tx_data, &rx_data, 1, HAL_MAX_DELAY);
十二、总结(一句话记忆)
SPI 是“四线同步、全双工、主从式”的串行通信协议,通过 SCK、MOSI、MISO 和 CS 线实现高速设备间通信,需配置时钟模式、频率和数据位长度。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐

所有评论(0)