💌 所属专栏:【通信协议】
😀 作 者:兰舟比特 🐾
🚀 个人简介:热爱开源系统与嵌入式技术,专注 Linux、网络通信、编程技巧、面试总结与软件工具分享,持续输出实用干货!
💡 欢迎大家:这里是兰舟比特的技术小站,喜欢的话请点赞、收藏、评论三连击!有问题欢迎留言交流😘😘😘
🧠 SPI 串行外设接口 —— 一文通吃常用知识点
✅ 1. 什么是 SPI?
SPI(Serial Peripheral Interface) 是一种同步、全双工、主从式串行通信协议,用于 MCU 与外设(传感器、存储器、屏幕等)之间高速数据传输。
📌 特点:
- 由 Motorola 在 1980 年代提出
- 无起始/停止位,无校验位 → 速度快
- 通常 4 根线:SCLK、MOSI、MISO、SS/CS
- 适合板内短距离通信(< 10cm)
✅ 2. SPI 四根核心信号线
| 信号 | 全称 | 方向 | 作用 |
|---|---|---|---|
| SCLK | Serial Clock | 主机 → 从机 | 时钟线,由主机产生,同步数据 |
| MOSI | Master Out Slave In | 主机 → 从机 | 主机发送数据给从机 |
| MISO | Master In Slave Out | 从机 → 主机 | 从机发送数据给主机 |
| SS/CS | Slave Select / Chip Select | 主机 → 从机 | 片选线,低电平选中从机 |
⚠️ 注意:有些设备支持“3线 SPI”(半双工,MOSI/MISO 合并),但标准是 4 线全双工。
✅ 3. SPI 工作模式(4种)—— 必考重点!
由 CPOL(时钟极性) 和 CPHA(时钟相位) 决定:
| 模式 | CPOL | CPHA | 空闲电平 | 采样边沿 | 口诀 |
|---|---|---|---|---|---|
| Mode 0 | 0 | 0 | 低电平 | 上升沿采样 | ✅ 最常用:“蹲着第一拍读” |
| Mode 1 | 0 | 1 | 低电平 | 下降沿采样 | “蹲着第二拍读” |
| Mode 2 | 1 | 0 | 高电平 | 下降沿采样 | “站着第一拍读” |
| Mode 3 | 1 | 1 | 高电平 | 上升沿采样 | “站着第二拍读” |
📌 Mode 0 是默认首选!(如 Flash、SD卡、BMP280、OLED)
🔧 MCU 和外设必须模式一致,否则数据错乱!
✅ 4. 数据传输特点
- 全双工:主机和从机在每个时钟周期同时发送和接收 1 位数据
- MSB/LSB First:数据从高位还是低位先发 —— 需查手册确认(通常 MSB)
- 数据长度可变:常见 8 位,也可 16 位、24 位等(由软件或硬件配置)
- 无流控、无地址、无错误校验 → 需软件层保障可靠性
✅ 5. 主从架构 & 多设备连接
- 一个主机(MCU) + 多个从机(外设)
- 共享总线:SCLK、MOSI、MISO 所有从机并联
- 独立片选:每个从机有自己的 CS,由 MCU 的 GPIO 控制
- ⚠️ 同一时间只能拉低一个 CS → 避免 MISO 总线冲突!
📌 多设备接线示意图:
MCU ──SCLK───┬──[Flash]
MOSI───┼──[Sensor]
MISO◄──┼──[OLED]
CS1────┘
CS2─────────┘
CS3────────────┘
✅ 可用“3-8 译码器”扩展 CS,节省 GPIO。
✅ 6. 优缺点对比
| 优点 | 缺点 |
|---|---|
| ✅ 速度快(几 Mbps ~ 几十 Mbps) | ❌ 占用引脚多(每个从机需独立 CS) |
| ✅ 全双工,效率高 | ❌ 无标准协议层(不同芯片数据格式不同) |
| ✅ 硬件实现简单 | ❌ 无错误校验机制 |
| ✅ 无地址冲突问题 | ❌ 仅适合短距离(抗干扰差) |
✅ 7. 常见应用场景 & 芯片举例
| 应用类型 | 芯片举例 | 说明 |
|---|---|---|
| 温度传感器 | MAX6675、MAX31855 | 读取热电偶温度 |
| 存储器 | W25Q64、AT25SF081 | SPI Flash,存固件/数据 |
| 显示屏 | SSD1306、ILI9341 | OLED / TFT 屏幕驱动 |
| ADC/DAC | MCP3008、MCP4921 | 模拟量采集/输出 |
| SD卡 | MicroSD(SPI模式) | 文件存储 |
| 无线模块 | nRF24L01 | 2.4GHz 无线收发 |
✅ 8. 如何调试 SPI?
| 工具 | 作用 |
|---|---|
| 逻辑分析仪 | ✅ 最推荐!可捕获波形 + 自动解码 SPI 数据 |
| 示波器(带协议解码) | 看电气特性 + 协议内容 |
| 代码打印法 | 在 MCU 中把 SPI 收发数据通过 UART 打印出来(临时调试) |
| 万用表/示波器测 CS | 确认片选信号是否正常拉低 |
❌ 普通串口助手不能直接监测 SPI!
✅ 9. MCU 端开发要点
- 使用 硬件 SPI 外设(不是 GPIO 模拟)→ 速度快、稳定
- 配置正确的 模式(CPOL/CPHA)、波特率、数据位宽、MSB/LSB
- CS 用 GPIO 软件控制(方便多设备)
- 通信前拉低 CS,通信后拉高 CS
- 初始化时所有 CS 设为高电平(未选中状态)
📌 示例代码(Arduino):
SPI.begin(); // 初始化 SPI
digitalWrite(CS_PIN, LOW); // 选中设备
SPI.transfer(0x03); // 发送命令
byte data = SPI.transfer(0x00); // 收数据
digitalWrite(CS_PIN, HIGH); // 取消选中
✅ 10. 高频考点 & 面试问题
-
SPI 有几种模式?怎么区分?
→ 4 种,由 CPOL 和 CPHA 决定,Mode 0 最常用。 -
SPI 是全双工还是半双工?
→ 全双工(MOSI 和 MISO 可同时收发)。 -
多个 SPI 设备如何连接?
→ SCLK/MOSI/MISO 共享,CS 独立,分时选通。 -
SPI 和 I2C 有什么区别?
→ SPI 速度快、引脚多、无地址;I2C 速度慢、引脚少、有地址、支持多主。 -
SPI 通信失败常见原因?
→ 模式不匹配、CS 未控制好、速率太快、未共地、电压不匹配。
🎯 一句话终极总结:
SPI 是嵌入式世界里的“高速点对点数据通道”,靠 4 根线 + 片选机制 + 时钟同步,实现 MCU 与外设的高效通信 —— 用好它,关键是“模式匹配、片选控制、时序稳定”。
版权声明:
本文为 兰舟比特 原创内容,如需转载,请注明出处及作者,禁止未经授权的引用或商用。
1281

被折叠的 条评论
为什么被折叠?



