🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习

🎬擅长领域:驱动开发,嵌入式软件开发,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 调试、初始测试速度选择原则:

从设备能力:不能超过从设备支持的最大速度传输距离:距离越长,允许的速度越低噪声环境:环境噪声大时需降低速度电源稳定性:电源不稳定时降低速度四、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通信时,请按此清单逐项检查:

模式匹配:✅ 主从设备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就能成为您嵌入式项目中最得力的通信助手。