SPI 信号线:SCK、MOSI、MISO、CS 的作用与电气特性归纳总结
SPI 通信,说白了就靠四根线干活。我刚开始接触 SPI 时,总以为线越多越复杂,但实际用起来发现——这四根线分工特别明确,各管一摊,反而比 I²C 那种一根时钟一根数据好理解得多。
今天咱们把这四兄弟挨个儿捋一遍。不光说它们干什么,还要说说电气上要注意什么。我在项目里吃过不少信号线匹配的亏,后面会讲到。
SCK — 时钟线,指挥棒
SCK(Serial Clock)由主设备产生,是一切节奏的来源。从设备完全跟着 SCK 的上升沿或下降沿来采样/输出数据。说白了,没有时钟,所有数据就是一锅粥。
关键特性:时钟极性(CPOL)和时钟相位(CPHA)决定了 SCK 在空闲时是高还是低,以及数据在哪个边沿采样。这两项配置必须主从一致,否则直接通信失败。
我记得有一次调一个加速度计模块,MISO 死活没数据。折腾了半天才发现,是默认的 CPOL=0 和从设备要求的 CPOL=1 对不上。把寄存器改过去,波形马上就干净了。
MOSI — 主出从入,单方向
MOSI(Master Out Slave In)是主设备发送数据到从设备的专用线。注意方向:只能主→从。从设备永远不能往 MOSI 上拉数据。
电气上,MOSI 属于推挽输出,电平由主设备的 GPIO 驱动能力决定。我建议一般主设备 MOSI 的驱动能力设为 8 mA 或更高(具体看芯片手册),尤其当从设备离得远(比如超过 10 cm 的 PCB 走线)时,驱动不足会导致上升沿变缓,边沿触发时序错乱。
如果 MOSI 上同时接了多个从设备,要确认每个从设备的 MOSI 引脚是否都有内部上拉或下拉。有些从设备会在 MOSI 上额外加个弱下拉,和主设备推挽冲突——嗯,那会浪费电流,严重时会把引脚拉出奇怪电平。
MISO — 主入从出,也是单方向
MISO(Master In Slave Out)刚好反过来:数据从从设备流向主设备。主设备的 MISO 引脚一般是输入(高阻态),从设备在片选有效时驱动 MISO。
这里有个常见的坑:多从机共享 MISO 总线时,必须确保未被选中从设备的 MISO 引脚呈高阻态,否则两个从设备同时拉 MISO,轻则数据冲突,重则烧引脚。我曾经在一个温度采集板上同时挂了 3 个芯片,忘了看其中一个从设备的输出模式,结果一上电 MISO 就被两个芯片灌了几十毫安,幸亏没烧。
如果从设备不支持 MISO 高阻,就必须在硬件上加三态缓冲器或门控。否则,老老实实每个从设备单独接一个 MISO 线,或改用带片选复用的方案。
CS — 片选线,叫谁谁答应
CS(Chip Select)也叫 SS(Slave Select),一般低电平有效。主设备通过拉低某从设备的 CS 来选中它,通信结束后再拉高使其休眠。
电气上要注意:
- CS 在空闲时必须拉到无效电平(通常高电平),否则从设备会一直处于选中状态,乱响应数据。
- CS 的高电平到低电平跳变(选中瞬间)需要有一个建立时间,通常为主设备发送第一个字节之前。我习惯在代码里加个小延迟(几百纳秒到几微秒),确保从设备稳定进入工作模式。
有一次我在调试一块 SPI 屏幕时,屏幕偶尔只显示半行,波形一切正常。后来发现是 CS 拉低到 SCLK 第一个边沿之间差了不到 50 ns,屏幕内部逻辑还没准备好。我把 SPI 时钟改慢了一点,顺便在 CS 拉低后加了个 nop 延时,问题就消失了。
电气特性归纳总结
下面这张表把四根线的电气角色和参数要点列清楚,你在选型和画 PCB 时直接对照就好:
| 信号线 | 方向 | 输出类型 | 常见电平 | 关键注意点 |
|---|---|---|---|---|
| SCK | 主→从 | 推挽 | 3.3V / 1.8V | 时钟极性与相位需主从一致;速率不要超过从设备上限 |
| MOSI | 主→从 | 推挽 | 3.3V / 1.8V | 驱动能力要够;多从机注意上拉/下拉冲突 |
| MISO | 从→主 | 从机推挽(选中时) | 3.3V / 1.8V | 未选中需高阻,否则总线冲突 |
| CS | 主→从 | 推挽 | 3.3V / 1.8V | 空闲保持无效电平;选中前留建立时间 |
另外,SPI 的通信距离一般建议在 50 cm 以内(PCB 走线或短跳线),频率越高距离越短。你想想看,10 MHz 的 SPI,信号边沿可能只有几纳秒,任何反射或容性负载都会让波形变形。我习惯在靠近主设备端的信号线上串联 22-33 Ω 的电阻,用来抑制过冲——特别是 CS 和 SCK 线,过冲大了会触发从设备的寄生逻辑电平翻转。
总结一下四个核心原则:
- 时钟极性和相位必须主从匹配,这是 SPI 调试里最容易踩的坑。
- MISO 的多设备共享一定要保证三态隔离,否则数据乱得像打麻将。
- CS 的建立时间不能忽略,宁愿加几个 nop 也别省。
- 信号完整性:短走线、加串阻、匹配电平转换(比如 3.3V→5V 需要电平转换芯片)。
最后,看一张 SPI 信号线连接的结构图,你一眼就能明白主从之间的信号流向:
这张图你应该看一眼就能记住:主设备是「发号施令」的,SCK、MOSI、CS 三个输出都往从设备去,只有 MISO 是从设备往回传数据。电气上,所有输出都是推挽,输入(MISO 对主设备、SCK/MOSI/CS 对从设备)要保证输入电平范围兼容,别让 5V 信号直接灌进 3.3V 的引脚——我一般会加个电平转换芯片,或者用电阻分压。嗯,今天就聊到这儿,线认清楚了,后面调时钟极性和相位才不会心里没底。