1. SPI协议基础:从一根线到四根线的故事

大家好,我是你们的RTL设计讲师。今天咱们聊聊SPI协议的基础。说实话,我刚开始接触数字IC设计时,第一个独立负责的模块就是SPI控制器。那时候踩了不少坑,现在回想起来,如果当时有人能把这些基础讲透,我至少能省下一周的时间。

1.1 SPI总线概述——为什么叫“串行外设接口”?

SPI,全称Serial Peripheral Interface,是Motorola公司在上世纪80年代推出的。说白了,它就是用来让芯片之间“聊天”的一种方式。

你可能会问:芯片之间通信的方式那么多,为什么还要用SPI?

嗯,我个人的理解是这样的:SPI在“速度”和“简单”之间找到了一个很好的平衡点。它不像I2C那样需要复杂的地址仲裁,也不像UART那样需要双方约定好波特率。SPI的通信方式,说白了就是“主设备说一句,从设备回一句”。

核心特点:

  • 全双工通信——可以同时收发数据
  • 主从架构——一个主设备控制整个通信过程
  • 同步传输——由时钟信号驱动
  • 高速率——通常可达几十MHz,甚至上百MHz

我在项目中遇到过这样一个场景:某次需要在一个FPGA和ADC芯片之间传输数据,ADC要求SPI时钟频率达到50MHz。当时我设计的第一个版本,因为没处理好时钟域的问题,数据老是出错。后来才发现,原来是SPI的时序约束没做对。这个教训让我深刻理解了SPI协议中每一个信号的重要性。

1.2 四线制信号定义——每一根线都有自己的脾气

标准的SPI有四根信号线。我习惯把它们分成两组:一组是控制线,一组是数据线。

信号名称 全称 方向 我的理解
SCLK Serial Clock 主→从 通信的“心跳”,由主设备产生
MOSI Master Out Slave In 主→从 主设备发数据给从设备
MISO Master In Slave Out 从→主 从设备回数据给主设备
CS/SS Chip Select / Slave Select 主→从 选通信号,低电平有效

SCLK——时钟信号

这是由主设备产生的时钟。你想想看,没有时钟,数据怎么对齐?SPI的时钟可以配置成不同的极性(CPOL)和相位(CPHA),这个我们后面会详细讲。我建议初学者先把时钟想象成一个节拍器,数据就在这个节拍下跳来跳去。

MOSI和MISO——数据线

这两根线很有意思。MOSI是主设备输出、从设备输入;MISO正好反过来。所以SPI是全双工的——主设备在发送数据的同时,也能收到从设备发来的数据。

我曾经犯过一个低级错误:在设计RTL时,把MOSI和MISO的方向搞反了。结果仿真波形看起来一切正常,但上板测试时数据全是乱的。排查了两天才发现,原来是顶层连线时把这两个信号接反了。嗯,从那以后,我每次例化SPI模块时,都会反复确认这两根线的连接。

CS——片选信号

这个信号决定了“谁在和主设备说话”。CS为低电平时,对应的从设备被选中。我习惯把它想象成“点名”——主设备把CS拉低,就是在说:“嘿,轮到你了!”

小技巧:在设计RTL时,我建议把CS信号做成异步复位。这样即使时钟还没稳定,从设备也能保证处于非选中的状态,避免误操作。

1.3 单主单从与多从机拓扑结构

SPI的拓扑结构,说白了就是“谁和谁连在一起”。最常见的两种场景:

单主单从——最简单的配置

一个主设备,一个从设备。四根线直接连起来就行。这种结构最简单,也最容易调试。

我记得刚入行时,带我的老工程师说:“先把单主单从调通,再考虑复杂的。”这句话我现在也经常跟新人说。因为单主单从的时序最简单,没有总线竞争,没有地址冲突,是学习SPI最好的起点。

多从机拓扑——两种连接方式

当你有多个从设备时,有两种连接方式:

方式一:独立片选

每个从设备都有自己的CS线。主设备有多少个从设备,就需要多少个CS引脚。这种方式的好处是:从设备之间完全独立,互不干扰。

方式二:菊花链

所有从设备共用SCLK和CS,但数据线串起来——从设备的MISO接到下一个从设备的MOSI。这种方式节省引脚,但延迟会累加。我在做LED驱动芯片时用过菊花链,因为那些芯片只需要接收数据,不需要回传,用菊花链正合适。

避坑指南:我曾经在一个项目里,把8个ADC芯片用独立片选方式连接。结果PCB布线时发现,CS线太长导致信号质量变差。后来不得不加缓冲器。所以,如果你要连接多个从设备,一定要提前评估信号完整性。

SPI多从机拓扑结构示意图 主设备 从设备1 从设备2 从设备3 SCLK MOSI MISO CS1 CS2 CS3 图例 SCLK(时钟) MOSI(主出从入) MISO(主入从出) CS(片选) 主设备 从设备

上面这张图展示的是独立片选的多从机连接方式。你可以看到,SCLK和MOSI、MISO是共享的,但每个从设备都有自己的CS线。这种结构在RTL设计时,主设备需要有一个片选译码器,根据要访问的从设备地址,拉低对应的CS信号。

好了,SPI协议的基础就讲到这里。这些概念虽然简单,但它们是后续所有设计的基础。我个人建议,如果你刚开始学SPI,不妨先拿一个简单的单主单从场景练练手,把四根线的时序关系搞清楚,后面再学多从机、DMA传输这些高级特性就会轻松很多。

我的建议:在学习SPI时,不要只看文字描述。打开一个波形查看工具,比如GTKWave或者Vivado的仿真器,实际观察一下SCLK、MOSI、MISO和CS的时序关系。相信我,看一次波形比读十遍文档都管用。

可可精品资料库