3、硬件连接实战:单主单从接线、多从机独立片选、菊花链级联拓扑、差分SPI(LVDS)简介

硬件连接这事儿,看着简单,其实坑不少。我见过不少工程师,代码写得漂亮,一上示波器就傻眼——波形乱跳、数据错位,最后发现是线没接对。今天咱们就把几种常见的SPI拓扑结构掰开揉碎了讲清楚。

3.1 单主单从接线:最基础的玩法

这是最简单的场景。一个主设备,一个从设备,四根线搞定。

信号 主设备 从设备 说明
SCLK 输出 输入 时钟由主设备产生
MOSI 输出 输入 主出从入
MISO 输入 输出 主入从出
CS/SS 输出 输入 片选,低电平有效

我个人习惯,在PCB布局时把这四根线走成等长,尤其是时钟频率超过10MHz的时候。你想想看,如果SCLK走线比MOSI长了2cm,高速下相位差就出来了,数据采样点可能正好落在跳变沿上——那数据就全乱了。

小技巧: 如果主从设备距离较远(比如超过10cm),建议在MISO和MOSI上串联一个22Ω~33Ω的电阻,靠近发送端放置。这能抑制信号过冲,我吃过这个亏。

3.2 多从机独立片选:最常见的多设备方案

当你有多个SPI从设备时,最直接的办法就是——每个从设备分配一个独立的片选信号。主设备的GPIO够用就行。

接线方式:

  • SCLK、MOSI、MISO:所有设备并联在一起
  • CS0、CS1、CS2...:每个从设备独享一根片选线

这里有个关键点:从设备的MISO引脚必须是三态输出。当它的CS为高电平时,MISO必须输出高阻态,不能拉低或拉高总线。否则多个从设备同时驱动MISO,轻则数据错误,重则烧毁IO口。

注意: 我曾经遇到过一款ADC芯片,它的MISO在CS拉高后不是高阻,而是保持最后一拍的数据电平。结果三个ADC挂在一根MISO上,读谁的数据都不对。后来只能加三态缓冲器才解决。所以选型时一定要看数据手册里的“Output disable leakage”参数。

独立片选的优点很明显:每个从设备独立操作,互不干扰。缺点也直接:占用GPIO多。如果你有8个从设备,就得占用8个GPIO做片选。

3.3 菊花链级联拓扑:省GPIO的骚操作

菊花链(Daisy Chain)是一种特殊的连接方式。它把多个从设备串成一串,数据像流水一样从第一个传到最后一个。

接线方式:

  • SCLK:所有设备共用
  • CS:所有设备共用
  • MOSI:只连到第一个从设备的输入
  • 第一个从设备的输出 → 第二个从设备的输入 → 第三个从设备的输入 → ... → 最后一个从设备的输出连回主设备的MISO

说白了,就是数据在多个从设备之间接力传递。主设备发一串数据,第一个从设备吃掉自己的那部分,剩下的往后传。

适用场景: 菊花链最适合那些“配置寄存器”类的设备,比如LED驱动芯片、DA转换器。你一次性把所有设备的配置数据发出去,它们自动对号入座。

但要注意,菊花链的延迟是累加的。每个从设备都会引入几个时钟周期的延迟。如果链上有10个设备,总延迟可能达到几十个时钟周期。高频下这个延迟会影响时序。

我记得有一次调试一个12位的ADC菊花链,链上有4个芯片。主设备发完48个时钟(4×12),结果最后一个芯片的数据要等3个时钟才出现在MISO上。当时查了半天,后来发现是芯片内部有个FIFO缓冲。所以用菊花链之前,一定要看数据手册里的“Data delay”参数。

3.4 差分SPI(LVDS)简介:远距离高速传输

标准的SPI是单端信号,电压摆幅大(3.3V或5V),抗干扰能力有限。当传输距离超过1米,或者时钟频率超过50MHz时,单端SPI就开始力不从心了。

这时候就该差分SPI上场了。它把每个信号都转换成一对差分信号(正负两根线),用电压差来表示逻辑0和1。

特性 单端SPI 差分SPI(LVDS)
电压摆幅 3.3V / 5V 350mV(典型)
抗干扰 一般 强(共模抑制)
传输距离 < 1m > 10m
最高频率 ~50MHz ~200MHz+
线数 4根 8根(每信号一对)

差分SPI的接线方式:

  • SCLK → SCLK+ / SCLK-
  • MOSI → MOSI+ / MOSI-
  • MISO → MISO+ / MISO-
  • CS → CS+ / CS-

嗯,这里要注意:差分SPI并不是SPI标准的一部分,而是厂商在LVDS物理层上实现的SPI协议。比如TI的某些ADC和DAC就支持这种模式。实际项目中,如果你需要在机箱之间或者长距离传输SPI数据,可以考虑用LVDS驱动器(比如SN65LVDS1)把单端SPI转成差分信号。

经验之谈: 差分SPI的PCB走线要遵循差分对规则——等长、等距、同层。我一般把差分对间距控制在5mil以内,长度差不超过5mil。另外,终端电阻(100Ω)一定要加在接收端,否则信号反射会让你怀疑人生。

下面这张图总结了四种拓扑的核心区别:

SPI硬件连接拓扑对比 主设备 从设备 SCLK/MOSI/MISO/CS 单主单从 主设备 从0 从1 从2 多从机独立片选 SCLK/MOSI/MISO共用,CS独立 主设备 从0 从1 从2 菊花链级联 数据从主→从0→从1→从2→回主 主设备 LVDS驱动器 LVDS接收器 从设备 差分SPI(LVDS) 每信号一对差分线

最后说一句,选择哪种拓扑,取决于你的项目需求:

  • 设备少、距离近 → 单主单从,最简单
  • 设备多、GPIO够用 → 独立片选,调试方便
  • 设备多、GPIO紧张、数据量小 → 菊花链,省IO
  • 距离远、频率高、干扰大 → 差分SPI,上LVDS

没有万能的方案,只有适合的方案。我个人的习惯是,先画拓扑图,再画原理图,最后才画PCB。拓扑图能帮你提前发现很多问题,比如片选信号不够用、MISO总线冲突、时钟走线过长等等。别急着焊板子,先把线理清楚。