一、SPI协议概述:从一根线到四根线的故事

大家好,我是你们的讲师。今天咱们聊聊SPI总线。说实话,这玩意儿在嵌入式领域太常见了。我入行那会儿,第一个项目就是给MCU配一个SPI Flash,当时被时序折腾得够呛。

SPI全称是Serial Peripheral Interface,串行外设接口。它由摩托罗拉公司在80年代推出。你想想看,那时候并行总线还大行其道,摩托罗拉搞出这么个串行方案,确实挺有远见的。

1.1 为什么需要SPI?

早期的芯片之间通信,要么用并行总线(数据线一大堆),要么用UART这种异步串口。并行总线占引脚太多,UART又需要双方约定波特率。SPI的出现,说白了就是要在「引脚少」和「速度快」之间找个平衡点。

我个人习惯把SPI看作「同步版的UART」。它用一根时钟线来同步数据,这样就不需要双方精确约定速率了。嗯,这个理解方式对我帮助很大。

1.2 四线制信号定义

SPI标准接口就四根线。不多不少,刚刚好。我见过不少新手把这四根线搞混,尤其是MISO和MOSI。

信号名 全称 方向(主→从) 作用
SCLK Serial Clock 主→从 时钟信号,由主设备产生
MOSI Master Out Slave In 主→从 主设备发送数据给从设备
MISO Master In Slave Out 从→主 从设备发送数据给主设备
SS Slave Select 主→从 片选信号,低电平有效

这里有个记忆技巧:MOSI 里的 "O" 代表 Output(主设备输出),MISO 里的 "I" 代表 Input(主设备输入)。我在项目中遇到过有人把这两根线接反了,结果调了整整两天才发现。所以,画原理图时一定再三核对。

1.3 全双工通信原理

SPI最牛的地方在于——它是全双工的。什么意思?就是同一时刻,数据可以双向流动。

你想想看,UART虽然也是全双工,但它需要两根独立的数据线(TX和RX)。SPI用MOSI和MISO也是两根数据线,但多了一根时钟线SCLK。这个时钟线就是「节拍器」。

具体怎么工作的?

  • 每个时钟周期,主设备在MOSI上发送1位数据
  • 同时,从设备在MISO上发送1位数据
  • 一个时钟周期完成1位数据的双向交换

说白了,SPI的每次数据传输都是一次「交换」。你发一个字节出去,同时也会收到一个字节回来。这个特性在寄存器读写场景下特别有用——你发命令的同时,就能读到状态。

核心要点:SPI的每次时钟跳变,都同时完成一位数据的发送和接收。这就是全双工的本质。

1.4 主从设备角色划分

SPI总线是典型的主从架构。一个总线上可以有多个从设备,但同一时刻只能有一个主设备(标准SPI是这样,多主模式比较复杂,咱们先不聊)。

主设备负责:

  • 产生SCLK时钟信号
  • 控制SS片选信号
  • 发起数据传输

从设备负责:

  • 监听SCLK和SS信号
  • 在SS有效时响应主设备
  • 根据SCLK节奏收发数据

我曾经在一个项目里,把两个设备都配成了主模式。结果总线上一片混乱,数据完全对不上。后来查手册才发现,SPI总线上只能有一个时钟源。这个坑,大家千万别踩。

避坑指南:我曾经见过有人把多个主设备的SCLK直接连在一起。这是禁止的!多个时钟源同时驱动一根线,轻则数据错误,重则烧毁IO口。

1.5 多从设备连接方式

当总线上有多个从设备时,有两种连接方式:

  1. 独立片选方式:每个从设备有自己的SS线,主设备有多个GPIO分别控制
  2. 菊花链方式:所有从设备共用SS和SCLK,数据从一个从设备传到下一个

独立片选最常见。我建议新手先掌握这种方式,菊花链的时序分析要复杂一些。

1.6 知识体系框架

下面这张图,是我自己画的SPI协议知识框架。你可以把它当作本章的「地图」。

SPI协议知识框架 SPI总线协议 起源与背景 摩托罗拉 80年代 串行替代并行 四线制信号定义 SCLK MOSI MISO SS 主→从 / 从→主方向 全双工通信原理 同时收发 时钟同步交换 主从设备角色划分 主设备:时钟源、发起者 从设备:响应者、监听者 多从设备连接 独立片选 / 菊花链 核心:同步、全双工、主从架构、四线制

个人经验:我刚开始学SPI时,总觉得全双工这个概念很抽象。后来在项目中调试一个ADC芯片,发现每次发命令读回来的数据都是上一次命令的结果。这才真正理解了「交换」的含义。所以,建议你动手写代码时,多留意这个特性。

好了,这一章的内容就到这里。SPI协议看似简单,但里面的细节不少。下一章我们会深入时序参数,看看那些建立时间、保持时间到底是怎么回事。

可可精品资料库