1. SPI通信协议概述
大家好,我是老周,做了十几年嵌入式开发,跟各种接口打过交道。要说最常用、最灵活的短距通信协议,我觉得SPI肯定排前三。今天咱们就来聊聊SPI的基本原理,把它的根儿刨清楚。
1.1 什么是SPI?
SPI的全称是Serial Peripheral Interface,串行外设接口。它由摩托罗拉在80年代提出,后来成了事实上的行业标准。说白了,就是一种同步、全双工、主从式的串行总线协议。
“同步”意味着通信由时钟信号驱动。
“全双工”意味着可以在同一时刻发送和接收数据。
“主从式”意味着总线上只有一个设备掌管时钟,其他设备听令行事。
为什么要学SPI?我个人觉得,它比I2C快,比UART灵活,特别适合传感器、存储器、显示屏这类外设。我在一个智能家电项目里,就用SPI来驱动TFT彩屏刷画面,每秒刷新率能做到60帧,I2C根本做不到。
1.2 四线制信号定义
SPI标准用4根信号线,我习惯把它们分成三类:时钟、选择、数据。
| 信号 | 全称 | 方向 | 作用 |
|---|---|---|---|
| SCLK | Serial Clock | 主→从 | 由主机产生,控制数据采样与跳变 |
| MOSI | Master Out Slave In | 主→从 | 主机发送数据给从机 |
| MISO | Master In Slave Out | 从→主 | 从机发送数据给主机 |
| SS / CS | Slave Select / Chip Select | 主→从 | 片选信号,低电平有效,选中特定从机 |
你可能会问:为什么MOSI和MISO需要分开?我刚开始学的时候也纳闷过。答案是:为了实现全双工——主机和从机可以同时发、同时收,两根独立的数据线互不干扰。UART只有一根数据线,所以半双工;I2C也只有一根数据线,速度还慢。
嗯,这里要注意:有些低功耗器件比如SD卡,只用了3线(SCLK、MOSI、MISO),没有独立的CS脚?其实不然,SD卡协议的SPI模式里仍然需要CS,只不过在初始化阶段可以用别的方式识别。别被坑了。
1.3 主从设备角色
SPI总线上的设备分为两种角色:主机(Master)和从机(Slave)。角色是的,通信只能由主机发起。
- 主机: 产生SCLK时钟,控制传输节奏。每次通信前,主机拉低某个从机的CS,然后开始输出时钟。
- 从机: 被动接收时钟,按照时钟沿采样或发送数据。从机不能主动拉高CS,也不能产生时钟。
我在一个多传感器采集项目里,用STM32做主控,同时挂3个SPI从机:加速度计、陀螺仪、气压计。每个从机都有自己的CS引脚,主机轮流选中它们。其实只需要4根线(SCLK、MOSI、MISO共享,CS各自独立),这在引脚有限的MCU上特别实用。
1.4 数据传输的基本流程
一次完整的SPI传输可以概括为以下几个步骤:
- 主机将某个从机的CS引脚拉低(低电平有效),表示选中该从机。
- 主机开始在SCLK线上产生时钟脉冲(频率由主机设定)。
- 在每个时钟周期,主机通过MOSI发送一个bit,同时从机通过MISO发送一个bit。
- 传输结束后,主机将CS拉高,释放从机。
这里有个关键点:SPI没有内置的帧同步机制(不像I2C有START/STOP条件)。收发双方必须事先约定好传输的字节长度。所以,帧的结束完全靠CS信号来界定。如果CS不拉高,从机会一直认为传输在进行中。
SPI传输的本质是一个环形移位寄存器——主机和从机各有一个8位移位寄存器,每一时钟周期交换1bit,8个周期后完成一个字节的交换。
1.5 为什么需要配置时钟极性与相位?
你可能已经注意到,SPI的时钟其实有极性(CPOL)和相位(CPHA)两个参数。它们决定了数据在时钟的哪个边沿采样、时钟空闲时是高还是低。不同的从机要求不同的配置,接错了就读不到正确数据。
我见过不少新手直接把MCU的SPI默认模式硬往上怼,结果数据完全不对,查了两天发现是CPHA没配对。所以下一章我们会深入讲CPOL和CPHA的四种组合,但今天先把框架搭好。
1.6 本章知识体系
下面这张图把SPI的主要概念串在一起,你可以在大脑里画一个地图。
- SPI是同步、全双工、主从式串行接口,由摩托罗拉提出。
- 4根信号线:SCLK(时钟)、MOSI(主机输出从机输入)、MISO(主机输入从机输出)、CS(片选)。
- 主机产生时钟并控制CS,从机被动响应。每个从机独占一条CS线。
- 数据传输本质是双方向移位寄存器交换:8个时钟发送8个bit。
- 帧的边界由CS信号决定,CS必须在传输完成后拉高。
- 时钟极性与相位(CPOL/CPHA)决定了采样时刻,必须与从机匹配。
好了,这一章咱们把SPI通信协议的骨架搭起来了。如果你之前对SPI只是模模糊糊知道个名字,现在应该心里有底了。记住:四线信号、主从角色、全双工交换,这是SPI最本原的东西。后面所有高级话题——多从机拓扑、DMA传输、时钟配置——都是建立在这个地基上的。