一、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输出必须处于高阻态。
这里我画了一张结构图,帮大家理解:
从这张图可以看出: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的模式必须匹配
可可精品资料库