首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >SPI通信协议全面详解

SPI通信协议全面详解

作者头像
一个平凡而乐于分享的小比特
发布2026-02-02 16:14:25
发布2026-02-02 16:14:25
2640
举报

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

在这里插入图片描述
在这里插入图片描述

SPI通信协议全面详解

一、SPI协议简介

1.1 什么是SPI协议?

想象一下两个朋友要通过纸条传递信息,但需要确保信息传递的顺序和时机完全同步。SPI(Serial Peripheral Interface,串行外设接口) 就像这样一套精密的"同步传纸条系统",专门用于电子芯片之间高速、可靠的数据交换。

SPI的四大核心特征:

在这里插入图片描述
在这里插入图片描述
1.2 SPI的"四人工作组"

SPI通信最少需要4条线,就像一个有明确分工的四人工作组:

代码语言:javascript
复制
┌─────────────────┐        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 = 在时钟的第二个边沿采样

四种传输模式详解:

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
模式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支持两种数据传输顺序,就像两种不同的说话习惯:

代码语言:javascript
复制
方式一: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通信的全过程:

场景:主设备(单片机)要读取从设备(温度传感器)的当前温度值

代码语言:javascript
复制
步骤1:点名选择
主设备将传感器的SS引脚拉低(从高电平变低电平)
作用:相当于说"温度传感器,现在和你对话"

步骤2:启动同步节奏
主设备开始产生SCK时钟信号
作用:设定双方对话的节奏速度

步骤3:发送请求指令
主设备通过MOSI发送:0x03(读取命令)
同时,传感器通过MISO发回无关数据(可能是0x00或上次数据)
作用:主说"我要读取数据",从回答"听到了"(但不是真正的温度值)

步骤4:接收温度数据
主设备发送虚拟数据(如0x00)
同时,传感器通过MISO发送真实的温度数据(如0x1A表示26°C)
作用:主说"随便说点什么",从回答"温度是26度"

步骤5:结束对话
主设备将SS引脚拉高
作用:说"对话结束"

时序图展示:

代码语言:javascript
复制
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有两种连接方式:

方式一:独立片选(最常用) - 像多个专线电话

代码语言:javascript
复制
主设备(电话总机)
    │
    ├─SS1────── 从设备1(温度传感器)
    │
    ├─SS2────── 从设备2(湿度传感器)
    │
    ├─SS3────── 从设备3(显示屏)
    │
    └─SS4────── 从设备4(存储器)
    
    (所有设备共享MOSI、MISO、SCK)
在这里插入图片描述
在这里插入图片描述

工作方式:

  • 主设备只拉低一个SS线,选中对应设备
  • 其他设备处于"静音"状态
  • 一次只与一个设备通信

方式二:菊花链连接 - 像传话游戏

text

代码语言:javascript
复制
主设备 ── 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(每分钟节拍数),决定了数据传输的快慢:

代码语言:javascript
复制
主设备内部时钟:比如48MHz
通过分频设置不同的SPI速度:

分频系数  实际SPI时钟  适用场景
  2        24MHz      高速Flash、显示屏
  4        12MHz      快速ADC、DAC
  8        6MHz       标准外设通信
  16       3MHz       常规传感器
  32       1.5MHz     长距离或噪声环境
  64       750kHz     低速、高可靠性需求
  128      375kHz     调试、初始测试

速度选择原则:

  1. 从设备能力:不能超过从设备支持的最大速度
  2. 传输距离:距离越长,允许的速度越低
  3. 噪声环境:环境噪声大时需降低速度
  4. 电源稳定性:电源不稳定时降低速度

四、SPI典型应用场景

4.1 场景一:智能家居温湿度监控
代码语言:javascript
复制
系统组成:
主设备: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 场景二:数码相机图像存储
代码语言:javascript
复制
系统组成:
主设备:图像处理器
从设备1:CMOS图像传感器(高速SPI,50MHz)
从设备2:DDR图像缓存(超高速SPI,100MHz+)
从设备3:SD卡存储(中速SPI,25MHz)

数据传输流程:
1. 图像传感器通过SPI将原始图像传给处理器
2. 处理器处理后通过SPI存入DDR缓存
3. 压缩后通过SPI写入SD卡
4.3 场景三:工业控制器
代码语言:javascript
复制
系统组成:
主设备:工业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通信时,请按此清单逐项检查:

  1. 模式匹配:✅ 主从设备SPI模式相同
  2. 时钟速率:✅ 不超过从设备最大速率
  3. 数据顺序:✅ MSB/LSB设置一致
  4. 片选管理:✅ 通信前后正确控制SS
  5. 电平兼容:✅ 3.3V与5V设备间有电平转换
  6. 引脚分配:✅ MOSI、MISO、SCK正确连接
  7. 空闲状态:✅ 非通信时SS保持高电平
6.2 常见问题排查

问题现象

可能原因

解决方法

完全无通信

SS引脚未正确控制

确认SS在通信期间为低电平

数据错乱

主从模式不匹配

检查并统一CPOL和CPHA

速度不稳定

时钟速率过高

降低分频系数,减慢时钟

只能收不能发

MISO/MOSI接反

交换这两根线

偶尔通信失败

线缆过长或干扰

缩短距离,加屏蔽,降低速率

6.3 性能优化技巧
  1. 批量传输:尽量一次传输多个字节,减少SS切换开销
  2. 时钟优化:在不超速前提下使用最高允许时钟
  3. DMA支持:如果硬件支持,使用DMA传输减少CPU占用
  4. 中断驱动:使用中断而非轮询,提高系统效率
  5. 缓冲管理:合理设置发送和接收缓冲区大小

总结

SPI协议就像一个高效、精准的同步对话系统,通过四线制实现芯片间的高速数据交换。它的简单性高速性使其成为嵌入式系统中不可或缺的通信协议。

记住SPI的核心要点:

  • 四线制:MOSI、MISO、SCK、SS
  • 四模式:由CPOL和CPHA决定
  • 主从架构:一主多从,硬件片选
  • 全双工同步:同时收发,时钟同步

3 性能优化技巧

  1. 批量传输:尽量一次传输多个字节,减少SS切换开销
  2. 时钟优化:在不超速前提下使用最高允许时钟
  3. DMA支持:如果硬件支持,使用DMA传输减少CPU占用
  4. 中断驱动:使用中断而非轮询,提高系统效率
  5. 缓冲管理:合理设置发送和接收缓冲区大小

总结

SPI协议就像一个高效、精准的同步对话系统,通过四线制实现芯片间的高速数据交换。它的简单性高速性使其成为嵌入式系统中不可或缺的通信协议。

记住SPI的核心要点:

  • 四线制:MOSI、MISO、SCK、SS
  • 四模式:由CPOL和CPHA决定
  • 主从架构:一主多从,硬件片选
  • 全双工同步:同时收发,时钟同步

无论是读取传感器数据、驱动显示屏,还是与存储器交换信息,SPI都能提供可靠、高效的通信解决方案。只要正确配置参数,注意信号完整性,SPI就能成为您嵌入式项目中最得力的通信助手。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SPI通信协议全面详解
    • 一、SPI协议简介
      • 1.1 什么是SPI协议?
      • 1.2 SPI的"四人工作组"
    • 二、SPI总线传输模式
      • 2.1 时钟的四种"舞蹈节奏"
      • 2.2 模式选择对照表
      • 2.3 数据传输的两种"说话顺序"
    • 三、SPI总线数据交换
      • 3.1 单次通信完整流程
      • 3.2 多从设备管理策略
      • 3.3 数据帧格式详解
      • 3.4 时钟速率与分频
    • 四、SPI典型应用场景
      • 4.1 场景一:智能家居温湿度监控
      • 4.2 场景二:数码相机图像存储
      • 4.3 场景三:工业控制器
    • 五、SPI协议优缺点总结
      • 优点:
      • 缺点:
    • 六、实际应用配置要点
      • 6.1 配置检查清单
      • 6.2 常见问题排查
      • 6.3 性能优化技巧
    • 总结
    • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档