第2章 SPI 信号线:一板一眼,条条分明
SPI 总线就那么四根线,听起来简单,但很多新手甚至老手都在这上面翻过车。我个人习惯把这四根线比作一个团队里的四个角色:时钟是鼓手,数据线是主唱和和声,片选是导演。各司其职,节奏才能对得上。
下面我把每根线掰开揉碎了讲。你跟着过一遍,调试时心里就有底了。
SCLK – 串行时钟线
SCLK 是 SPI 的“心跳”。没有它,数据就没法对齐。主设备(Master)产生时钟信号,从设备(Slave)跟着这个节奏收数据。说白了,所有数据都是在 SCLK 的边沿被采样的。
这里有个坑:极性(CPOL)和相位(CPHA)决定了到底是上升沿采样还是下降沿采样。我遇到过好几次,拿逻辑分析仪抓波形,明明数据线有变化,但解码出来全是乱码,最后发现是 CPOL/CPHA 配反了。
我个人的习惯:上来先用默认 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 一直低电平或者高电平,说明 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 下降沿,却忘了设超时时间(我调AD转换器时犯过这错)
四根线一览表
| 信号线 | 方向 | 主要作用 | 常见问题 |
|---|---|---|---|
| SCLK | Master → 所有Slave | 提供同步时钟,确定采样边沿 | 极性与相位配置错误;频率过高导致信号畸变 |
| MOSI | Master → Slave | 主设备发送数据给从设备 | 忽视全双工特性;未检查MISO导致误以为通信成功 |
| MISO | Slave → Master | 从设备回传数据 | 未设为高阻态导致总线冲突;从设备未响应时呈现浮空 |
| CS | Master → 单个Slave | 选通从设备,低电平有效 | 时序要求未满足(建立时间/保持时间);连续传输未拉高 |
其实看懂了这四根线,SPI 基本就掌握了一大半。剩下的就是根据你手头的芯片手册,把 CPOL/CPHA 和时序参数(如 SCLK 周期、CS 建立时间等)对号入座。我个人的习惯是把手册上相关的图截图打印出来,放在示波器旁边,边抓波形边对照,一眼就能看出哪根线没对。
比如 SCLK 跑 10 MHz,采样率至少 100 MHz。不然你连边沿对齐都看不清。
好了,信号线讲到这里,你打开示波器看看实际波形,就能跟上面的图对上号了。