1. SPI 协议概述:从起源到全双工通信

SPI 这个协议,说实话,在嵌入式世界里太常见了。我做了十几年 MCU 开发,几乎每个项目都离不开它。今天咱们就来聊聊 SPI 的来龙去脉,把它的底细摸清楚。

1.1 SPI 总线的起源

SPI 全称是 Serial Peripheral Interface,串行外设接口。它是由摩托罗拉公司(就是现在的 NXP 前身之一)在 80 年代推出的。当时摩托罗拉推出了一款叫 MC68HC11 的微控制器,为了给这个 MCU 配一个简单好用的外设接口,就设计了 SPI。

为什么会有 SPI?

你想想看,那时候的并行接口虽然快,但引脚太多。一个 8 位并行接口至少需要 8 根数据线,再加上控制线,板子布线简直噩梦。SPI 只用 4 根线,就能搞定大部分外设通信。我记得第一次用 SPI 驱动一个 LCD 屏幕时,看着那清爽的 4 根线,心里真舒服。

核心特点:SPI 是一种同步、全双工、主从架构的串行通信协议。同步意味着有独立的时钟线;全双工意味着可以同时收发数据。

1.2 四线制功能定义

SPI 标准四线制,就是 SCLK、MOSI、MISO、CS。每一根线都有明确的职责。我见过不少新手搞混 MOSI 和 MISO,结果焊好板子发现通信不了,排查半天才发现线接反了。

信号线 全称 方向 功能描述
SCLK Serial Clock 主机 → 从机 由主机产生的时钟信号,决定数据传输速率
MOSI Master Out Slave In 主机 → 从机 主机发送数据给从机的通道
MISO Master In Slave Out 从机 → 主机 从机发送数据给主机的通道
CS Chip Select 主机 → 从机 片选信号,低电平有效,选中对应从机

这里有个细节我要强调一下:CS 是低电平有效。也就是说,CS 引脚拉低时,从机才被选中,才能参与通信。我曾经在一个项目中,因为 CS 极性配置反了,折腾了两天才找到问题。嗯,这种坑踩过一次就记住了。

1.3 全双工通信原理

全双工是 SPI 最亮眼的特点。什么叫全双工?说白了就是发数据和收数据可以同时进行。

SPI 的通信机制是这样的:

  1. 主机拉低 CS,选中从机
  2. 主机在 SCLK 的每个时钟周期,通过 MOSI 发送 1 位数据
  3. 同时,从机在同一个时钟周期,通过 MISO 发送 1 位数据给主机
  4. 一个字节(8 位)需要 8 个时钟周期完成

为什么会这样?因为 SPI 本质上是一个环形移位寄存器结构。主机和从机内部各有一个移位寄存器,它们通过 MOSI 和 MISO 连成一个环。时钟每跳一次,两个寄存器同时移位一次,数据就在主机和从机之间交换了。

个人经验:我习惯把 SPI 通信想象成两个人交换扑克牌。主机出一张牌(MOSI),同时从机也出一张牌(MISO),时钟就是他们出牌的节奏。每次时钟跳变,两人同时把牌推给对方。这样一轮下来,双方手里都拿到了对方的牌。

来看一个具体的例子。假设主机要发送 0x53 给从机,同时从机返回 0xAC:

时钟周期:   T1   T2   T3   T4   T5   T6   T7   T8
SCLK:       ↑    ↑    ↑    ↑    ↑    ↑    ↑    ↑
MOSI:       0    1    0    1    0    0    1    1   ← 0x53
MISO:       1    0    1    0    1    1    0    0   ← 0xAC

看到没?8 个时钟周期,主机发了 0x53,也收到了 0xAC。这就是全双工的魅力——不浪费一个时钟周期。

避坑指南:我曾经在一个项目中,从机返回的数据总是错位。排查后发现,从机要求数据在时钟下降沿采样,而主机配置成了上升沿采样。SPI 的时钟极性和相位(CPOL/CPHA)必须主从一致,否则数据就会错位。这个后面章节会详细讲。

1.4 SPI 总线结构图

下面这张图展示了 SPI 单主多从的典型连接方式。注意看,所有从机共享 SCLK、MOSI、MISO,但每个从机有独立的 CS 线。

SPI 单主多从总线结构 SPI 主机 (MCU) 从机 1 (传感器) 从机 2 (LCD) 从机 3 (Flash) SCLK MOSI MISO CS1 CS2 CS3 CS 独立控制 SCLK/MOSI/MISO 共享总线

从图上可以清楚看到:主机通过独立的 CS 线选择要通信的从机,然后通过共享的 SCLK、MOSI、MISO 完成数据交换。这种结构的好处是扩展性强——加一个从机,只需要多一根 CS 线。

1.5 SPI 的典型应用场景

SPI 在嵌入式系统里应用非常广泛。我整理了几个常见的场景:

  • 传感器数据采集:加速度计、陀螺仪、温度传感器等,SPI 速率高,适合实时采集
  • 显示驱动:LCD、OLED 屏幕,SPI 可以快速刷新画面
  • 存储芯片:Flash、SD 卡,SPI 的全双工特性适合大数据量读写
  • 数模转换:ADC/DAC 芯片,SPI 能提供精确的时序控制
  • 无线模块:Wi-Fi、蓝牙模块,SPI 作为高速通信接口

小结一下:SPI 的四线制结构简单清晰,全双工通信效率高,主从架构控制灵活。这些特性让它成为 MCU 开发中最常用的外设接口之一。后面我们会深入 SPI 的时序细节、速率配置和驱动开发实战。