多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

【嵌入式底层】SPI超透彻详解:通信原理、四线结构、四种模式、寄存器底层 + 面试全集

【嵌入式底层】SPI超透彻详解:通信原理、四线结构、四种模式、寄存器底层 + 面试全集 前言SPI 是嵌入式开发使用频率最高、速度最快的短距离串行通信总线。Flash、LCD、OLED、SD卡、传感器全部依赖 SPI 通信。很多同学只会 HAL 库调用不懂底层移位原理、不懂四种时钟模式本质、不懂寄存器分工、不懂主从真实数据流向。本篇文章一次性讲透 SPI 所有必考底层知识 工程细节 面试考点。一、SPI 核心通信特性面试必背同步通信SPI 属于同步串行通信。同步含义收发双方共用同一个时钟信号 SCLK所有数据采样、移位全部跟随时钟边沿。对比USART 异步双方各自时钟不需要时钟线SPI 同步主机提供时钟从机严格跟随主机时钟全双工通信SPI 最大特点SPI 天然全双工收发同时进行互不冲突。底层本质主机移位寄存器 和 从机移位寄存器在每个时钟边沿互相交换 1bit 数据。每一个 SCLK 脉冲同时完成两件事自己移出一位数据发出去对方移入一位数据收进来这就是 SPI 为什么速度快、为什么天生全双工 的根本原因。串行通信数据逐比特移位传输不是并行一次性传输。二、SPI 四线硬件结构标准 SPI标准 SPI 一共 4 根线功能完全固定SCLK 时钟线由主机产生从机完全被动跟随时钟决定通信速率、采样边沿MOSI 主机输出、从机输入Master Out Slave In主机 → 从机 数据通道MISO 主机输入、从机输出Master In Slave Out从机 → 主机 数据通道CS / NSS 片选线低电平选中对应从机一从机一CS线未选中时从机 MISO 为高阻态不占用总线补充三线 SPI 是省略 CS / NSS 工程基本不用。三、SPI 主从架构一主多从拓扑结构唯一主机STM32 单片机多个从机Flash、OLED、传感器、其他MCU总线特点SCLK、MOSI、MISO 所有从机共用CS 独立独占每个从机单独一根片选工作逻辑主机拉低某个从机的 CS主机输出 SCLK 时钟对应被选中的从机开始通信未选中从机保持高阻不响应总线优缺点✅ 优点扩展从机极其简单只需多加一根 CS通信速度极快❌ 缺点无应答机制无设备地址纯靠片选区分设备四、SPI 数据传输细节数据宽度标准支持8bit / 16bit工程 99% 场景使用 8bit 传输数据位序MSB / LSBSPI 支持两种移位顺序MSB 先行高位先出绝大多数外设默认Flash、OLED、传感器LSB 先行低位先出极少设备使用需要手册确认位序配置错误数据全部错乱无法通信五、SPI 四种工作模式面试最高频SPI 模式由两个寄存器位决定CPOL 时钟极性CPHA 时钟相位时钟极性Clock Polarity - CPOL定义了时钟信号在空闲状态无数据传输时的电平CPOL 0时钟空闲时为低电平如下图所示。CPOL 1时钟空闲时为高电平如下图所示。在理解时钟相位之前我们先来理解两个概念第一边沿和第二边沿第一边沿一个有效时钟周期开始时的第一个电平跳变边沿第二边沿紧跟第一边沿发生的、方向相反的第二个电平跳变边沿比如时钟相位Clock Phase - CPHA定义了数据在时钟信号的哪个边沿被采样读取、捕获哪个边沿允许数据变化(发送)决定了数据位保持稳定和切换的精确时刻。时钟相位的含义如下CPHA 0数据在时钟的第一边沿被采样(读取)在第二边沿改变数据位(发送)CPHA 1数据在时钟的第一边沿改变数据位(发送)在第二边沿被采样(读取)四种模式对照表重点工程结论市面上 80% 的 SPI 设备默认都是 Mode0六、SPI 底层寄存器架构核心吃透SPI 外设内部真正工作的寄存器分为 三层结构TX-DR 发送数据缓冲区软件写入数据的寄存器CPU 把要发送的数据写入 TX-DR无独立地址写 DR 自动写入 TX-DRRX-DR 接收数据缓冲区存放从机传回的数据无独立地址读 DR 自动读取 RX-DR移位寄存器核心工作单元真正实现全双工比特交换的硬件不占用总线地址软件不可直接操作每一个时钟完成一次 bit 互换对外统一寄存器 DR手册上只有一个 DR 寄存器写 DR → 写入内部 TX-DR读 DR → 读取内部 RX-DR常用关键寄存器SPI_CR1 控制寄存器1CPOL、CPHA 模式配置波特率分频MSB/LSB 位序软件从机管理位SPI_SR 状态寄存器TXE发送空RXNE接收非空OVR接收溢出高频错误SPI_DR 数据寄存器唯一数据交互端口七、SPI 完整一次通信流程主从全流程主机拉低从机 CS选中设备主机 CPU 写数据到 TX-DR数据加载进主机移位寄存器主机输出 SCLK 时钟主从移位寄存器逐比特互换数据8 个时钟结束收发完成移位数据存入各自 RX-DRCPU 读取 DR 获取从机数据主机拉高 CS结束通信关键真相SPI 读数据必须发数据八、SPI 高频面试题必背SPI 是什么通信同步、串行、全双工总线。SPI 为什么是全双工主从各有移位寄存器时钟边沿同时移出、移入天然收发并行。四根线分别作用SCLK主机时钟MOSI主发从收MISO从发主收CS片选选通设备SPI 四种模式怎么区分CPOL 决定空闲电平CPHA 决定采样边沿组合四种模式。SPI 能不能一主多从可以共用三根总线独立 CS 片选。SPI 读数据为什么必须发数据SPI 时钟由主机提供没有时钟就不会有移位不会收到数据读操作必须靠主机发字节产生时钟。SPI 溢出错误 OVR 是什么原因RX-DR 数据未读取新数据覆盖旧数据常见于读取不及时。SPI 和 I2C 区别SPI 更快、全双工、无应答、靠片选I2C 较慢、半双工、有应答、靠设备地址九、总结SPI 是同步全双工串行总线核心是双移位寄存器比特互换四线架构SCLK/MOSI/MISO/CS四种模式由 CPOL、CPHA 组合工程默认 Mode0内部三大数据单元TX-DR、RX-DR、移位寄存器对外只有 DR 一个数据端口读写内部自动路由读必发、时钟主机说了算、一主多从是常态十、SPI通信本质建模结语如果本篇SPI底层讲解对你有帮助欢迎点赞、收藏⭐方便以后复习查阅。内容聚焦嵌入式硬件底层原理持续更新STM32、通信协议、RTOS、面试相关干货。欢迎关注转发给身边一起学嵌入式的小伙伴一起吃透底层少走弯路。有疑问可以评论区留言一起交流探讨
返回列表