1. SPI协议基础:从一根线到四根线的故事
SPI,全称是Serial Peripheral Interface,串行外设接口。说实话,这名字听起来挺唬人,但说白了,它就是一套让两个芯片之间互相说话的规矩。我在做嵌入式开发的头几年,几乎天天跟它打交道——从传感器读数到Flash存储,从LCD驱动到无线模块配置,到处都有SPI的影子。
为什么它这么流行?原因很简单:够快、够简单、够灵活。你想想看,一个只有四根线的接口,却能跑到几十兆甚至上百兆的速率,这在嵌入式世界里简直是宝贝。
1.1 四线制信号定义:每一根线都有自己的活
标准的SPI接口有四根线,我习惯把它们记成「一钟三线」:
| 信号名 | 全称 | 方向 | 一句话理解 |
|---|---|---|---|
| SCLK | Serial Clock | 主→从 | 节拍器,决定什么时候传数据 |
| MOSI | Master Out Slave In | 主→从 | 主设备发数据给从设备 |
| MISO | Master In Slave Out | 从→主 | 从设备回数据给主设备 |
| CS | Chip Select | 主→从 | 叫谁谁答应,片选信号 |
嗯,这里要注意:CS信号通常是低电平有效。也就是说,CS拉低,从设备才「醒过来」听命令;CS拉高,从设备就「睡觉」了。我曾经在项目里遇到过一个问题——CS拉低后没等时钟稳定就开始传数据,结果从设备死活不响应。后来用逻辑分析仪一看,CS下降沿和第一个时钟沿之间差了不到10纳秒,从设备根本来不及准备。从那以后,我养成了一个习惯:CS拉低后至少等半个时钟周期再开始打时钟。
核心要点:SPI的四根线各司其职。SCLK提供节奏,MOSI和MISO分别承载双向数据,CS负责选通目标设备。少一根都不行,多一根往往是扩展功能。
1.2 全双工通信原理:同时说话,同时听话
SPI最让我欣赏的一点,就是它的全双工能力。什么叫全双工?就是主设备发数据的同时,从设备也在往回发数据。两个方向同时进行,互不干扰。
你可能会问:「这不就是两根独立的线嘛,有什么稀奇的?」
确实,从硬件上看,MOSI和MISO是两条独立的物理线路。但关键在于SPI的通信机制:每一个时钟周期,主设备通过MOSI发送1位,同时从设备通过MISO发送1位。换句话说,一次时钟脉冲,数据在两个方向上各走一位。
我举个例子你就明白了。假设主设备要发送0x55给从设备,同时从设备要回传0xAA给主设备。在8个时钟周期后:
- 主设备的移位寄存器里装的是从设备发来的0xAA
- 从设备的移位寄存器里装的是主设备发来的0x55
一次传输,双方都拿到了自己想要的数据。这就是全双工的魅力。
实战小技巧:很多初学者以为SPI的读写是分开的操作。其实不是。每一次SPI传输都是同时读写的。如果你只想读不想写,那就发一个「空字节」(通常是0x00或0xFF),从设备会在你发空字节的同时把数据送回来。
1.3 主从模式架构:一个老大,多个小弟
SPI的通信架构是典型的主从模式。一个主设备(通常是MCU或SoC)控制着整个通信过程,一个或多个从设备(传感器、存储器、显示器等)响应主设备的指令。
为什么是主从模式?说白了,就是为了避免「抢话筒」的问题。如果两个设备都想同时说话,总线就乱套了。主设备掌握着时钟SCLK的控制权,没有时钟,从设备就发不出数据。这就保证了总线上只有一个「指挥」。
多从设备连接有两种常见方式:
- 独立片选方式:每个从设备有自己的CS引脚,主设备用多个GPIO分别控制。这是最常用的方式。
- 菊花链方式:所有从设备共享SCLK、MOSI、MISO,但数据像链条一样从一个设备传到下一个。这种方式用得少,但在某些ADC或LED驱动芯片上能看到。
我个人更推荐独立片选方式。为什么?调试方便。我曾经在一个项目里用菊花链接了4个ADC,结果其中一个芯片时序有问题,排查起来简直要命。从那以后,除非PCB面积实在不够,否则我坚决不用菊花链。
避坑指南:多从设备共用一个SPI总线时,一定要确保未选中的从设备的MISO引脚处于高阻态(Hi-Z)。如果所有从设备的MISO都同时输出,总线就会发生冲突,轻则数据错误,重则烧毁引脚。我曾经因为漏加一个上拉电阻,导致两个从设备同时驱动MISO,结果MCU的GPIO直接冒烟了。
1.4 SPI协议知识图谱
下面这张图把SPI协议的核心概念串起来了。你可以把它当作本章的「思维导图」:
1.5 为什么理解这些基础很重要
你可能觉得这些概念太基础了,恨不得直接上手调时序。但我跟你说,我见过太多工程师在SPI上栽跟头,归根结底都是基础没打牢。
举个例子。有一次我帮同事排查一个SPI Flash读写失败的问题。他折腾了两天,换了芯片、改了驱动、甚至怀疑PCB走线有问题。我拿逻辑分析仪一抓波形,发现MOSI上的数据完全正确,但MISO始终是低电平。再仔细一看——CS信号在传输过程中莫名其妙地抖动了一下,从设备被复位了。这就是典型的CS信号完整性问题。如果他不理解CS在SPI协议中的角色,可能永远找不到原因。
所以我的建议是:先把这四根线的脾气摸清楚,再谈调试。后面的章节里,我们会用逻辑分析仪一帧一帧地看波形,到时候你会发现,今天讲的这些基础,每一个都会在波形图上找到对应的影子。