1. SPI协议基础:从波形到数据的起点

大家好,我是你们的嵌入式硬件讲师。今天咱们聊聊SPI总线的基础知识。说实话,SPI是我在项目中用得最多的串行总线之一,它简单、高效,而且非常灵活。我记得刚入行那会儿,第一次用逻辑分析仪抓SPI波形,看着那几根线跳来跳去,心里还挺懵的。后来摸透了,才发现它其实就那么点东西。

1.1 SPI总线概述

SPI,全称是Serial Peripheral Interface,串行外设接口。它是由摩托罗拉公司推出的,说白了就是一种同步串行通信协议。什么叫同步?就是通信双方得靠同一个时钟信号来协调节奏。你想想看,没有时钟,数据怎么对齐?

SPI最大的特点就是全双工通信。什么意思?就是发送和接收可以同时进行。这一点比I2C强,I2C是半双工的,同一时间只能一个方向传数据。我在做ADC采集项目时,就特别喜欢用SPI,因为可以一边发命令一边收数据,效率高很多。

SPI的通信架构是主从模式。一个主机可以带一个或多个从机。主机负责产生时钟信号,控制整个通信过程。从机呢,就是乖乖听指挥。嗯,这里要注意,SPI没有像I2C那样的设备地址,它是靠片选信号来选通从机的。

1.2 四线制功能详解

标准的SPI接口有四根线,我一个个给你讲清楚。

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

SCLK(串行时钟):这是SPI的心脏。主机通过SCLK告诉从机,什么时候该采样数据。时钟频率决定了通信速度,我一般用10MHz以下比较稳,再高就得注意信号完整性了。有一次我调一个SPI Flash,时钟跑到20MHz,波形都变形了,后来老老实实降到12MHz才搞定。

MOSI(主机输出从机输入):这根线是主机往从机发数据的通道。数据在时钟的上升沿或下降沿被发送出去。具体是哪个沿,取决于后面要讲的CPOL和CPHA。

MISO(主机输入从机输出):这根线是从机往主机回数据的通道。注意,如果总线上挂了多个从机,同一时间只能有一个从机把MISO拉起来,其他的必须保持高阻态。不然就打架了,我见过有人把两个从机的MISO直接连一起,结果数据全乱了。

CS(片选信号):这根线用来选通从机。低电平有效,意思是CS拉低时,对应的从机被选中,开始通信。CS拉高后,从机就进入休眠状态,不理你了。我个人习惯在每次通信前后都把CS拉高再拉低,确保从机状态复位。

核心要点:SPI的四根线各司其职。SCLK提供节奏,MOSI和MISO负责数据双向流动,CS决定谁在说话。搞懂这四根线,SPI就入门了一半。

1.3 SPI的四种工作模式

SPI有四种工作模式,由两个参数决定:CPOL(时钟极性)和CPHA(时钟相位)。这两个东西,说实话,刚接触时容易搞混。我当年第一次用逻辑分析仪抓波形,就因为模式没设对,读出来的数据全是乱的。后来我总结了一个方法,你听听看。

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

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

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

  • CPHA = 0:在第一个边沿采样数据
  • CPHA = 1:在第二个边沿采样数据

把这两个参数组合起来,就得到了四种模式:

模式 CPOL CPHA 空闲时钟电平 数据采样边沿
模式0 0 0 低电平 上升沿(第一个边沿)
模式1 0 1 低电平 下降沿(第二个边沿)
模式2 1 0 高电平 下降沿(第一个边沿)
模式3 1 1 高电平 上升沿(第二个边沿)

你可能会问,为什么会有四种模式?说白了,不同厂家的芯片对时序的要求不一样。有的芯片喜欢在上升沿采样,有的喜欢在下降沿。你得看数据手册,上面会明确写支持哪种模式。

我的小技巧:如果你不确定该用哪种模式,先试试模式0。因为大部分SPI器件默认都支持模式0。我遇到过最坑的一次,是一个国产传感器芯片,数据手册上写支持模式0和模式3,结果实际只能用模式3。折腾了我半天,最后用逻辑分析仪一抓波形才找到原因。

咱们用逻辑分析仪看波形时,怎么判断当前是哪种模式?很简单:

  • 先看SCLK空闲时是高还是低,确定CPOL
  • 再看数据是在第一个边沿变化还是第二个边沿变化,确定CPHA

举个例子,如果SCLK空闲时是低电平,数据在SCLK的上升沿被采样,那就是模式0。如果SCLK空闲时是高电平,数据在SCLK的下降沿被采样,那就是模式2。

避坑指南:我曾经在一个项目中,主控和从机的SPI模式没配对。主控设的是模式0,从机默认是模式3。结果通信时有时无,数据偶尔对偶尔错。后来用逻辑分析仪一看,才发现时钟边沿完全对不上。所以,通信前一定要确认主从机的模式一致,不然就是白费功夫。

好了,SPI协议的基础就讲到这里。四根线、四种模式,搞清楚了这些,后面咱们就能用逻辑分析仪抓波形、解码数据了。下一节,我会带你亲手抓一个SPI波形,看看数据到底是怎么在线上跑的。