【通信协议】SPI 串行外设接口(一篇掌握核心知识点)

💌 所属专栏:【通信协议】
😀 作  者:兰舟比特 🐾
🚀 个人简介:热爱开源系统与嵌入式技术,专注 Linux、网络通信、编程技巧、面试总结与软件工具分享,持续输出实用干货!
💡 欢迎大家:这里是兰舟比特的技术小站,喜欢的话请点赞、收藏、评论三连击!有问题欢迎留言交流😘😘😘


🧠 SPI 串行外设接口 —— 一文通吃常用知识点


✅ 1. 什么是 SPI?

SPI(Serial Peripheral Interface) 是一种同步、全双工、主从式串行通信协议,用于 MCU 与外设(传感器、存储器、屏幕等)之间高速数据传输。

📌 特点:

  • 由 Motorola 在 1980 年代提出
  • 无起始/停止位,无校验位 → 速度快
  • 通常 4 根线:SCLK、MOSI、MISO、SS/CS
  • 适合板内短距离通信(< 10cm)

✅ 2. SPI 四根核心信号线

信号全称方向作用
SCLKSerial Clock主机 → 从机时钟线,由主机产生,同步数据
MOSIMaster Out Slave In主机 → 从机主机发送数据给从机
MISOMaster In Slave Out从机 → 主机从机发送数据给主机
SS/CSSlave Select / Chip Select主机 → 从机片选线,低电平选中从机

⚠️ 注意:有些设备支持“3线 SPI”(半双工,MOSI/MISO 合并),但标准是 4 线全双工。


✅ 3. SPI 工作模式(4种)—— 必考重点!

CPOL(时钟极性)CPHA(时钟相位) 决定:

模式CPOLCPHA空闲电平采样边沿口诀
Mode 000低电平上升沿采样✅ 最常用:“蹲着第一拍读”
Mode 101低电平下降沿采样“蹲着第二拍读”
Mode 210高电平下降沿采样“站着第一拍读”
Mode 311高电平上升沿采样“站着第二拍读”

📌 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、AT25SF081SPI Flash,存固件/数据
显示屏SSD1306、ILI9341OLED / TFT 屏幕驱动
ADC/DACMCP3008、MCP4921模拟量采集/输出
SD卡MicroSD(SPI模式)文件存储
无线模块nRF24L012.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. 高频考点 & 面试问题

  1. SPI 有几种模式?怎么区分?
    → 4 种,由 CPOL 和 CPHA 决定,Mode 0 最常用。

  2. SPI 是全双工还是半双工?
    → 全双工(MOSI 和 MISO 可同时收发)。

  3. 多个 SPI 设备如何连接?
    → SCLK/MOSI/MISO 共享,CS 独立,分时选通。

  4. SPI 和 I2C 有什么区别?
    → SPI 速度快、引脚多、无地址;I2C 速度慢、引脚少、有地址、支持多主。

  5. SPI 通信失败常见原因?
    → 模式不匹配、CS 未控制好、速率太快、未共地、电压不匹配。


🎯 一句话终极总结:

SPI 是嵌入式世界里的“高速点对点数据通道”,靠 4 根线 + 片选机制 + 时钟同步,实现 MCU 与外设的高效通信 —— 用好它,关键是“模式匹配、片选控制、时序稳定”。


版权声明:

本文为 兰舟比特 原创内容,如需转载,请注明出处及作者,禁止未经授权的引用或商用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兰舟比特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值