一、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协议知识结构图,帮你理清本章的核心脉络:
这张图把本章的三个核心内容串起来了。左边是4线制的具体信号,中间是4种模式的分类,右边是与其他协议的对比。你学完这一章,应该能回答三个问题:SPI有几根线?有几种模式?跟I2C/UART比有什么优势?
嗯,SPI协议概述就讲到这里。下一节我们会深入RTL实现,看看怎么用Verilog把SPI主机控制器写出来。到时候我会分享一些我在实际项目中踩过的坑,比如跨时钟域处理、FIFO深度设计这些。
可可精品资料库