1. SPI协议基础:从一根线说起
大家好,我是你们的数字IC设计讲师。今天咱们聊聊SPI——这个在芯片设计里几乎天天打交道的串行接口协议。
说实话,我刚入行那会儿,觉得SPI挺简单的。不就是四根线嘛,拉高拉低就完事了。直到有一次,我在一个多从机项目里栽了跟头——时钟相位没配好,从机死活不认数据。嗯,从那以后,我再也不敢小看这个"简单"的协议了。
1.1 SPI总线概述
SPI,全称Serial Peripheral Interface,是Motorola公司在上世纪80年代推出的。说白了,它是一种同步串行通信接口。
为什么叫"同步"?因为它有独立的时钟线。发送方和接收方都跟着这根时钟线走,谁也别掉队。这和UART那种异步通信不一样——UART得靠波特率对齐,稍微偏一点就乱码了。
我个人习惯把SPI想象成一个"主仆对话"的场景:
- 主设备:掌握时钟主动权,说什么时候说,就什么时候说
- 从设备:被动响应,主设备不给时钟,它就干等着
这种主从架构,在芯片设计里非常常见。你想想看,一个MCU挂几个传感器,或者一个FPGA挂多个ADC,SPI都是首选。
1.2 四线信号定义
SPI标准接口就四根线,不多不少。我经常跟团队里的新人说:记住这四根线,你就掌握了SPI的一半。
| 信号名 | 全称 | 方向 | 作用 |
|---|---|---|---|
| SCLK | Serial Clock | 主→从 | 时钟信号,由主设备产生 |
| MOSI | Master Out Slave In | 主→从 | 主设备发送数据给从设备 |
| MISO | Master In Slave Out | 从→主 | 从设备发送数据给主设备 |
| SS/CS | Slave Select / Chip Select | 主→从 | 片选信号,低电平有效 |
这里有个细节我想强调一下:MOSI和MISO是两条独立的数据线。这意味着SPI可以同时收发数据——这叫全双工通信。相比之下,I2C只有一根数据线,同一时间只能一个方向传数据。
关键点:SPI是全双工、同步、串行通信协议。一次传输,主设备发一位,从设备也回一位,谁都不耽误谁。
1.3 单主单从与多从机拓扑
SPI的拓扑结构,说白了就两种:
单主单从
最简单的情况。一根SCLK,一根MOSI,一根MISO,一根SS。主设备把SS拉低,开始通信,完事再拉高。
我在项目中遇到过一种情况:有些从设备的SS信号边沿要求特别严格。比如,SS必须在SCLK第一个上升沿之前建立好,否则从设备会误判。这种时序细节,设计状态机的时候一定要考虑进去。
多从机
一个主设备挂多个从设备。有两种接法:
- 独立片选:每个从设备一根独立的SS线。主设备想跟谁说话,就拉低谁的SS。
- 菊花链:所有从设备共用SS,数据从一个从设备传到下一个。这种用得少,但某些场景下能省IO口。
我个人更推荐独立片选的方式。为什么?因为菊花链的延迟不好控制,数据经过每个从设备都会增加一个时钟周期的延迟。你想想看,如果链上有8个从设备,那延迟就大了去了。
经验之谈:多从机设计时,注意SS信号的驱动能力。我曾经遇到过SS信号因为驱动不足,导致远端从设备无法正常识别片选的情况。解决办法是在主设备端加缓冲器,或者降低SCLK频率。
1.4 时钟极性(CPOL)与相位(CPHA)详解
这部分是SPI协议里最容易搞混的地方。我当年面试的时候,被这个问题问倒过。后来做项目多了,才真正理解。
CPOL和CPHA是两个配置位,它们决定了SCLK在空闲时的电平,以及数据在哪个时钟边沿被采样。
CPOL:时钟极性
- CPOL = 0:空闲时SCLK为低电平
- CPOL = 1:空闲时SCLK为高电平
说白了,就是没事干的时候,时钟线是高还是低。
CPHA:时钟相位
- CPHA = 0:在SCLK的第一个边沿采样数据
- CPHA = 1:在SCLK的第二个边沿采样数据
这里要注意:第一个边沿是上升沿还是下降沿,取决于CPOL。如果CPOL=0,第一个边沿就是上升沿;如果CPOL=1,第一个边沿就是下降沿。
组合起来,就是四种模式:
| 模式 | CPOL | CPHA | 空闲时钟电平 | 数据采样边沿 |
|---|---|---|---|---|
| 模式0 | 0 | 0 | 低 | 上升沿 |
| 模式1 | 0 | 1 | 低 | 下降沿 |
| 模式2 | 1 | 0 | 高 | 下降沿 |
| 模式3 | 1 | 1 | 高 | 上升沿 |
避坑指南:我曾经在一个项目里,主设备配置成模式0,从设备默认是模式3。结果数据死活读不对。查了两天才发现是CPOL/CPHA不匹配。所以,设计SPI控制器时,一定要把模式配置做成可编程的,别写死。
知识体系总览
下面这张图,是我画的一个SPI协议知识框架。你可以把它当作本章的"地图":
这张图把SPI协议基础分成了五个模块。从左到右,从宏观到微观。我个人建议你按照这个顺序去理解:先搞清楚总线是什么,再认识四根线,然后看拓扑,最后深入CPOL/CPHA的细节。
好了,这一章的内容就到这里。SPI协议看起来简单,但里面的门道不少。尤其是CPOL和CPHA的配置,我建议你在做状态机设计之前,先把这四种模式的时序图画一遍。画着画着,你就明白了。
可可精品资料库