第2章 SPI 信号线:一板一眼,条条分明

SPI 总线就那么四根线,听起来简单,但很多新手甚至老手都在这上面翻过车。我个人习惯把这四根线比作一个团队里的四个角色:时钟是鼓手,数据线是主唱和和声,片选是导演。各司其职,节奏才能对得上。

下面我把每根线掰开揉碎了讲。你跟着过一遍,调试时心里就有底了。

SPI 四线制典型连接结构 主设备 (Master) 从设备 (Slave) SCLK (时钟) MOSI (主出从入) MISO (主入从出) CS (片选) ⚠ 时钟由 Master 产生,MOSI/MISO 数据在时钟边沿采样, CS 低电平有效,决定哪个 Slave 参与通信。

SCLK – 串行时钟线

SCLK 是 SPI 的“心跳”。没有它,数据就没法对齐。主设备(Master)产生时钟信号,从设备(Slave)跟着这个节奏收数据。说白了,所有数据都是在 SCLK 的边沿被采样的。

这里有个坑:极性(CPOL)和相位(CPHA)决定了到底是上升沿采样还是下降沿采样。我遇到过好几次,拿逻辑分析仪抓波形,明明数据线有变化,但解码出来全是乱码,最后发现是 CPOL/CPHA 配反了。

注意:不同厂商对 CPOL/CPHA 的命名可能不一样,有的叫 Mode 0/1/2/3。
我个人的习惯:上来先用默认 Mode 0(CPOL=0,CPHA=0),采样边沿是上升沿。如果通讯不对,再换其他模式试。省得一开始就绕晕。

另外,SCLK 的频率不能太高,尤其是一根总线上挂了多个从设备时。我记得有一次调试一个带触摸屏的模块,SCLK 跑到了 20 MHz,结果触摸数据经常跳变,降频到 10 MHz 后一下子就稳了。为什么?因为走线长了,信号反射严重,高频下波形畸变。

MOSI – 主设备输出,从设备输入

MOSI 是主设备向从设备发送数据的线。别看它叫“主出从入”,其实可以理解成一条单行道:数据只能从 Master 流向 Slave。

SPI 是全双工的,所以 Master 在 MOSI 上发送数据的同时,也在 MISO 上接收数据。但很多开发者只盯着 MOSI 看,忽略了 MISO,结果以为通信成功,实际是 Slave 根本没回复。嗯,这点我在带新人时反复强调:SPI 通信是“发一帧,收一帧”,你发的数据必须和收的数据同步检查。

调试技巧:用逻辑分析仪同时抓 MOSI 和 MISO,看两个信号是否在同一个时钟周期内完成交换。
如果 MOSI 有数据,但 MISO 一直低电平或者高电平,说明 Slave 没理你——多半是 CS 没拉低,或者从地址没对上。

MISO – 主设备输入,从设备输出

MISO 线是 Slave 向 Master 反馈数据的通道。这条线在总线上是“多设备共享”的,但同一时刻只能有一个 Slave 占据它。怎么控制?靠 CS 线。

我记得有次调试多片 SPI Flash 的读写,两片 Flash 的 MISO 引脚直接连在一起,没接三态门。结果当第一片正常工作时,第二片的 MISO 还在输出,两条线打架,数据全乱了。后来查了手册才明白:Slave 在 CS 无效时必须将 MISO 置为高阻态(Hi-Z)。否则你就是在短路数据线。

关键点总结:
  • MISO 是单向从设备到主设备
  • 多从机共用时,每个从机必须支持三态输出
  • 逻辑分析仪上观察 MISO 无效状态应为浮空(高阻)

CS – 片选线

CS 线是整个 SPI 通信的“开关”,低电平有效(也有高电平有效的,但极少数)。哪根 CS 被拉低,哪根 Slave 就被选中。选中的 Slave 才会把 MISO 从高阻态切换到驱动状态,并开始采样/发送数据。

很多初学者容易忽略 CS 的时序。比如:CS 拉低后立刻发数据,但有些 Slave 需要一小段“准备时间”才能稳定接收。我踩过这个坑:一个温度传感器芯片,CS 下降沿后至少要 100 ns 才能发第一个时钟,我这边 50 ns 就给了 SCLK,结果传感器直接忽略第一字节,数据整体偏移了一位。

另外,CS 在两次传输之间必须拉高至少一个时钟周期。如果你连续发两个帧,CS 一直维持低电平,从设备可能认为这是同一个事务,导致帧边界错乱。

CS 常见翻车现场:
- 软件里 CS 拉低后忘了拉高,总线挂死
- 硬件上 CS 引脚被复用,误触发其他外设
- 逻辑分析仪触发条件设成 CS 下降沿,却忘了设超时时间(我调AD转换器时犯过这错)

四根线一览表

信号线 方向 主要作用 常见问题
SCLK Master → 所有Slave 提供同步时钟,确定采样边沿 极性与相位配置错误;频率过高导致信号畸变
MOSI Master → Slave 主设备发送数据给从设备 忽视全双工特性;未检查MISO导致误以为通信成功
MISO Slave → Master 从设备回传数据 未设为高阻态导致总线冲突;从设备未响应时呈现浮空
CS Master → 单个Slave 选通从设备,低电平有效 时序要求未满足(建立时间/保持时间);连续传输未拉高

其实看懂了这四根线,SPI 基本就掌握了一大半。剩下的就是根据你手头的芯片手册,把 CPOL/CPHA 和时序参数(如 SCLK 周期、CS 建立时间等)对号入座。我个人的习惯是把手册上相关的图截图打印出来,放在示波器旁边,边抓波形边对照,一眼就能看出哪根线没对。

调试器选择:推荐用 4 通道以上的逻辑分析仪,最低采样率建议 10× 你使用的 SCLK 频率。
比如 SCLK 跑 10 MHz,采样率至少 100 MHz。不然你连边沿对齐都看不清。

好了,信号线讲到这里,你打开示波器看看实际波形,就能跟上面的图对上号了。