一、SPI协议概述

1.1 SPI总线简介

SPI,全称Serial Peripheral Interface,串行外设接口。这玩意儿是Motorola公司在上世纪80年代推出的,到现在还在广泛使用,说明它确实有两把刷子。

我个人觉得,SPI是三种常用串行总线(SPI、I2C、UART)里最容易上手的一个。为什么?因为它简单粗暴——主从结构,全双工通信,想传就传,不需要复杂的协议握手。我在项目中用过不下十种SPI器件,从ADC到DAC,从传感器到存储器,几乎每个嵌入式系统里都能看到它的身影。

说白了,SPI就是一条高速通道。你给它时钟,它就给你干活。没有地址帧,没有应答位,干净利落。

1.2 SPI的4线制

SPI标准接口有四根线,我习惯把它们记成「一钟三线」:

  • SCLK(Serial Clock):串行时钟,由主机产生。这决定了通信速率。
  • MOSI(Master Out Slave In):主机输出,从机输入。数据从主机流向从机。
  • MISO(Master In Slave Out):主机输入,从机输出。数据从从机流向主机。
  • SS(Slave Select):从机选择,也叫CS(Chip Select)。低电平有效,用来选中你要通信的从机。

这里有个容易踩的坑——我曾经在调试一块LCD驱动芯片时,把MOSI和MISO接反了。结果屏幕死活不亮,查了两天才发现是线序问题。嗯,从那以后我每次画板子都会再三确认主从机的引脚定义。

另外要注意,SPI是全双工的。什么意思?就是每个时钟周期,主机和从机可以同时发送和接收数据。这一点比I2C强,I2C是半双工,同一时间只能一个方向传数据。

核心要点:SPI的4根线各司其职。SCLK决定节奏,MOSI/MISO负责数据流动,SS决定跟谁说话。少一根都不行,多一根...那就是别的协议了。

1.3 SPI的4种工作模式

SPI有4种工作模式,由两个参数决定:CPOL(Clock Polarity,时钟极性)和CPHA(Clock Phase,时钟相位)。

你想想看,为什么要有4种模式?因为不同的从机芯片对时钟的要求不一样。有的在上升沿采样数据,有的在下降沿采样;有的空闲时时钟为高,有的空闲时为低。所以主机必须适配从机的需求。

模式 CPOL CPHA 采样沿 空闲时钟电平
模式0 0 0 上升沿 低电平
模式1 0 1 下降沿 低电平
模式2 1 0 下降沿 高电平
模式3 1 1 上升沿 高电平

怎么记这4种模式?我有个小技巧:

  • CPOL=0:空闲时时钟为低,像个躺平的人
  • CPOL=1:空闲时时钟为高,像个站岗的人
  • CPHA=0:在第一个时钟沿采样数据
  • CPHA=1:在第二个时钟沿采样数据

模式0是最常用的,很多SPI器件默认就是模式0。但千万别想当然——我遇到过一款温度传感器,手册上写的是模式2,结果我按模式0配置,读出来的数据全是乱的。后来仔细看手册才发现问题。

避坑指南:拿到一个新器件,第一件事就是看SPI模式。不要猜,不要试,直接看数据手册。我曾经因为偷懒没看手册,浪费了整整一个下午。

1.4 SPI与I2C/UART的对比

很多初学者会问:SPI、I2C、UART,到底用哪个?我的回答是:看场景。

下面这张表是我根据自己的项目经验整理的,你可以参考:

特性 SPI I2C UART
线数 4线(全双工) 2线(半双工) 2线(全双工)
通信方式 同步 同步 异步
速度 高(可达几十MHz) 中(标准100kHz/400kHz) 中(取决于波特率)
多从机 需要多个SS引脚 通过地址寻址 点对点
协议复杂度 低 中 低
典型应用 ADC/DAC/存储器 传感器/EEPROM GPS/蓝牙模块

我个人习惯这样选型:

  • 要高速传输(比如刷屏、读写Flash)→ 选SPI
  • 要节省引脚(比如只有2根线可用)→ 选I2C
  • 要远距离通信(比如板间通信)→ 选UART

说白了,SPI的优势在于速度和简单。它不需要像I2C那样处理地址和应答,也不需要像UART那样配置波特率。但代价就是线多——每加一个从机,就要多一根SS线。

经验之谈:如果你的系统里只有一两个从机,而且对速度有要求,SPI几乎是唯一的选择。我做过一个数据采集系统,ADC输出速率是10Msps,用I2C根本扛不住,最后只能用SPI。

知识体系总览

下面这张图是我画的SPI协议知识结构图,帮你理清本章的核心脉络:

SPI协议概述 SPI 4线制 SCLK(时钟) MOSI(主出从入) MISO(主入从出) SS(从机选择) 4种工作模式 模式0 (0,0) 模式1 (0,1) 模式2 (1,0) 模式3 (1,1) 协议对比 SPI vs I2C SPI vs UART 选型建议 核心要点 SPI:高速、全双工、简单、4线制

这张图把本章的三个核心内容串起来了。左边是4线制的具体信号,中间是4种模式的分类,右边是与其他协议的对比。你学完这一章,应该能回答三个问题:SPI有几根线?有几种模式?跟I2C/UART比有什么优势?

嗯,SPI协议概述就讲到这里。下一节我们会深入RTL实现,看看怎么用Verilog把SPI主机控制器写出来。到时候我会分享一些我在实际项目中踩过的坑,比如跨时钟域处理、FIFO深度设计这些。


可可精品资料库