3、硬件连接实战:单主单从接线、多从机独立片选、菊花链级联拓扑、差分SPI(LVDS)简介
硬件连接这事儿,看着简单,其实坑不少。我见过不少工程师,代码写得漂亮,一上示波器就傻眼——波形乱跳、数据错位,最后发现是线没接对。今天咱们就把几种常见的SPI拓扑结构掰开揉碎了讲清楚。
3.1 单主单从接线:最基础的玩法
这是最简单的场景。一个主设备,一个从设备,四根线搞定。
| 信号 | 主设备 | 从设备 | 说明 |
|---|---|---|---|
| SCLK | 输出 | 输入 | 时钟由主设备产生 |
| MOSI | 输出 | 输入 | 主出从入 |
| MISO | 输入 | 输出 | 主入从出 |
| CS/SS | 输出 | 输入 | 片选,低电平有效 |
我个人习惯,在PCB布局时把这四根线走成等长,尤其是时钟频率超过10MHz的时候。你想想看,如果SCLK走线比MOSI长了2cm,高速下相位差就出来了,数据采样点可能正好落在跳变沿上——那数据就全乱了。
3.2 多从机独立片选:最常见的多设备方案
当你有多个SPI从设备时,最直接的办法就是——每个从设备分配一个独立的片选信号。主设备的GPIO够用就行。
接线方式:
- SCLK、MOSI、MISO:所有设备并联在一起
- CS0、CS1、CS2...:每个从设备独享一根片选线
这里有个关键点:从设备的MISO引脚必须是三态输出。当它的CS为高电平时,MISO必须输出高阻态,不能拉低或拉高总线。否则多个从设备同时驱动MISO,轻则数据错误,重则烧毁IO口。
独立片选的优点很明显:每个从设备独立操作,互不干扰。缺点也直接:占用GPIO多。如果你有8个从设备,就得占用8个GPIO做片选。
3.3 菊花链级联拓扑:省GPIO的骚操作
菊花链(Daisy Chain)是一种特殊的连接方式。它把多个从设备串成一串,数据像流水一样从第一个传到最后一个。
接线方式:
- SCLK:所有设备共用
- CS:所有设备共用
- MOSI:只连到第一个从设备的输入
- 第一个从设备的输出 → 第二个从设备的输入 → 第三个从设备的输入 → ... → 最后一个从设备的输出连回主设备的MISO
说白了,就是数据在多个从设备之间接力传递。主设备发一串数据,第一个从设备吃掉自己的那部分,剩下的往后传。
但要注意,菊花链的延迟是累加的。每个从设备都会引入几个时钟周期的延迟。如果链上有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转成差分信号。
下面这张图总结了四种拓扑的核心区别:
最后说一句,选择哪种拓扑,取决于你的项目需求:
- 设备少、距离近 → 单主单从,最简单
- 设备多、GPIO够用 → 独立片选,调试方便
- 设备多、GPIO紧张、数据量小 → 菊花链,省IO
- 距离远、频率高、干扰大 → 差分SPI,上LVDS
没有万能的方案,只有适合的方案。我个人的习惯是,先画拓扑图,再画原理图,最后才画PCB。拓扑图能帮你提前发现很多问题,比如片选信号不够用、MISO总线冲突、时钟走线过长等等。别急着焊板子,先把线理清楚。