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 0Mode 3


四、数据帧格式

SPI 没有固定的数据帧格式,数据长度通常为 8 位或 16 位,也可配置为其他长度(如 12 位)。数据传输是全双工的,即主机在发送数据的同时也在接收数据。


五、通信流程(以 8 位数据为例)

  1. 主机拉低对应从机的 CS 信号,选中从机。
  2. 主机产生时钟信号 SCK,按照设定的模式(CPOL/CPHA)输出时钟。
  3. 主机通过 MOSI 发送数据位,同时从机通过 MISO 返回数据。
  4. 数据传输完成后,主机拉高 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 线实现高速设备间通信,需配置时钟模式、频率和数据位长度。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐