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

想象一下两个朋友要通过纸条传递信息,但需要确保信息传递的顺序和时机完全同步。SPI(Serial Peripheral Interface,串行外设接口) 就像这样一套精密的"同步传纸条系统",专门用于电子芯片之间高速、可靠的数据交换。
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有四种不同的时钟配置,就像四种不同的舞蹈节奏。这些模式由两个参数决定:
四种传输模式详解:

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