一、SPI协议概述
SPI(Serial Peripheral Interface,串行外设接口)是一种同步串行通信协议,由Motorola公司(现为NXP半导体的一部分)在1980年代中期开发。它因其简单性、高效性和灵活性而在嵌入式系统中得到广泛应用。
1.1 SPI的基本特点
SPI协议具有以下几个显著特点:
-
全双工通信:可以同时发送和接收数据
-
同步传输:使用时钟信号同步数据传输
-
高速传输:相比I2C等协议,SPI可以达到更高的传输速率
-
主从架构:由一个主设备控制通信,一个或多个从设备响应
-
硬件简单:接口信号线较少,硬件实现简单
-
无寻址机制:通过片选信号选择从设备
1.2 SPI的应用领域
SPI协议广泛应用于各种嵌入式系统和电子设备中,包括但不限于:
-
存储器(Flash、EEPROM)
-
传感器(温度、压力、加速度等)
-
显示设备(LCD、OLED)
-
无线通信模块(Wi-Fi、蓝牙)
-
模数/数模转换器(ADC/DAC)
-
数字信号处理器(DSP)
-
微控制器之间的通信
二、SPI的硬件接口
SPI协议使用4根基本信号线实现通信,有时会根据需要增加额外的信号线。
2.1 基本信号线
-
SCLK(Serial Clock):串行时钟信号,由主设备产生,用于同步数据传输
-
MOSI(Master Out Slave In):主设备输出,从设备输入的数据线
-
MISO(Master In Slave Out):主设备输入,从设备输出的数据线
-
SS/CS(Slave Select/Chip Select):从设备选择信号,低电平有效

2.2 信号线命名变体
不同厂商和文档中,SPI信号线可能有不同的命名方式:
-
MOSI也可能被称为SIMO、DO、DOUT、SDI等
-
MISO也可能被称为SOMI、DI、DIN、SDO等
-
SCLK也可能被称为SCK、CLK等
-
SS/CS也可能被称为nSS、STE等
2.3 多从设备连接方式
当系统中有多个从设备时,有两种常见的连接方式:
-
独立片选方式:每个从设备有独立的片选信号线,主设备通过不同的片选信号选择不同的从设备
-
菊花链方式:多个从设备串联连接,数据从一个设备传递到下一个设备
三、SPI的工作原理
3.1 数据传输机制
SPI协议基于移位寄存器原理工作。主设备和从设备各有一个移位寄存器,通过MOSI和MISO线连接形成一个循环移位寄存器。每个时钟周期,数据在主设备和从设备之间交换一位。
3.2 时钟极性和相位
SPI协议通过时钟极性(CPOL)和时钟相位(CPHA)两个参数定义了四种不同的数据传输模式:
-
模式0:CPOL=0,CPHA=0
-
时钟空闲状态为低电平
-
数据在时钟上升沿采样,下降沿变化
-
-
模式1:CPOL=0,CPHA=1
-
时钟空闲状态为低电平
-
数据在时钟下降沿采样,上升沿变化
-
-
模式2:CPOL=1,CPHA=0
-
时钟空闲状态为高电平
-
数据在时钟下降沿采样,上升沿变化
-
-
模式3:CPOL=1,CPHA=1
-
时钟空闲状态为高电平
-
数据在时钟上升沿采样,下降沿变化
-

3.3 数据帧格式
SPI协议没有严格定义数据帧格式,这通常由具体设备决定。常见的数据帧特征包括:
-
数据长度:通常为8位,但也可能是4-16位不等
-
传输顺序:MSB(最高有效位)先传或LSB(最低有效位)先传
-
是否有空闲位、起始位、停止位等
四、SPI协议的配置与操作
4.1 SPI初始化配置
在使用SPI接口前,需要进行以下配置:
-
设置SPI工作模式(主模式或从模式)
-
配置时钟极性和相位(CPOL和CPHA)
-
设置数据位宽(通常为8位)
-
设置数据传输顺序(MSB先或LSB先)
-
设置时钟频率(主模式下)
-
配置片选信号控制方式(硬件或软件控制)
4.2 SPI通信流程
典型的SPI通信流程如下:
-
主设备拉低目标从设备的片选信号(SS/CS)
-
主设备生成时钟信号(SCLK)
-
主设备通过MOSI线发送数据,同时从设备通过MISO线返回数据
-
数据传输完成后,主设备拉高片选信号
4.3 多从设备管理
在多从设备系统中:
-
独立片选方式:
-
每个从设备有独立的片选线
-
主设备通过拉低对应从设备的片选线来选择通信对象
-
同一时间只能有一个片选信号为低电平
-
-
菊花链方式:
-
从设备串联连接,数据从一个设备传递到下一个
-
只需要一个片选信号控制所有从设备
-
数据在多个设备间循环移位
-
五、SPI协议的优缺点分析
5.1 SPI协议的优点
-
全双工通信:可以同时发送和接收数据,提高效率
-
高速传输:没有严格的速率限制,通常可达几十MHz
-
简单灵活:协议简单,硬件实现容易
-
无地址开销:不需要像I2C那样发送地址信息
-
无仲裁机制:主设备完全控制通信,不会出现总线冲突
-
支持多从设备:可以通过多种方式连接多个从设备
5.2 SPI协议的缺点
-
引脚占用多:每个从设备需要单独的片选线,占用较多IO
-
无硬件错误检测:没有应答机制或CRC校验
-
无流控制:从设备无法控制主设备的传输速率
-
无标准规范:不同厂商实现可能有差异
-
距离受限:适合板级通信,不适合长距离传输
六、SPI协议的变体与扩展
6.1 标准SPI的局限性
标准SPI协议虽然简单高效,但在某些应用场景下存在不足:
-
缺少流控制机制
-
缺少错误检测机制
-
多从设备连接时引脚占用多
-
没有标准的电源管理功能
6.2 常见的SPI变体
-
Dual SPI:将MISO和MOSI都用作数据输出,提高读取速度
-
Quad SPI:使用4条数据线进行数据传输,大幅提高吞吐量
-
QPI(Quad Peripheral Interface):完全使用4线双向数据传输
-
Microwire:类似SPI但只有3线的简化版本
-
3-wire SPI:半双工模式,共用数据线
6.3 SPI与其他协议的比较
-
SPI vs I2C:
-
SPI速度更快,但引脚占用更多
-
I2C有地址机制和应答机制,但速度较慢
-
I2C支持多主设备,SPI只能是单主设备
-
-
SPI vs UART:
-
SPI是同步协议,UART是异步协议
-
SPI需要时钟线,UART不需要
-
UART通常用于点对点通信,SPI可支持多设备
-
-
SPI vs CAN:
-
CAN是专门为汽车和工业环境设计的协议
-
CAN有强大的错误检测和处理机制
-
SPI简单高效,适合板级通信
-
七、SPI协议的实现与应用实例
7.1 微控制器中的SPI实现
大多数现代微控制器都集成了SPI控制器,典型的SPI外设功能包括:
-
可配置为主模式或从模式
-
可编程的时钟极性和相位
-
可调的时钟频率(主模式下)
-
硬件片选信号生成
-
中断或DMA支持
-
多缓冲数据寄存器