
SPI 通信协议的基本概念和工作模式
2025-07-31 09:08:35
晨欣小编
在嵌入式系统和微控制器应用中,通信协议是不同芯片之间数据交互的基础。SPI(Serial Peripheral Interface,串行外设接口)是一种常用的同步串行通信协议,凭借其高速、全双工、结构简单的特点,广泛应用于MCU与外设(如Flash、AD/DA转换器、传感器、显示器等)之间的通信。
本文将系统阐述 SPI 协议的基本概念、信号线构成、工作原理、常见的通信模式及其优缺点,帮助读者全面理解该协议的核心机制,并为实际项目中的协议选型和调试提供理论依据。
二、SPI 的基本概念
SPI 协议由 Motorola 在上世纪80年代提出,是一种主从式、同步通信协议,具有以下基本特征:
全双工通信:可以同时进行发送和接收;
主从架构:通信总线上有一个主设备(Master)控制时钟,其余为从设备(Slave);
高速传输:比 I2C 更快,适合对速度有要求的应用场合;
硬件简单:无复杂握手机制,适合短距离设备间通信。
应用实例:
MCU 与 EEPROM 通信;
Raspberry Pi 控制 OLED 显示屏;
STM32 与温度传感器、AD模块之间的数据采集。
三、SPI 接口的基本信号线
典型 SPI 通信至少需要 4 条信号线:
信号线 | 全称 | 功能说明 |
---|---|---|
SCLK | Serial Clock | 串行时钟线,由主设备提供时钟信号 |
MOSI | Master Out Slave In | 主设备输出,从设备输入的数据线 |
MISO | Master In Slave Out | 主设备输入,从设备输出的数据线 |
SS/CS | Slave Select / Chip Select | 从设备使能线,低电平有效,主控用来选择特定从设备 |
四、SPI 的工作原理
SPI 通信依赖于主设备提供的 SCLK 时钟信号进行同步传输,数据以位为单位,按照时钟的上升沿或下降沿进行采样与传输。通信过程如下:
主机拉低目标从机的 CS 线;
主机发送数据至 MOSI 线,同时读取 MISO 上的返回数据;
从机在 SCLK 控制下同步接收并回应数据;
通信完成后主机释放 CS(拉高)终止此次通信。
这种设计使 SPI 具有以下优点:
实现简单,效率高;
传输速率可自由调节;
支持全双工操作。
五、SPI 的四种通信模式(CPOL 与 CPHA)
SPI 的工作模式由两个参数定义:
CPOL(Clock Polarity):时钟极性,决定空闲状态下的 SCLK 电平(0 = 低,1 = 高);
CPHA(Clock Phase):时钟相位,决定数据在时钟的哪个边沿采样(0 = 第一个边沿,1 = 第二个边沿)。
模式 | CPOL | CPHA | 空闲时钟电平 | 采样时钟边沿 |
---|---|---|---|---|
模式 0 | 0 | 0 | 低电平 | 第一个上升沿采样 |
模式 1 | 0 | 1 | 低电平 | 第二个下降沿采样 |
模式 2 | 1 | 0 | 高电平 | 第一个下降沿采样 |
模式 3 | 1 | 1 | 高电平 | 第二个上升沿采样 |
主从两端的模式必须一致;
常见芯片(如 Flash)说明书中会明确指定使用哪种 SPI 模式;
调试时常因 CPOL/CPHA 配置不匹配导致通信失败。
六、SPI 与其他通信协议对比
协议 | 接口引脚 | 通信速率 | 是否支持多主 | 是否支持多个从设备 | 是否需要地址管理 | 是否全双工 |
---|---|---|---|---|---|---|
SPI | ≥4 | 高(10+ Mbps) | 否 | 是(多个 CS 控制) | 否 | 是 |
I2C | 2 | 中(400kbps~1Mbps) | 是 | 是(地址唯一标识) | 是 | 否 |
UART | 2 | 中(几百Kbps~几Mbps) | 否 | 否(点对点) | 否 | 是 |
SPI 适合高速、结构明确的通信;
I2C 更适合多设备、低速、远距离通信场合;
UART 则更常用于点对点长距离通信或串口调试。
七、SPI 的优点与局限
✅ 优点:
通信速度快(可达几十 Mbps);
全双工传输;
协议简单,易于实现;
多个从设备可共用一组数据线;
低资源占用,常见 MCU 均支持。
❌ 缺点:
不支持多主模式;
需要额外的 CS 引脚控制多个从设备,扩展性差;
没有规定的通信标准帧格式,不适合远距离通信;
没有像 I2C 那样的应答机制,不利于错误检测。
八、典型应用场景
MCU 与 SPI Flash、EEPROM 之间的数据存储;
传感器模块(如温湿度、陀螺仪)通信;
TFT 显示屏控制;
音频 DAC、ADC 模块;
FPGA 与外围 SPI 器件交互。
SPI 在 STM32、Arduino、ESP32、Raspberry Pi 等平台上均有原生支持,且有丰富的驱动库和示例代码,便于快速开发。
九、实际开发中的注意事项
波特率配置:根据芯片手册确定从设备能支持的最高频率;
CPOL/CPHA 设置:通信失败常见原因,需与设备手册对照配置;
CS 控制逻辑:主机需确保每次通信前先拉低对应的 CS 引脚;
多设备干扰:注意总线长度、电平匹配、电磁兼容设计;
软件模拟 SPI(Bit-bang):当硬件 SPI 被占用,可用 GPIO 模拟实现。
十、结语
SPI 协议作为一种结构简洁、速率高效、易于实现的通信方式,在嵌入式系统中具有不可替代的作用。虽然其在多设备管理与通信可靠性方面存在一定限制,但在短距离、点对点高速通信场景中仍是优选方案。
掌握 SPI 的基本原理与工作模式,是每一位嵌入式开发工程师的必备技能。