十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

一文读懂 SPI 总线:时序原理、电气特性与驱动开发全解析

一文读懂 SPI 总线:时序原理、电气特性与驱动开发全解析 文章摘要SPISerial Peripheral Interface是嵌入式开发中最常用的高速通信总线之一也是大厂面试的高频考点。本文从通信时序、电气特性、驱动开发三个层面系统梳理 SPI 的核心原理与工程实践涵盖 CPOL/CPHA 四种模式、边发边收机制、MISO 三态问题、信号完整性设计以及硬件/软件 SPI 的驱动实现与参数配置等关键内容帮助你在面试与日常开发中真正做到知其然更知其所以然。文章目录文章摘要本栏系列文章其他专栏精品文章前言一、SPI 基础概念与时序1.1 SPI 是什么1.2 边发边收1.3 SPI 时序CPOL 与 CPHA1.4 边沿读取与 M/LSB1.5 建立时间与保持时间二、电气属性与硬件设计2.1 电气模型2.2 拓扑结构2.3 硬件设计核心注意事项1走线长度最重要2信号完整性Signal Integrity3CS片选设计4MISO 三态问题非常关键5上拉6地线问题7电平匹配非常重要三、驱动开发与调试3.1 硬件 SPI 与软件 SPI3.2 硬件 SPI 初始化3.3 软件 SPI 初始化3.4 附MCU 外设 API 设计思路总结本栏系列文章学透CANFD看这个就行(四): 错误帧、位填充、采样点与通信负荷其他专栏精品文章CSDN高赞项目工程训练竞赛之垃圾分类垃圾桶前言SPI 和 IIC 几乎是一定会被问到的两门总线协议而 SPI 又因为模式多、速率高、坑更多考察的深度往往比 IIC 更上一层。SPI 看起来只是四根线但真正能讲清楚的人并不多你知道 CPOL 和 CPHA 到底分别决定什么吗四种模式能否张口就画出来为什么读数据时也要发一个空字节多从机共线时 MISO 为什么要三态信号反射了怎么处理这篇文章结合我自己的工程经验把 SPI 的知识体系完整梳理出来重点覆盖面试中容易被追问的几个方向时序层面CPOL/CPHA 四种模式、边发边收、M/LSB、建立/保持时间电气层面推挽驱动、走线长度、信号完整性、MISO 三态、电平匹配驱动层面硬件 SPI 与软件 SPI 的初始化、参数结构体配置、API 设计思路。无论你是正在备战嵌入式面试的求职者还是希望系统巩固 SPI 基础的同学相信这篇文章都能帮你建立起完整的知识框架。一、SPI 基础概念与时序1.1 SPI 是什么SPISerial Peripheral Interface是 MCU 和外设之间的一种同步串行通信方式。它的核心逻辑是主机发时钟从机跟着时钟一位一位收发数据。与 IIC 不同的是SPI 通信不是靠地址找设备而是靠 CS 片选线找设备。SPI 由四根信号线组成信号线含义方向SCLK时钟线主机输出MOSI主机发送、从机接收主 → 从MISO从机发送、主机接收从 → 主CS片选线主机输出1.2 边发边收SPI 的一个显著特点是边发边收哪怕你只是想读数据通常也要发送一个空字节比如0xFF或0x00用来产生时钟。在驱动库封装时可以把CS 操作单独封装尽量不与字节交换耦合这样在多从机场景下复用性更好。例如MCU 要给外设发送0x9F一次完整的通信流程是CS 拉低 - MOSI 发送 0x9F - SCLK 输出 8 个时钟 - MISO 返回 1 个字节 - CS 拉高1.3 SPI 时序CPOL 与 CPHASPI 的时序本质只控制两件事-时钟空闲时是高还是低CPOL-在第几个边沿采样数据CPHA。其中-CPOLClock Polarity时钟极性决定时钟初始状态-CPHAClock Phase时钟相位决定在上升沿还是下降沿读数据。主机同样也是在边沿进行数据发送的。每个时钟都有两个边沿上升沿、下降沿SPI 时钟只能在边沿读数据。当 CPOL 0 时第一个边沿为上升沿。CPOL 取值CPOL时钟空闲状态0空闲时 SCLK 0低电平1空闲时 SCLK 1高电平CPHA 取值CPHA数据采样时刻0第一个边沿采样1第二个边沿采样由 CPOL 与 CPHA 组合出四种工作模式模式CPOLCPHA时钟空闲电平采样边沿数据变化边沿Mode 000低上升沿第 1 边沿下降沿Mode 101低下降沿第 2 边沿上升沿Mode 210高下降沿第 1 边沿上升沿Mode 311高上升沿第 2 边沿下降沿记忆口诀CPOL 看空闲电平CPHA 看采样在第几个边沿。Mode 0CPOL0, CPHA0最常用也是相对最稳定的一种配置。1.4 边沿读取与 M/LSBSPI 不是一次把整个字节发出去而是按 bit 发送与读取。SPI 更像一个移位寄存器接口按照 CLK 进行移入移出数据因此提供 M/LSB 配置。-MSBMost Significant Bit first高位在前-LSBLeast Significant Bit first低位在前。通常使用MSB 模式且需要注意- 如果是主从 MCU 通信M/LSB 必须设置一致- 如果从机是传感器数据手册会标注它属于 M/LSB 哪一种。对比 I2CI2C 协议本身就规定 MSB 模式没有 M/LSB 配置选项而 SPI 提供可配置选项。关于采样边沿的深入理解CPHA 决定在第几个边沿进行采样这个采样不仅代表主机对从机数据的采样也包含从机对主机数据的采样。因此在另一个边沿开始时主机与从机将对 MISO 与 MOSI 进行数据更新理想情况下MOSI 与 MISO 的数据会从准备数据的边沿一直维持到下一个准备数据的边沿。1.5 建立时间与保持时间建立时间Setup Time采样之前数据必须提前稳定的最短时间。在 SPI 里的意义是——上升沿之前的一段时间MOSI 必须已经稳定保持时间Hold Time采样之后数据还必须继续保持稳定的最短时间。即采样之后的一小段时间内数据必须保持不变。SPI 数据正确的本质发送端在一个边沿改变数据使数据在另一个边沿采样时满足 setup/hold 时间从而保证采样点处的数据是稳定的逻辑电平。二、电气属性与硬件设计2.1 电气模型SPI 的本质是推挽高速数字信号 同步时钟总线即 MOSI / SCLK 是推挽驱动区别于 IIC 的开漏 上拉。由于是推挽驱动SPI 可以跑得很快速率说明几 MHz ~ 20 MHz常规场景50 MHz较高速度100 MHz短线等严格条件下可达但因为 SPI 是单端对地信号抗干扰能力一般。2.2 拓扑结构除主从机一对一外SPI 常见的拓扑是总线CLK、MOSI、MISO被多从机共享CS 用于独立控制各个从机。例如出现 8 路一样的 ADC 时如果采样率允许可以使用软件 SPI甚至可以共用 MOSI、CLK、CS然后各个设备回传的 ADC 数据分别走各自的 MISO。关键点如果存在多个从机共用 MISO 的情况MISO 必须处于三态高阻。2.3 硬件设计核心注意事项1走线长度最重要速率走线要求低速1 MHz可以几十 cm板上随便走中速5~20 MHz走线尽量短、不要绕远、避免跨分割地高速50 MHz控制阻抗、走线等长可选、加地参考层2信号完整性Signal Integrity边沿太快会出现信号反射导致波形振铃、过冲、下冲。解决方法串联电阻MCU ---[22Ω~47Ω]--- SPI 线降低上升沿速度、抑制反射缩短走线SPI 的第一优化永远是缩短距离增加地平面SPI 参考地必须完整GND plane 必须连续避免跨分割。3CS片选设计CS 必须使用独立 GPIOCS 拉低后必须稳定一段时间不能乱跳。4MISO 三态问题非常关键多从机状态下只有一个从机能驱动 MISO其他从机都必须是高阻态。5上拉MOSI / SCLK不需要上拉推挽驱动CS需要上拉防止上电误触发。6地线问题SPI 是高速单端信号必须保证MCU 和从机 GND共地地线低阻抗不要长回流路径。7电平匹配非常重要MCU 通常是 3.3V而从机可能是 1.8V 或 5V需要使用电平转换芯片或确认 IO 是tolerant IO容忍电平。三、驱动开发与调试3.1 硬件 SPI 与软件 SPISPI 驱动也可以划分成两类硬件 SPI借助 MCU 片上的 SPI 外设实现软件 SPI通过控制 GPIO 实现。无论硬件 SPI 还是软件 SPI驱动部分核心都可划分成初始化部分、写字节、读字节。3.2 硬件 SPI 初始化基本流程为使能 SPI初始化 GPIO打开 AF 时钟打开 SPI 时钟处理重映射相关 GPIO封装时考虑用弱函数处理这部分复位 SPI初始化 SPI 参数使能 SPI。芯片固件中的 SPI 初始化一般基于**「结构体 初始化函数」**通常需要配置以下参数① 传输模式用于 MCU 进一步裁剪 SPI 通信模式常见模式如下模式说明全双工同时收发最常用全双工只接收仍需初始化 MOSI只是硬件上不再发出数据半双工双向只接收 / 只发送数据线只有一根 SDI 或 SDO需将 MOSI/MISO 中一个引脚配置为数据线另一个引脚释放设为 GPIO 或悬空具体取决于芯片手册② 主从模式确认通信为主机还是从机。③ 帧宽度确定一帧的宽度通常设置为 8bit对于某些大数据量场景如读取外置 Flash可配置为 16bit。④ 时钟极性与时钟相位CPOL/CPHA确定空闲时时钟线的电平并决定在第几个边沿采样。⑤ 时钟分频系数与 IIC 直接配置速率不同SPI 通过时钟分频来确定 clk 频率且分频系数最小为 2因为数据传输时其他状态机需要时间吞吐数据。⑥ 片选类型通常有软件片选与硬件片选。作为主机收发时通常使用软件片选作为从机接收时使用硬件片选。⑦ M/LSB决定字节发送时 bit 序号一般用 MSB且主从机需要一致。3.3 软件 SPI 初始化软件 SPI 的初始化更简洁只需初始化对应的 GPIOCS、MOSI、SCK初始化成推挽输出其中 CS 需要先输出为高MISO配置为浮空输入。3.4 附MCU 外设 API 设计思路MCU 外设的 API 设计基本只看 2 个维度配置复杂度参数多不多是否运行态状态机。基于这两个维度常见外设的 API 风格推荐如下外设类型推荐 API 风格原因GPIO函数式配置极少UART函数 / 结构体混合中等复杂SPI结构体参数组合多I2C函数式状态机驱动ADC结构体多通道 采样配置复杂DAC函数式配置简单TIMER结构体模式复杂PWM / 输入捕获DMA结构体描述符复杂CAN结构体报文 过滤器复杂USB高度结构体协议栈复杂WDT函数式极简单EXTI函数式配置少总结本文从三个维度系统地梳理了 SPI 总线通信时序理解 SPI「主机发时钟、CS 选设备、边发边收」的核心逻辑掌握 CPOL/CPHA 四种工作模式、M/LSB 配置以及建立时间与保持时间对采样稳定性的影响电气特性SPI 是推挽高速单端信号重点关注走线长度、信号完整性、MISO 三态、CS 上拉、共地与电平匹配等硬件设计要点驱动开发掌握硬件 SPI 的初始化流程与参数结构体配置传输模式、帧宽度、分频系数、片选类型等、软件 SPI 的 GPIO 初始化以及外设 API 设计的一般思路。掌握以上内容基本可以应对绝大多数 SPI 相关的开发与调试场景也能在面试中从容应对各种追问。希望本文对你有帮助欢迎交流讨论
返回列表