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,那才是真正让人头疼的地方。
记住:硬件调试,示波器是最好的朋友。别光看代码,波形会告诉你真相。