第1章:SPI总线基础

咱们做硬件的,谁还没跟SPI打过交道呢?说白了,SPI就是芯片之间聊天的"普通话"。我这些年调试过的板子,十块里有七八块都跑着SPI。今天咱们就把这"普通话"的底子彻底捋一遍。

1.1 什么是SPI?

SPI全称是Serial Peripheral Interface,串行外设接口。它是由摩托罗拉公司在80年代推出的。你想想看,都三十多年前的东西了,现在还在大量使用,说明这个协议确实经典。

SPI有四个核心特点:

  • 同步:所有数据传输都由时钟信号控制
  • 全双工:可以同时收发数据
  • 主从:一个主设备控制多个从设备
  • 四线制:只需要四根信号线

重点记住:SPI是全双工通信。这意味着主设备发数据的同时,从设备也能回数据。这个特性在很多场合特别有用。

我自己刚入行时犯过一个低级错误——把SPI当成了半双工来用,非得等发完了再收。后来看了波形才反应过来,白白浪费了一倍的传输时间。

1.2 四根线的故事

SPI就四根线,每根都有自己的"性格"。来,咱们一个一个看:

信号名 方向 功能 我常用的别名
SCK / SCLK 主→从 时钟信号,由主设备产生 时钟线
MOSI 主→从 主设备输出,从设备输入 数据下发线
MISO 从→主 主设备输入,从设备输出 数据上传线
CS / SS 主→从 片选信号,低电平有效 片选线

SCK——时钟线。没有它,什么都不转。我记得有次调试一个传感器模块,怎么都不通,最后发现是时钟极性配反了。从那以后我养成了习惯:先查时钟配置。

MOSI——主出从入。数据从主设备流向从设备。MISO——主入从出。数据从从设备返回主设备。这两根线就是全双工的关键。说白了,它们组成了一条双向车道,可以同时走车。

CS——片选。这根线决定了哪个从设备在跟主设备对话。低电平有效,这是惯例。我建议你无论如何都不要违反这个惯例,否则兼容性会很头疼。

个人习惯:画原理图时,我习惯把SCK放在最左边,CS放最右边,MOSI和MISO放中间。这样布板时信号流向更清晰。

1.3 全双工通信原理

全双工是SPI最厉害的地方。你想想看,很多其他协议比如I2C,同一时刻只能一个方向传数据。但SPI可以在一个时钟周期内,一边发一边收。

为什么会这样?

因为SPI内部用的是两个独立的移位寄存器。主设备有一个,从设备也有一个。每个时钟上升沿或下降沿,主设备的移位寄存器往MOSI上推一位数据,同时从设备的移位寄存器往MISO上推一位数据。一个时钟周期,两边各推一位,互不干扰。

数据传输过程可以用下面的步骤来理解:

  1. 主设备把CS拉低,选中从设备
  2. 每个时钟边沿,主设备在MOSI上输出1位,从设备在MISO上输出1位
  3. 经过8个时钟(或16个,取决于数据宽度),一个字节传完
  4. 主设备把CS拉高,结束通信

避坑:我曾经在一个项目中吃过亏——从设备的MISO输出缓冲没有处理好,导致主设备在读数据时收到的是高阻态。所以,检查从设备的MISO驱动能力,这是我调试SPI时一定会做的第一步。

全双工的好处是什么?举个例子:你给一个ADC发读命令,它同时就能把上次转换的结果返回给你。一波操作下来,命令和结果一起到,效率翻倍。这在高速数据采集系统里特别关键。

1.4 主从模式说明

SPI总线上只能有一个主设备,但从设备可以有多个。这就是咱们常说的"一主多从"结构。

连接方式有两种:

  • 独立片选:每个从设备有自己的CS线,主设备有N个GPIO控制N个CS
  • 菊花链:从设备串在一起,数据从一个传到下一个(用得少,我不建议初学者用)

我自己的项目里,超过3个从设备时,会考虑加一个SPI扩展器或者用GPIO模拟多路CS。不然GPIO不够用,布板也麻烦。

1.5 本章知识结构

这章的内容其实可以浓缩成一张图。你看看下面的架构图,就明白了SPI是怎么回事:

SPI四线制全双工通信架构 主设备 Master 产生时钟 从设备 Slave 接收时钟 SCK 时钟线 MOSI 主出从入 MISO 主入从出 CS 片选线 全双工通信:一个时钟周期内,MOSI和MISO同时传输数据 主设备发1位,从设备回1位,互不干扰

图上画得很清楚:主设备发起时钟,通过MOSI把数据传给从设备,同时通过MISO接收从设备返回的数据。CS单独控制,想跟谁说话就拉低谁的片选。

关键理解:SPI的全双工能力让它特别适合那些需要"一问一答"速度又快的场景。比如高速ADC、音频编解码器、显示驱动芯片,这些器件几乎清一色用SPI。

嗯,这一章的基础知识就到这儿了。后面咱们会聊到更实际的——如何根据走线长度和速率去匹配端接电阻,这些底层概念你会反复用到。