一、SPI协议基础:从一根线说起

大家好,我是你们的讲师。今天咱们聊聊SPI协议的基础。说实话,SPI是我在项目中用得最多的串行接口之一,简单、高效、灵活。我记得刚入行那会儿,第一次调试SPI从设备,折腾了一整天没搞定,最后发现是CPOL和CPHA配反了——嗯,这种坑,我猜你们迟早也会遇到。

1.1 SPI总线概述

SPI,全称Serial Peripheral Interface,串行外设接口。它是由Motorola公司在上世纪80年代推出的。你想想看,一个80年代的标准,到现在还在广泛使用,说明它确实有两把刷子。

SPI是一种同步、全双工、主从式的串行通信协议。同步,意味着有独立的时钟线;全双工,意味着发送和接收可以同时进行;主从式,意味着总线上有一个主设备,一个或多个从设备。

核心特点:

  • 同步通信:有独立的SCLK时钟线
  • 全双工:MISO和MOSI同时传输
  • 主从架构:一个Master控制多个Slave
  • 高速率:通常可达几十MHz,甚至上百MHz
  • 硬件简单:只需要4根线(或3根)

我个人习惯把SPI和I2C做个对比。I2C只有两根线,但协议复杂,速度慢;SPI四根线,协议简单,速度快。说白了,如果你需要高速传输,又不介意多两根线,SPI是首选。

1.2 四线制信号定义

标准的SPI有四根信号线。我见过不少新手把这四根线搞混,尤其是MISO和MOSI。这里我给大家一个记忆技巧:MISO = Master In Slave Out,主设备输入,从设备输出;MOSI = Master Out Slave In,主设备输出,从设备输入。名字里就包含了方向信息。

信号名称 全称 方向 功能描述
SCLK Serial Clock Master → Slave 时钟信号,由Master产生
MOSI Master Out Slave In Master → Slave 主设备发送数据给从设备
MISO Master In Slave Out Slave → Master 从设备发送数据给主设备
SS/CS Slave Select / Chip Select Master → Slave 片选信号,低电平有效

小提示:有些芯片会把SS叫做CS(Chip Select),或者有的叫SS_N(带下划线表示低有效)。我在项目中遇到过一种情况:某款ADC芯片的片选竟然是高电平有效,结果我按照低有效去配,死活读不到数据。所以,一定要看数据手册,不要想当然。

1.3 单主多从拓扑结构

SPI最常见的拓扑就是单主多从。一个Master,多个Slave。每个Slave独立占用一根片选线。

为什么会这样设计?因为SPI的MISO和MOSI是共享总线。如果多个Slave同时往MISO上发数据,那不就打架了吗?所以,Master通过片选信号,每次只选中一个Slave,其他Slave的MISO输出必须处于高阻态。

这里我画了一张结构图,帮大家理解:

Master Slave 1 Slave 2 Slave 3 SCLK MOSI MISO SS1 SS2 SS3 SCLK MOSI MISO SS(片选)

从这张图可以看出:SCLK、MOSI、MISO是共享的,所有Slave都接在这三根线上。而每个Slave有自己独立的SS线。Master通过拉低某个Slave的SS来选中它,然后开始通信。

注意:当SS为高电平时,从设备的MISO引脚必须输出高阻态(High-Z)。如果从设备没有正确实现高阻态,多个从设备同时驱动MISO,轻则数据错误,重则烧毁IO口。我曾经在一个项目中遇到过这种情况,排查了整整两天才发现是某款国产芯片的MISO高阻态实现有问题。

1.4 数据传输模式:CPOL和CPHA

这部分是SPI协议的核心,也是最容易出错的地方。CPOL和CPHA这两个参数,决定了数据在时钟的哪个边沿被采样。

CPOL(Clock Polarity):时钟极性。它定义了SCLK在空闲状态时的电平。

  • CPOL = 0:空闲时SCLK为低电平
  • CPOL = 1:空闲时SCLK为高电平

CPHA(Clock Phase):时钟相位。它定义了数据是在SCLK的第一个边沿还是第二个边沿被采样。

  • CPHA = 0:在第一个边沿采样(上升沿或下降沿,取决于CPOL)
  • CPHA = 1:在第二个边沿采样

组合起来,就是四种模式:

模式 CPOL CPHA 空闲时钟电平 数据采样边沿 数据变化边沿
Mode 0 0 0 低电平 上升沿 下降沿
Mode 1 0 1 低电平 下降沿 上升沿
Mode 2 1 0 高电平 下降沿 上升沿
Mode 3 1 1 高电平 上升沿 下降沿

你可能会问:「这么多模式,我该用哪个?」

答案是:看从设备的数据手册。大多数SPI从设备会明确告诉你它支持哪种模式。比如常见的W25Q系列Flash,支持Mode 0和Mode 3。而某些ADC芯片可能只支持Mode 0。

我的经验:如果你不确定从设备支持哪种模式,可以先试试Mode 0。因为Mode 0是最常用的,兼容性最好。我做过一个项目,主控是FPGA,从设备是某款传感器。数据手册上写的是「支持Mode 0和Mode 3」,结果我用Mode 0死活读不到正确数据,换成Mode 3就好了。后来仔细看手册才发现,它所谓的「支持Mode 0」是指能接收,但发送数据时用的是Mode 3的时序。所以,一定要仔细看时序图,不要只看文字描述。

这里我给大家一个简单的判断方法:看时序图中数据是在时钟的上升沿还是下降沿被采样。如果是在上升沿采样,且空闲时钟为低,那就是Mode 0;如果空闲时钟为高,那就是Mode 3。如果是在下降沿采样,且空闲时钟为低,那就是Mode 1;空闲时钟为高,那就是Mode 2。

嗯,其实说白了,你只要记住一点:Master和Slave的CPOL和CPHA必须完全一致,否则通信就会失败。我曾经在调试一块LCD驱动芯片时,FPGA这边配的是Mode 0,芯片那边默认是Mode 3,结果屏幕花屏。查了三天,最后发现是模式不匹配。从那以后,我每次做SPI设计,第一件事就是确认双方的CPOL和CPHA配置。

小结

这一章我们讲了SPI协议的基础:四根信号线的定义、单主多从的拓扑结构、以及CPOL/CPHA的四种模式。这些都是后续设计SPI控制器的基础。尤其是CPOL和CPHA,我建议你们在纸上画一画时序图,把四种模式的波形都画出来,这样理解会更深刻。

下一章,我们会开始设计一个简单的SPI Master控制器,用Verilog实现。到时候我会带着大家一步步写代码,从顶层架构到具体实现,再到仿真验证。敬请期待。

本章要点回顾:

  • SPI是同步、全双工、主从式串行接口
  • 四根线:SCLK、MOSI、MISO、SS
  • 单主多从:每个Slave独立片选,MISO需高阻态
  • 四种模式由CPOL和CPHA组合决定
  • Master和Slave的模式必须匹配

可可精品资料库