SPI通信协议全面详解

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

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

速度选择原则:

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

四、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通信时,请按此清单逐项检查:

  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就能成为您嵌入式项目中最得力的通信助手。

相关推荐
一个平凡而乐于分享的小比特2 天前
I²C通信协议详解
通信协议·i2c
Darken034 天前
什么是SPI协议?
单片机·spi
一个平凡而乐于分享的小比特4 天前
USB通信核心机制详解:数字世界的“智能快递系统”
usb·通信协议
大河qu5 天前
HCIP-IoT/H52-111 真题详解(章节F),通信协议与通信设备 /Part1
mqtt·hcip·通信协议·coap·华为云物联网·lwm2m·网关设备
2401_853448236 天前
FreeRTOS项目---WiFi模块(2)
stm32·单片机·freertos·esp8266·通信协议
sheepwjl1 个月前
《嵌入式硬件(十九):基于IMX6ULL的SPI操作》
单片机·嵌入式硬件·spi·adxl345
时光の尘1 个月前
STM32外设面试速通:UART、I2C、SPI、DMA、RAM/FLASH与ADC/DAC
stm32·dma·iic·adc·flash·spi·ram
闻道且行之1 个月前
KickPi RK3568平台SPI内核驱动开发
驱动开发·rk3568·kernel·spi·kickpi
趙小贞1 个月前
UART 串口协议详解与 STM32 实战实现
stm32·单片机·嵌入式硬件·通信协议·1024程序员节