🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习
🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发
❄️作者主页:一个平凡而乐于分享的小比特的个人主页
✨收录专栏:通信协议,本专栏为记录项目中用到的知识点,以及一些硬件常识总结
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

SPI通信协议全面详解
一、SPI协议简介
1.1 什么是SPI协议?
想象一下两个朋友要通过纸条传递信息,但需要确保信息传递的顺序和时机完全同步。SPI(Serial Peripheral Interface,串行外设接口) 就像这样一套精密的"同步传纸条系统",专门用于电子芯片之间高速、可靠的数据交换。
SPI的四大核心特征:

1.2 SPI的"四人工作组"
SPI通信最少需要4条线,就像一个有明确分工的四人工作组:
┌─────────────────┐ SPI通信工作组 ┌─────────────────┐
│ 主设备(队长) │ │ 从设备(队员) │
│ │ │ │
│ 🟢 MOSI 输出 │───────────▶ 🟢 数据接收 │ |
│ │ (主说,从听) │ │
│ │ │ │
│ 🟡 MISO 输入 │◀────────── 🟡 数据发送 │ |
│ │ (从说,主听) │ │
│ │ │ │
│ 🔵 SCK 指挥 │───────────▶ 🔵 节奏跟随 │ |
│ │ (统一节奏) │ │
│ │ │ │
│ 🔴 SS 点名 │───────────▶ 🔴 被点名 │ |
│ │ (选择对话者) │ │
└─────────────────┘ └─────────────────┘
各线路详细功能表:
| 线路名称 | 全称 | 方向 | 功能 | 类比 |
|---|---|---|---|---|
| MOSI | Master Out Slave In | 主→从 | 主设备发送数据给从设备 | 队长的指令通道 |
| MISO | Master In Slave Out | 从→主 | 从设备发送数据给主设备 | 队员的汇报通道 |
| SCK | Serial Clock | 主→从 | 时钟信号,同步数据传输节奏 | 指挥的节拍器 |
| SS/CS | Slave Select/Chip Select | 主→从 | 选择要与哪个从设备通信 | 点名器 |
二、SPI总线传输模式
2.1 时钟的四种"舞蹈节奏"
SPI有四种不同的时钟配置,就像四种不同的舞蹈节奏。这些模式由两个参数决定:
- CPOL(Clock Polarity,时钟极性) :时钟空闲时的状态
- 0 = 空闲时低电平(像休息时站着)
- 1 = 空闲时高电平(像休息时坐着)
- CPHA(Clock Phase,时钟相位) :数据采样的时机
- 0 = 在时钟的第一个边沿采样
- 1 = 在时钟的第二个边沿采样
四种传输模式详解:

模式0(最常用):CPOL=0, CPHA=0
空闲状态:低电平(站着休息)
动作时机:上升沿时说话,下降沿时准备
模式1:CPOL=0, CPHA=1
空闲状态:低电平(站着休息)
动作时机:下降沿时说话,上升沿时准备
模式2:CPOL=1, CPHA=0
空闲状态:高电平(坐着休息)
动作时机:下降沿时说话,上升沿时准备
模式3:CPOL=1, CPHA=1
空闲状态:高电平(坐着休息)
动作时机:上升沿时说话,下降沿时准备
2.2 模式选择对照表
| 模式编号 | CPOL | CPHA | 空闲状态 | 数据采样边沿 | 典型应用 |
|---|---|---|---|---|---|
| 模式0 | 0 | 0 | 低电平 | 时钟上升沿 | 大多数传感器、Flash存储器 |
| 模式1 | 0 | 1 | 低电平 | 时钟下降沿 | 部分EEPROM |
| 模式2 | 1 | 0 | 高电平 | 时钟下降沿 | 特殊外设 |
| 模式3 | 1 | 1 | 高电平 | 时钟上升沿 | 部分ADC/DAC芯片 |
重要提示 :主设备和从设备必须使用相同的SPI模式,否则就像一个人按华尔兹节奏跳舞,另一个人按探戈节奏跳舞,完全无法配合!
2.3 数据传输的两种"说话顺序"
SPI支持两种数据传输顺序,就像两种不同的说话习惯:
方式一:MSB优先(最常用)
先说最重要的,再说次要的
字节:0xAB (二进制:10101011)
传输顺序:1→0→1→0→1→0→1→1
(先传最高位1010,再传低位1011)
方式二:LSB优先
先说最不重要的,再说重要的
字节:0xAB (二进制:10101011)
传输顺序:1→1→0→1→0→1→0→1
(先传最低位1011,再传高位1010)
三、SPI总线数据交换
3.1 单次通信完整流程
让我们通过一个实际例子来看SPI通信的全过程:
场景:主设备(单片机)要读取从设备(温度传感器)的当前温度值
步骤1:点名选择
主设备将传感器的SS引脚拉低(从高电平变低电平)
作用:相当于说"温度传感器,现在和你对话"
步骤2:启动同步节奏
主设备开始产生SCK时钟信号
作用:设定双方对话的节奏速度
步骤3:发送请求指令
主设备通过MOSI发送:0x03(读取命令)
同时,传感器通过MISO发回无关数据(可能是0x00或上次数据)
作用:主说"我要读取数据",从回答"听到了"(但不是真正的温度值)
步骤4:接收温度数据
主设备发送虚拟数据(如0x00)
同时,传感器通过MISO发送真实的温度数据(如0x1A表示26°C)
作用:主说"随便说点什么",从回答"温度是26度"
步骤5:结束对话
主设备将SS引脚拉高
作用:说"对话结束"
时序图展示:
SS ────\________________________/──────
↓ ↑
开始 结束
SCK ___ ___ ___ ___ ___ ___
| | | | | | | | | | | | ...
|___| |___| |___| |___| |___| |___|
MOSI |0|0| |0|0| |0|0| |0|1| |1|0| |...| 主→从
|(命令0x03) |(地址/虚拟数据)|
MISO |X|X| |X|X| |X|X| |0|0| |1|A| |...| 从→主
|(无意义) |(温度数据0x1A) |
3.2 多从设备管理策略
当需要与多个设备通信时,SPI有两种连接方式:
方式一:独立片选(最常用) - 像多个专线电话
主设备(电话总机)
│
├─SS1────── 从设备1(温度传感器)
│
├─SS2────── 从设备2(湿度传感器)
│
├─SS3────── 从设备3(显示屏)
│
└─SS4────── 从设备4(存储器)
(所有设备共享MOSI、MISO、SCK)

工作方式:
- 主设备只拉低一个SS线,选中对应设备
- 其他设备处于"静音"状态
- 一次只与一个设备通信
方式二:菊花链连接 - 像传话游戏
text
主设备 ── MOSI ── 设备1 ── 设备2 ── 设备3
│ ▲ │
└─ MISO ◄────────┴───────────────┘
(所有设备共享SCK和SS)
工作方式:
- 主设备发送的数据依次通过设备1→设备2→设备3
- 设备3的数据传回设备2,再传回设备1,最后到主设备
- 所有设备同时被选中,适合特定应用场景
3.3 数据帧格式详解
SPI的数据可以有不同的"包装规格":
| 数据位宽 | 常见应用 | 传输时间(10MHz时钟) | 备注 |
|---|---|---|---|
| 8位 | 大多数传感器、通用IO | 0.8微秒 | 最常用,兼容性好 |
| 16位 | 音频数据、高精度ADC | 1.6微秒 | 一次传输更多数据 |
| 32位 | 图像处理、高速传输 | 3.2微秒 | 效率最高,但兼容性较差 |
3.4 时钟速率与分频
SPI的时钟速度就像音乐的BPM(每分钟节拍数),决定了数据传输的快慢:
主设备内部时钟:比如48MHz
通过分频设置不同的SPI速度:
分频系数 实际SPI时钟 适用场景
2 24MHz 高速Flash、显示屏
4 12MHz 快速ADC、DAC
8 6MHz 标准外设通信
16 3MHz 常规传感器
32 1.5MHz 长距离或噪声环境
64 750kHz 低速、高可靠性需求
128 375kHz 调试、初始测试
速度选择原则:
- 从设备能力:不能超过从设备支持的最大速度
- 传输距离:距离越长,允许的速度越低
- 噪声环境:环境噪声大时需降低速度
- 电源稳定性:电源不稳定时降低速度
四、SPI典型应用场景
4.1 场景一:智能家居温湿度监控
系统组成:
主设备:ESP32单片机
从设备1:DHT22温湿度传感器(SPI模式0,1MHz)
从设备2:OLED显示屏(SPI模式0,10MHz)
从设备3:SD卡存储器(SPI模式0,20MHz)
工作流程:
1. 选中DHT22,读取温湿度数据
2. 选中OLED,显示当前数据
3. 选中SD卡,保存历史数据
4. 循环执行,每10秒一次
4.2 场景二:数码相机图像存储
系统组成:
主设备:图像处理器
从设备1:CMOS图像传感器(高速SPI,50MHz)
从设备2:DDR图像缓存(超高速SPI,100MHz+)
从设备3:SD卡存储(中速SPI,25MHz)
数据传输流程:
1. 图像传感器通过SPI将原始图像传给处理器
2. 处理器处理后通过SPI存入DDR缓存
3. 压缩后通过SPI写入SD卡
4.3 场景三:工业控制器
系统组成:
主设备:工业PLC
从设备1:模拟输入模块(SPI读取多路ADC)
从设备2:模拟输出模块(SPI控制多路DAC)
从设备3:数字IO扩展模块(SPI控制继电器)
从设备4:通讯模块(SPI配置以太网芯片)
同步控制:
所有模块共享同一SCK时钟
主设备快速轮询各模块,实现毫秒级控制响应
五、SPI协议优缺点总结
优点:
| 优点 | 说明 | 实际益处 |
|---|---|---|
| 高速传输 | 通常10-100Mbps,比I²C快10-30倍 | 适合大数据量传输,如图像、音频 |
| 全双工通信 | 同时发送和接收 | 通信效率高,无等待时间 |
| 协议简单 | 无需复杂协议栈 | 硬件实现简单,软件开销小 |
| 无地址开销 | 硬件片选直接寻址 | 寻址速度快,无地址冲突 |
| 灵活性高 | 数据位宽、时钟可配置 | 适应不同设备需求 |
缺点:
| 缺点 | 说明 | 应对策略 |
|---|---|---|
| 引脚占用多 | 每个从设备需要独立片选线 | 使用IO扩展器或菊花链 |
| 无硬件应答 | 无法自动确认数据正确接收 | 软件添加校验机制(CRC、校验和) |
| 无多主支持 | 只能有一个主设备 | 设计时确保单主架构 |
| 传输距离短 | 通常限于板级或短距离 | 长距离需加驱动器或换其他协议 |
| 功耗较高 | 时钟持续运行 | 通信间隙关闭时钟 |
六、实际应用配置要点
6.1 配置检查清单
在配置SPI通信时,请按此清单逐项检查:
- 模式匹配:✅ 主从设备SPI模式相同
- 时钟速率:✅ 不超过从设备最大速率
- 数据顺序:✅ MSB/LSB设置一致
- 片选管理:✅ 通信前后正确控制SS
- 电平兼容:✅ 3.3V与5V设备间有电平转换
- 引脚分配:✅ MOSI、MISO、SCK正确连接
- 空闲状态:✅ 非通信时SS保持高电平
6.2 常见问题排查
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 完全无通信 | SS引脚未正确控制 | 确认SS在通信期间为低电平 |
| 数据错乱 | 主从模式不匹配 | 检查并统一CPOL和CPHA |
| 速度不稳定 | 时钟速率过高 | 降低分频系数,减慢时钟 |
| 只能收不能发 | MISO/MOSI接反 | 交换这两根线 |
| 偶尔通信失败 | 线缆过长或干扰 | 缩短距离,加屏蔽,降低速率 |
6.3 性能优化技巧
- 批量传输:尽量一次传输多个字节,减少SS切换开销
- 时钟优化:在不超速前提下使用最高允许时钟
- DMA支持:如果硬件支持,使用DMA传输减少CPU占用
- 中断驱动:使用中断而非轮询,提高系统效率
- 缓冲管理:合理设置发送和接收缓冲区大小
总结
SPI协议就像一个高效、精准的同步对话系统 ,通过四线制实现芯片间的高速数据交换。它的简单性 和高速性使其成为嵌入式系统中不可或缺的通信协议。
记住SPI的核心要点:
- 四线制:MOSI、MISO、SCK、SS
- 四模式:由CPOL和CPHA决定
- 主从架构:一主多从,硬件片选
- 全双工同步:同时收发,时钟同步
3 性能优化技巧
- 批量传输:尽量一次传输多个字节,减少SS切换开销
- 时钟优化:在不超速前提下使用最高允许时钟
- DMA支持:如果硬件支持,使用DMA传输减少CPU占用
- 中断驱动:使用中断而非轮询,提高系统效率
- 缓冲管理:合理设置发送和接收缓冲区大小
总结
SPI协议就像一个高效、精准的同步对话系统 ,通过四线制实现芯片间的高速数据交换。它的简单性 和高速性使其成为嵌入式系统中不可或缺的通信协议。
记住SPI的核心要点:
- 四线制:MOSI、MISO、SCK、SS
- 四模式:由CPOL和CPHA决定
- 主从架构:一主多从,硬件片选
- 全双工同步:同时收发,时钟同步
无论是读取传感器数据、驱动显示屏,还是与存储器交换信息,SPI都能提供可靠、高效的通信解决方案。只要正确配置参数,注意信号完整性,SPI就能成为您嵌入式项目中最得力的通信助手。