【驱动设计的硬件基础】SPI

你有没有想过,家里的智能手表是怎么把心率数据传给芯片的?智能音箱的麦克风阵列如何快速把声音信号传给处理单元?这些看似复杂的操作,背后可能藏着一个低调却强大的通信协议 ------SPI(Serial Peripheral Interface,串行外设接口)

目录

[一、SPI 到底是个啥?先从 "快递运输" 打个比方](#一、SPI 到底是个啥?先从 "快递运输" 打个比方)

[1.1 SPI 的定义与特点​](#1.1 SPI 的定义与特点)

[1.2 SPI 的应用场景​](#1.2 SPI 的应用场景)

[二、SPI 的硬件长啥样?四根线撑起一片天](#二、SPI 的硬件长啥样?四根线撑起一片天)

[2.1 SCLK(时钟线):通信的 "节奏大师"](#2.1 SCLK(时钟线):通信的 "节奏大师")

[2.2 MOSI(主机输出从机输入):主机的 "单向快递车"](#2.2 MOSI(主机输出从机输入):主机的 "单向快递车")

[2.3 MISO(主机输入从机输出):从机的 "反向快递车"](#2.3 MISO(主机输入从机输出):从机的 "反向快递车")

[2.4 SS(从机选择线):精准的 "点名器"](#2.4 SS(从机选择线):精准的 "点名器")

[三、关键操作:SPI 的时序到底怎么玩?](#三、关键操作:SPI 的时序到底怎么玩?)

[3.1 两个核心参数:CPOL 和 CPHA](#3.1 两个核心参数:CPOL 和 CPHA)

[3.2 四种模式怎么记?](#3.2 四种模式怎么记?)

四、硬件设计避坑指南:这些细节容易翻船

[4.1 多从机连接:独立片选 vs 菊花链,怎么选?](#4.1 多从机连接:独立片选 vs 菊花链,怎么选?)

[4.2 信号完整性:走线长度影响速度](#4.2 信号完整性:走线长度影响速度)

[4.3 电源与接地:共地才能好好说话](#4.3 电源与接地:共地才能好好说话)

五、调试秘籍:从现象看本质

[5.1 常见问题诊断表](#5.1 常见问题诊断表)

[5.2 调试神器推荐](#5.2 调试神器推荐)

六、总结


作为嵌入式领域最常用的通信总线之一,SPI 就像电子设备里的 "快递员",能在芯片和传感器、存储芯片之间快速传递数据。今天咱们就聊聊这个 "小能手" 的硬件秘密。


一、SPI 到底是个啥?先从 "快递运输" 打个比方

想象一下你开了家快递公司,要给多个小区(从机)送快递(数据)。SPI 的工作模式就像这样:

  • 有个总调度(主机):通常是单片机(比如 STM32),负责安排什么时候发车、开多快;
  • 四条关键道路
    • SCK(时钟线):相当于 "发车计时器",每打一次铃(时钟边沿)就送一个快递;
    • MOSI(主机→从机车道):主机往从机送快递的单向车道;
    • MISO(从机→主机车道):从机往主机送快递的单向车道;
    • SS(小区门铃):主机按哪个门铃(拉低哪根线),就给哪个小区送快递。

和常见的 I2C 总线相比,SPI 最大的特点是全双工------MOSI 和 MISO 能同时传数据,就像双向车道,效率更高。但代价是需要更多引脚(I2C 只需要两根线),所以适合 "短距离 + 高速" 的场景,比如传感器、FLASH 存储、LCD 驱动这些需要快速响应的设备。

1.1 SPI 的定义与特点​

SPI 是由**摩托罗拉(Motorola)**公司开发的一种全双工、同步串行通信总线,主要用于微控制器(如单片机)与外围设备之间的通信。它具有以下显著特点:​

  • **高速数据传输:**可以在较高的时钟频率下工作,实现快速的数据交换。
  • 简单的硬件结构:通常只需少数几根信号线,降低了硬件设计的复杂度和成本。
  • 全双工通信:允许主机与从机同时进行数据的发送和接收。
  • 主从架构:系统中包含一个主机(Master)和一个或多个从机(Slave),主机控制通信过程。

1.2 SPI 的应用场景​

SPI 广泛应用于各种电子设备中,例如:​

  • 存储设备:如 EEPROM、FLASH 等,用于存储数据。
  • 传感器:像温度传感器、加速度传感器等,获取外界环境数据。
  • 显示设备:如 LCD、OLED 的驱动芯片,实现图像的显示。
  • 外设扩展:如 ADC(模数转换器)、DAC(数模转换器)等,扩展微控制器的功能。

二、SPI 的硬件长啥样?四根线撑起一片天

要理解 SPI 的硬件,先记住四个关键信号,咱们一个一个拆解:

2.1 SCLK(时钟线):通信的 "节奏大师"

SCLK 由主机生成,是整个通信的 "心跳"。就像乐队的鼓手,SCLK 的频率(比如 1MHz、10MHz)决定了数据传输的速度。频率越高,数据传得越快,但对硬件的要求也越高(比如走线不能太长,否则容易有噪声)。

2.2 MOSI(主机输出从机输入):主机的 "单向快递车"

MOSI 是主机向从机发送数据的专用通道。主机就像快递员,把要发送的数据按位(bit)依次放到 MOSI 线上,从机则根据 SCK 的节奏 "接货"。

2.3 MISO(主机输入从机输出):从机的 "反向快递车"

MISO 是从机向主机发送数据的通道。当主机给从机发数据时,从机也会同时通过 MISO 回传数据 ------ 这就是全双工的魅力,一来一回同时完成。

2.4 SS(从机选择线):精准的 "点名器"

SS 线是主机的 "点名开关"。因为 SPI 支持多个从机(比如一个单片机接了 3 个传感器),主机需要通过 SS 线告诉 "今天我要和谁通信"。当 SS 线被拉低(比如从 3.3V 变 0V),对应的从机就会 "竖起耳朵" 准备接收数据;其他从机的 SS 线保持高电平,相当于 "我现在不参与,别打扰"。

举个实际例子 :在 STM32 开发板上,我们常看到这样的连接 ------
PA5(SCK)→ 传感器的SCK
PA7(MOSI)→ 传感器的MOSI
PA6(MISO)→ 传感器的MISO
PA4(SS)→ 传感器的SS

这四根线一接,单片机就能和传感器愉快地 "聊天" 了。

三、关键操作:SPI 的时序到底怎么玩?

光知道线怎么连还不够,SPI 的核心秘密藏在时序里 ------ 也就是 SCK、MOSI、MISO、SS 这四根线在时间上的配合。就像跳双人舞,节奏不对就会踩脚。

3.1 两个核心参数:CPOL 和 CPHA

SPI 的时序由两个参数决定:时钟极性(CPOL)时钟相位(CPHA)。这俩参数组合起来,形成了 SPI 的四种模式(Mode0~Mode3):

  • CPOL(Clock Polarity):SCK 的 "休息状态"

    CPOL=0 时,SCK 在空闲(不通信)时是低电平(0V);

    CPOL=1 时,SCK 在空闲时是高电平(3.3V)。

    就像快递车的 "停车状态"------ 要么停在起点(低电平),要么停在终点(高电平)。

  • CPHA(Clock Phase):数据的 "传递时机"

    CPHA=0 时,数据在 SCK 的第一个边沿(比如从低变高的上升沿)被采样(读取);

    CPHA=1 时,数据在 SCK 的第二个边沿(比如从高变低的下降沿)被采样。

    相当于快递员 "交货" 的时间 ------ 要么第一声铃响交货,要么第二声铃响交货。

3.2 四种模式怎么记?

为了不让你记混,咱们直接上 "时序四兄弟" 的对比图:

模式 CPOL CPHA SCK 空闲状态 数据采样边沿 数据变化边沿
Mode0 0 0 低电平 上升沿(低→高) 下降沿(高→低)
Mode1 0 1 低电平 下降沿(高→低) 上升沿(低→高)
Mode2 1 0 高电平 下降沿(高→低) 上升沿(低→高)
Mode3 1 1 高电平 上升沿(低→高) 下降沿(高→低)

举个 Mode0 的栗子 (最常用的模式):

当 CPOL=0(SCK 空闲低电平),CPHA=0(第一个边沿采样),通信开始时:

  1. 主机拉低 SS 线(选中从机);
  2. SCK 开始 "高低高低" 跳动(上升沿和下降沿交替);
  3. 在 SCK 的上升沿(低→高),主机把 MOSI 的当前位数据 "放" 到线上,从机同时读取 MOSI 的数据;
  4. 同时,从机把 MISO 的当前位数据 "放" 到线上,主机读取 MISO 的数据;
  5. 下降沿时,双方准备下一位的数据;
  6. 8 个边沿(一个字节)后,数据传输完成,主机拉高 SS 线,结束通信。

四、硬件设计避坑指南:这些细节容易翻船

理论学得再溜,实际搭电路时也可能踩坑。咱们总结了 SPI 硬件设计中最容易出错的几个点,帮你少走弯路。

4.1 多从机连接:独立片选 vs 菊花链,怎么选?

如果一个主机要连多个从机(比如同时接 FLASH 和加速度传感器),有两种连接方式:

  • 独立片选(每个从机一根 SS 线)
    优点 :简单!主机想和谁通信,就拉低谁的 SS 线,其他从机自动 "闭嘴"。
    缺点:费 IO 口!如果接 5 个从机,主机需要 5 个 IO 口控制 SS,对于 IO 紧张的单片机(比如 STM8)不太友好。
  • 菊花链(所有从机共享 SS 线)
    优点: 省 IO!只需要一根 SS 线,所有从机 "串" 起来 ------ 前一个从机的 MISO 连到下一个的 MOSI。
    缺点:复杂!数据需要 "接力" 传输,主机发的第一个字节给第一个从机,第二个字节给第二个从机,容易出错。

建议:新手优先选独立片选,简单可靠;如果 IO 不够,再考虑菊花链,但调试时记得用逻辑分析仪(比如 Saleae)看时序。

4.2 信号完整性:走线长度影响速度

SPI 的高速(可达几十 MHz)是优点,但也带来麻烦 ------ 走线太长会引入噪声,导致数据传错。

记住这几点

  • SCK、MOSI、MISO 尽量走短、走直,避免和电源线、高频信号线(比如 USB)平行;
  • 重要信号(如 SCK)可以加 10Ω~33Ω 的串联电阻,减少反射(类似高速电路的阻抗匹配);
  • 从机的 SS 线尽量靠近主机,避免长走线被干扰(比如被电机、继电器的噪声 "污染")。

4.3 电源与接地:共地才能好好说话

SPI 通信的前提是主机和从机 "共地"------ 也就是它们的 GND 连在一起。如果两地之间有电压差(比如主机 GND 是 0V,从机 GND 是 0.1V),MOSI/MISO 的高 / 低电平判断就会出错(比如 3.3V 的信号在从机看来可能变成 3.2V,被误判为低电平)。
血泪教训:曾经有个项目,传感器和单片机分别接了不同的电源模块,没共地,结果 SPI 通信时好时坏,最后发现是 GND 没连牢。

五、调试秘籍:从现象看本质

5.1 常见问题诊断表

现象 可能原因 解决方案
无时钟输出 CR1寄存器未使能SPE位 写入SPI_CR1_SPE
数据错位 模式不匹配 核对CPOL/CPHA设置
传输卡死 CS线未正确释放 确保CS高电平持续时间
数据乱码 电平不匹配 添加电平转换电路

5.2 调试神器推荐

  1. 逻辑分析仪:捕获SPI时序(推荐Saleae Logic 8)
  2. 示波器:观察信号质量(重点关注上升沿)
  3. 万用表:测量关键点电压(CS低电平确认)

六、总结

最后,咱们给 SPI 做个 "体检报告",帮你快速判断什么时候用它:

优点:

  • 高速:最高可达几十 MHz(远高于 I2C 的 400kHz),适合传感器、存储等需要快速传数据的场景;
  • 全双工:收发同时进行,效率高;
  • 简单:没有复杂的从机地址(不像 I2C 需要设置 7 位地址),主机直接控制 SS 线;
  • 灵活:支持多种时序模式(Mode0~Mode3),适配不同从机。

缺点:

  • 费引脚:至少需要 4 根线(I2C 只需要 2 根),不适合引脚少的单片机;
  • 无应答机制:SPI 没有 I2C 的 ACK(应答)信号,主机不知道从机是否收到数据(需要额外设计校验,比如 CRC);
  • 抗干扰差:高速信号容易受噪声影响,长距离传输(超过 1 米)效果不好(这时候可能得用 RS485)。

SPI 就像嵌入式工程师的 "瑞士军刀",虽然不是万能的,但在短距离高速通信场景中几乎不可替代。理解它的硬件时序、掌握设计技巧,能帮你在调试时快速定位问题(比如时序不匹配、信号干扰),少掉几根头发。

附录:SPI vs I2C关键对比

特性 SPI I2C
速度 可达100Mbps 通常<1Mbps
接线复杂度 4+n线 2线
通信方式 全双工 半双工
从机地址 无需 需要7/10位
错误检测 无原生机制 有ACK/NACK
最佳场景 高速数据流 多设备控制

相关推荐
想搞嵌入式的小白17 天前
STM32软件spi和硬件spi
单片机·嵌入式硬件·spi
无聊到发博客的菜鸟2 个月前
STM32实现SPI转USB虚拟串口输出(实测40M时钟不丢包)
stm32·嵌入式·usb·spi·虚拟串口
Hungry_113 个月前
SPI通信协议
单片机·嵌入式硬件·spi·嵌入式软件
怀九日3 个月前
HAL库实现SPI读写FLASH(W25Q32)
单片机·嵌入式·flash·spi·嵌入式软件
通信小小昕3 个月前
FPGA|Verilog-SPI驱动
fpga开发·蓝桥杯·优化·verilog·spi·竞赛
集大周杰伦4 个月前
深入解析 I²C 与 SPI 协议:原理、时序及软件实现
单片机·嵌入式硬件·iic·spi·通信协议
PassLink_4 个月前
ESP32S3(主模式) 与 STM32(从模式) 进行SPI全双工通信
stm32·单片机·嵌入式硬件·esp32·spi
JaneZJW5 个月前
江科大STM32入门——SPI通信笔记总结
笔记·stm32·单片机·嵌入式硬件·嵌入式·spi
嵌入式科普6 个月前
嵌入式科普(24)从SPI和CAN通信重新理解“全双工”
c语言·stm32·can·spi·全双工·ra6m5