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第一个上升沿之前建立好,否则从设备会误判。这种时序细节,设计状态机的时候一定要考虑进去。

多从机

一个主设备挂多个从设备。有两种接法:

  1. 独立片选:每个从设备一根独立的SS线。主设备想跟谁说话,就拉低谁的SS。
  2. 菊花链:所有从设备共用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协议基础 - 知识体系 SPI协议基础 总线概述 同步串行通信 主从架构 全双工传输 四线信号定义 SCLK - 时钟 MOSI - 主发从收 MISO - 主收从发 SS/CS - 片选 拓扑结构 单主单从 多从机-独立片选 多从机-菊花链 时钟极性(CPOL)与相位(CPHA) CPOL=0:空闲低电平 CPOL=1:空闲高电平 CPHA=0:第一个边沿采样 CPHA=1:第二个边沿采样 四种工作模式 模式0:CPOL=0, CPHA=0 模式1:CPOL=0, CPHA=1 模式2:CPOL=1, CPHA=0 模式3:CPOL=1, CPHA=1

这张图把SPI协议基础分成了五个模块。从左到右,从宏观到微观。我个人建议你按照这个顺序去理解:先搞清楚总线是什么,再认识四根线,然后看拓扑,最后深入CPOL/CPHA的细节。

好了,这一章的内容就到这里。SPI协议看起来简单,但里面的门道不少。尤其是CPOL和CPHA的配置,我建议你在做状态机设计之前,先把这四种模式的时序图画一遍。画着画着,你就明白了。

可可精品资料库