2、SPI物理层详解:SCK、MOSI、MISO、CS四线功能解析,电气特性与连接方式

各位同学,咱们今天来聊聊SPI的物理层。说白了,就是那四根线到底是怎么工作的。

我刚开始接触嵌入式时,总觉得SPI很简单——不就四根线嘛。结果第一次调试多设备通信,就被波形折腾得够呛。嗯,这四根线,每一根都有它的脾气。

2.1 四线功能解析:各司其职

SPI全称是Serial Peripheral Interface,串行外设接口。它用四根线完成全双工通信。哪四根?SCK、MOSI、MISO、CS。

SCK(Serial Clock)—— 时钟线

时钟线由主机产生,决定了数据传输的节奏。我个人习惯叫它“心跳线”。没有时钟,数据就动不了。

SCK的频率决定了通信速度。比如你跑10MHz,那每秒就能传10M个比特。但要注意,频率不是越高越好。线太长、干扰太大,信号就会失真。我在项目中遇到过,把SCK从20MHz降到5MHz,通信反而稳定了。

MOSI(Master Out Slave In)—— 主机输出,从机输入

这条线负责从主机向从机发数据。名字已经说得很清楚:主机往外送,从机往里收。

你想想看,主机要写寄存器、发指令,都得走这条线。如果MOSI上波形乱跳,从机根本收不到正确数据。

MISO(Master In Slave Out)—— 主机输入,从机输出

反过来,从机向主机回传数据,就走MISO。比如你读传感器数值,从机就把数据通过MISO发回来。

这里有个坑:如果从机没被选中(CS为高),它的MISO引脚必须处于高阻态。否则多个从机同时驱动MISO,总线就打架了。我曾经因为没注意这个,调试了一整天,最后发现是某个从机芯片的MISO没配置成高阻。

CS(Chip Select)—— 片选线

片选线,也叫从机选择线。低电平有效。主机拉低某个从机的CS,就表示“我要跟你说话”。其他从机保持高电平,乖乖闭嘴。

CS是SPI多设备扩展的关键。你想接几个从机?加几个CS引脚就行。但要注意,每个从机需要独立的CS线。

核心要点:

  • SCK:时钟,主机产生
  • MOSI:主机→从机,数据线
  • MISO:从机→主机,数据线
  • CS:片选,低电平有效,每个从机一根

2.2 电气特性:别让信号“跑偏”

物理层不只是逻辑功能,电气特性同样重要。说白了,就是电压、电流、阻抗这些硬指标。

电平标准

SPI本身没有规定电平标准。常见的有:

  • 3.3V CMOS:现在最常用。逻辑1为3.3V,逻辑0为0V。
  • 5V TTL:老一些的设备还在用。逻辑1为5V,逻辑0为0V。
  • 1.8V:低功耗芯片常用。

不同电平的芯片能不能直接连?我建议别这么干。3.3V的芯片输出给5V的芯片,可能烧坏。5V的输出给3.3V的输入,可能把引脚打坏。电平转换芯片或者电阻分压,才是正道。

驱动能力与上拉电阻

SCK、MOSI、CS是主机输出,驱动能力一般够用。但MISO是从机输出,如果从机离主机很远,信号可能衰减。

我有个习惯:在CS和SCK线上加10kΩ上拉电阻。为什么?防止引脚悬空时电平不确定。尤其是CS,如果悬空,从机可能误以为被选中,乱发数据。

信号完整性

高速SPI(比如20MHz以上)要注意信号反射。线太长、阻抗不匹配,波形就会振铃。你想想看,时钟沿上有个毛刺,从机可能多采一个比特。

解决办法:

  • 走线尽量短,不超过10cm
  • 串联一个22Ω或33Ω的电阻,靠近主机端
  • 避免在SCK旁边走大电流信号

我的经验:

调试SPI时,先用示波器看SCK和MOSI的波形。如果上升沿不陡、有过冲,先降速试试。很多时候,问题出在电气特性上,而不是协议本身。

2.3 连接方式:点对点与总线

SPI的连接方式主要有两种:点对点和多设备总线。

点对点连接

最简单的方式。一个主机,一个从机。四根线直接连:

主机 SCK  → 从机 SCK
主机 MOSI → 从机 MOSI
主机 MISO ← 从机 MISO
主机 CS   → 从机 CS

这种连接,信号质量最好。没有总线冲突,没有地址问题。我调试新芯片时,永远先用点对点。

多设备总线连接

多个从机共享SCK、MOSI、MISO,但每个从机有独立的CS。连接方式:

主机 SCK  → 从机1 SCK, 从机2 SCK, 从机3 SCK
主机 MOSI → 从机1 MOSI, 从机2 MOSI, 从机3 MOSI
主机 MISO ← 从机1 MISO, 从机2 MISO, 从机3 MISO
主机 CS1  → 从机1 CS
主机 CS2  → 从机2 CS
主机 CS3  → 从机3 CS

注意:MISO是多个从机共享的。同一时刻只能有一个从机驱动MISO。其他从机的MISO必须高阻。否则,两个从机同时输出,一个拉高一个拉低,就短路了。

菊花链连接

还有一种少见的方式叫菊花链。数据从一个从机传到下一个从机。这种方式省CS线,但延迟大,用得不多。我基本没用过,不展开讲。

警告:

多设备连接时,从机的MISO引脚必须支持高阻态(三态)。如果不支持,就不能共享MISO总线。只能每个从机单独接一根MISO到主机,或者用GPIO模拟。

2.4 实际连接中的坑与避坑

讲几个我踩过的坑,你们以后遇到能少走弯路。

坑一:CS拉低后,从机没反应

我曾经调试一个SPI Flash,CS拉低了,但MISO一直没数据。查了半天,发现CS引脚没配置成推挽输出,而是开漏。开漏输出拉不低电平,从机根本检测不到片选。

避坑:CS引脚一定要配置成推挽输出,并且确认电平能拉到0V。

坑二:MISO上多个从机打架

有一次接了三个从机,其中一个从机的MISO在未选中时不是高阻,而是输出低电平。结果其他从机发数据时,MISO被拉低,数据全错。

避坑:选从机芯片时,确认其MISO在CS为高时是高阻。如果不确定,用万用表测一下。

坑三:SCK频率太高,数据错位

我试过用40MHz的SCK驱动一个SPI显示屏。结果屏幕花屏。降频到20MHz,一切正常。原因是显示屏的输入电容太大,高频信号衰减严重。

避坑:先看从机芯片的数据手册,找到最大SCK频率。然后留20%余量。

2.5 总结一下

SPI物理层,说白了就是四根线加电气规则。SCK定节奏,MOSI和MISO传数据,CS选设备。连接时注意电平匹配、信号完整性、MISO高阻态。

嗯,这些基础打牢了,后面讲多设备扩展、时序分析,你才能游刃有余。下一章咱们聊SPI的四种模式——CPOL和CPHA,那才是真正让人头疼的地方。

记住:硬件调试,示波器是最好的朋友。别光看代码,波形会告诉你真相。