【驱动设计的硬件基础】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
最佳场景 高速数据流 多设备控制

相关推荐
CodeAmaz2 天前
API和SPI的异同及SPI的实际落地
spi
wotaifuzao13 天前
SPI通信:从原理到工程实践
stm32·单片机·mcu·物联网·iot·spi
wxmtwfx17 天前
Linux内核时钟芯片DS3232驱动源码分析
linux·驱动开发·spi·i2c·ds3232
俊俊谢17 天前
华大HC32F460轮询方式SPI通讯配置
单片机·嵌入式硬件·spi·hc32f460
trayvontang17 天前
SpringBoot自动配置原理
spring boot·自动配置·spi·自动配置原理
喜喜安1 个月前
串口、IIC、SPI通信协议
uart·iic·spi
时光の尘1 个月前
嵌入式面试八股文(十九)·裸机开发与RTOS开发的区别
linux·stm32·单片机·iic·rtos·spi
一个平凡而乐于分享的小比特1 个月前
I2C、SPI、CAN、串口通信详细对比
can·uart·spi·i2c
一个平凡而乐于分享的小比特1 个月前
SPI通信协议全面详解
spi·通信协议
Darken031 个月前
什么是SPI协议?
单片机·spi