SPI 技术系列 00· 总目录
I2C 技术系列 · 持续更新中本系列从推挽电气层一路打到 Linux spi 子系统,把四根线背后的电气/协议/控制器/驱动/实战全拧成一根线。 想系统追更戳这里查看完整专栏【SPI 技术系列】 其他技术系列专栏欢迎关注、交流、共同成长【I2C 技术系列】 【串口技术系列】【RISC-V 架构系列】【Linux内核系列】一句话:SPI 是四根线(MOSI/MISO/SCK/CS)主打高速主从的串行总线。没有 I2C 那套 OD 开漏/仲裁/地址的负担,换来几十 Mbps 的吞吐——Flash、显示屏、高速 ADC 全靠它。本系列像 串口技术系列、 I2C 技术系列那样,从推挽电气层一路打到 Linux spi 子系统,把四根线背后的电气/协议/控制器/驱动/实战全拧成一根线。为什么单独成系列SPI 表面简单——主发时钟,移位收发。但工程坑在高频信号完整性(几十 MHz 上升沿陡,SCL 分布/反射/串扰都冒出来)、CPOL/CPHA 模式错配(四模式,器件手册写法不统一)、多从片选与菊花链(走线拓扑)、QSPI/Octal-SPI(现代 SoC 高吞吐路径)。本系列对标串口/I2C 系列,把电气 → 协议 → 控制器 → 驱动 → 实战五层打通,让你拿到任何 SPI 问题都能定位到具体哪一层。目录一、系列总图二、四层结构第一部分 · 硬件基础层(电气 / 物理)01 SPI 电气特性与物理层02 SPI 信号完整性与时钟分布03 SPI 速度与电气约束第二部分 · 协议与时序层(四根线怎么说话)04 SPI 协议与时序详解(CPOL/CPHA)05 SPI 片选与多从机制06 SPI 数据帧与位序07 双线 / 四线 / 八线(QSPI / Octal-SPI)第三部分 · 驱动实现层(控制器与软件)08 SPI 控制器寄存器与 IP 架构09 SPI 传输模式:轮询 / 中断 / DMA10 SPI 错误处理与恢复11 SPI Linux 驱动框架第四部分 · 应用实战层(落地与排查)12 SPI 设备驱动实战13 SPI 调试与排查14 SPI 排查手册与速查表三、快速索引按问题类型按应用场景四、学习建议对照学习法相关资源一、系列总图L1 硬件基础层 — 电气与物理01 电气特性 / 02 信号完整性与时钟分布 / 03 速度与电气约束L2 协议与时序层 — 四根线怎么说话04 协议时序与CPOL-CPHA / 05 片选与多从机制 / 06 数据帧与位序 / 07 双线四线八线 QSPI-OctalL3 驱动实现层 — 控制器与软件08 控制器寄存器与IP架构 / 09 传输模式-轮询-中断-DMA / 10 错误处理与恢复 / 11 Linux驱动框架L4 应用实战层 — 落地与排查12 设备驱动实战 / 13 调试排查 / 14 排查手册速查二、四层结构第一部分 · 硬件基础层(电气 / 物理)01 SPI 电气特性与物理层推挽(Push-Pull)输出结构(对比 I2C OD 开漏)四线制(MOSI/MISO/SCK/CS)与三线制(无 CS 或双向 DIO)CMOS 电平标准(VIL/VIH/VOL/VOH 容限)驱动能力与扇出(推挽强驱动 vs OD 弱上拉)多电压域电平转换(SPI 专用 TXS/LSF 系列)关键问题:为什么 SPI 能跑几十 MHz 而 I2C 只能几 MHz?推挽 vs 开漏的本质差异。02 SPI 信号完整性与时钟分布高频 SI 判据(SPI 频率高,边沿陡,传输线效应常需考虑)SCK 时钟分布与偏斜(Clock Distribution/Skew,多从时 SCK 到各从时延)临界长度 L_crit ≈ tr × 2.9cm(SPI 几十 MHz 常超临界)反射与终端匹配(源端串联匹配 RS22~33Ω)串扰(SCK ↔ MOSI/MISO,3W 规则与分层)拓扑(星型 vs 菊花链 vs 独立 CS)关键问题:30MHz SPI 走线 15cm,要不要做阻抗匹配?03 SPI 速度与电气约束SPI 频率上限的来源(驱动能力 走线 负载电容 边沿)SCK 周期与移位寄存器建立/保持约束不同模式下 tSU/tHD 要求(数据相对 SCK 采样沿)时钟失真(Jitter/Skew)对高速 SPI 的影响SoC SPI 控制器最高频率 vs 实际可达关键问题:器件标 50MHz,SPI 能不能配 50MHz 跑?第二部分 · 协议与时序层(四根线怎么说话)04 SPI 协议与时序详解(CPOL/CPHA)SPI 移位寄存器原理(主从各一个,首尾相接成环)CPOL(时钟极性):空闲电平 0 还是 1CPHA(时钟相位):第一个沿还是第二个沿采样四模式(Mode 0/1/2/3)对照表与波形MSB first / LSB first(多数 MSB)数据位宽(8/16/32,可配)完整传输时序(CS 拉低 → SCK 跳变 → 移位 → CS 拉高)关键问题:器件手册写 “Mode 0 (CPOL0, CPHA0)”,代码怎么配?05 SPI 片选与多从机制CS 片选的作用(选中从机,使能其 MISO 输出)独立 CS 多从(一主多从,各从独立 CS,星型走线)菊花链多从(Daisy Chain,数据串行穿过各从,共享 CS)菊花链 vs 独立 CS 的取舍(数据流 vs 寻址,延迟 vs 复杂)广播(所有 CS 拉低,同一 MOSI 发,各从同时收)CS 与 I2C 地址的对比(显式寻址 vs 隐式片选)关键问题:菊花链 3 个从机,主发 24 位,各从收到什么?06 SPI 数据帧与位序位序 MSB/LSB 配置字长可配(4~32 位,部分 IP 支持)连续传输 vs 间隔传输(SCK 连续 vs 帧间间隔)CS 拉低到首沿、末沿到 CS 拉高的建立/保持时间多字节 burst 传输(一次 CS 传多字节,Flash 读取常见)命令地址数据帧(Flash 类器件的 SPI 协议层)关键问题:Flash 读 0x03 命令 24bit 地址 N 字节数据,怎么拼?07 双线 / 四线 / 八线(QSPI / Octal-SPI)标准 SPI(1bit: MOSIMISO)Dual-SPI(2bit: DQ0/DQ1 双向,半双工 2 倍速)Quad-SPI(4bit: DQ0~DQ3,4 倍速,Flash 主流)Octal-SPI(8bit: DQ0~DQ7,8 倍速,新 Flash/OSPI)QSPI 协议扩展(指令阶段/地址阶段/数据阶段位宽可配)XIP(Execute In Place,QSPI 直接取指执行)DDR 模式(SCK 上下沿都采样)关键问题:QSPI 怎么实现 4 倍速?XIP 怎么直接执行 Flash 代码?第三部分 · 驱动实现层(控制器与软件)08 SPI 控制器寄存器与 IP 架构控制器 IP 总框图(寄存器组 移位寄存器 分频器 FIFO DMA)核心模块:分频器 / 移位寄存器 / CS 控制 / 中断 DMA主模式状态机(IDLE → CS → SCK 移位 → 完成)通用寄存器组(CON/STAT/DAT/BAUD/CS/INTEN)STM32 SPI 寄存器(CR1/CR2/SR/DR/I2SCFGR)DesignWare SPI 寄存器(SPI_CTRLR0/SPI_CTRLR1/SPI_DR/SPI_SR)RISC-V SoC SPI 差异(芯来/Andes 平台常用 DW 或自研)QSPI 控制器特殊寄存器(指令/地址/数据位宽,DDR 配置)关键问题:配 QSPI 读 Flash,寄存器怎么设?09 SPI 传输模式:轮询 / 中断 / DMA三种模式总览轮询 PIO(写 DR 死等 TXE,读 DR 等 RXNE)中断驱动(TXE/RXNE 中断 状态机)DMA 模式(大块传输,Flash 读取/显示屏刷)DMA 双向难题(同时 TX DMA RX DMA)cache 一致性QSPI DMA 与 XIP关键问题:SPI 读 Flash 4KB,用中断还是 DMA?10 SPI 错误处理与恢复OVERRUN(溢出,CPU 没及时读 DR,数据覆盖)UNDERRUN(欠载,从模式 CPU 没及时填 DR,SCK 空转)MODE_FAULT(主模式错,主机的 CS 被外部拉低)CRC 错(部分 IP 带 CRC,如 STM32 I2S/SPI4)CS 抖动(EMI 导致 CS 误触发)时钟失稳(PLL 切换瞬间 SCK 错乱)超时与恢复(重传 重新初始化)功能安全考量(SPI 通信的端到端保护)关键问题:SPI OVERRUN 怎么检测和恢复?11 SPI Linux 驱动框架Linux SPI 子系统总图(spi_controller/spi_device/spi_driver/spi_transfer/spi_message)四大核心对象(controller/device/driver/transfer)spi_controller spi_bitbang(控制器驱动骨架)spi_driver spi_device(设备驱动骨架,Flash/传感器)spi_message spi_transfer(传输组织,一组 transfer 原子执行)设备树(spi 节点 子节点 regCS 号 compatible)spidev 用户态接口(/dev/spidevN.M ioctl)QSPI/Octal-SPI 在 Linux 下的支持(m25p80/spi-nor/spi-mem)关键问题:Linux 下怎么从用户态读写 SPI Flash?第四部分 · 应用实战层(落地与排查)12 SPI 设备驱动实战W25Q SPI Flash 读写驱动(命令帧/页编程/扇区擦除/读 ID)SD 卡 SPI 模式驱动(SD 协议 SPI 封装)OLED ILI9341 显示驱动(命令数据,刷屏 DMA)高速 ADC(MAX6675/MCP3008)采集传感器(LIS3DH 加速度计)寄存器配置QSPI Flash XIP 启动(固件执行)多设备共 SPI 总线(CS 切换 速率/模式动态配)RTOS 集成与互斥关键问题:SPI Flash 读写 XIP,怎么组织驱动?13 SPI 调试与排查逻辑分析仪解码 SPI(四模式/位序/字长)示波器看 SCK/MOSI/MISO/CS 波形CPOL/CPHA 错配现象(数据全错或全 0)CS 时序问题(建立/保持时间不够)速度过高降速测试spidev 自写工具验证dmesg / ftrace / debugfs关键问题:SPI 读 Flash 全 0xFF,从哪查起?14 SPI 排查手册与速查表故障决策树(不通 → 看电气 → 看 CPOL/CPHA → 看时序 → 看恢复)常见故障速查表CPOL/CPHA 四模式速查QSPI/Octal-SPI 速查器件命令帧速查(Flash/SD/ADC)全系列要点回顾关键问题:一页纸带去现场的 SPI 排查清单是什么?三、快速索引按问题类型你遇到的问题直接看CPOL/CPHA 怎么配[[04-SPI协议与时序详解-CPOL-CPHA]]多从怎么接[[05-SPI片选与多从机制]]SPI 速度上不去[[03-SPI速度与电气约束]] [[02-SPI信号完整性与时钟分布]]QSPI/XIP 怎么搞[[07-SPI双线四线八线-QSPI-Octal]] [[12-SPI设备驱动实战]]OVERRUN 错误[[10-SPI错误处理与恢复]]Linux 怎么读写[[11-SPI Linux驱动框架]] [[12-SPI设备驱动实战]]Flash 读全 0xFF[[13-SPI调试与排查]]波形看不懂[[04-SPI协议与时序详解-CPOL-CPHA]] [[13-SPI调试与排查]]走线要不要匹配[[02-SPI信号完整性与时钟分布]]按应用场景场景重点篇SPI Flash 存储06 / 07 / 11 / 12SPI 显示屏04 / 09 / 12高速 ADC03 / 04 / 09QSPI XIP 启动07 / 08 / 11 / 12多从总线05 / 02Linux BSP11 / 12 / 13RTOS 裸机08 / 09 / 12功能安全10 / 14四、学习建议嵌入式视角:你的学习路径建议:快速过01-04(电气协议,确认无盲区)重点啃02/07(SI 时钟分布 QSPI)必学11/12(Linux SPI 子系统 Flash 驱动,BSP 主场)常备13/14(排查手册,工作触达回查)对照学习法概念SPII2CUART(串口)CAN线数4(MOSI/MISO/SCK/CS)2(SDA/SCL)2(TX/RX)2(CANH/CANL)同步同步(共享 SCK)同步(共享 SCL)异步同步(位填充)拓扑一主多从多主多从总线点对点多主总线电气推挽 CMOSOD 开漏 上拉RS232/485/TTL差分速度几十 M100k-3.4M9.6k-12M1M(FD 8M)应答无(主单向发)ACK/NACK无ACK 位寻址CS 片选7bit 地址无(点对点)11/29bit ID仲裁无(单主)线与仲裁无CSMA/CDNBA主战场Flash/显示/ADC传感器/EEPROM调试/Bootloader汽车/工业相关资源串口技术系列 —— 对照系列(异步总线)I2C 技术系列 —— 对照系列(OD 开漏同步总线)Linux内核专题/11-驱动框架 platform-char-misc-设备树 —— platform 驱动骨架RISC-V架构专题 —— RISC-V SoC 的 SPI IP✨ 感谢你的阅读 ✨技术之路漫漫分享是为了更好地交流。如果本文的内容对你有启发希望能得到你的支持 点赞|⭐ 收藏| 关注如果你在调试过程中遇到了其他问题欢迎在评论区 留言我们一起探讨。关注我一起交流底层开发的那些事儿

相关新闻

无监督单图三维重建:概率对称与可微渲染实战解析

无监督单图三维重建:概率对称与可微渲染实战解析

1. 项目背景与核心问题拆解1.1 这篇论文到底想解决什么问题单张图片重建三维物体,这个方向在计算机视觉里已经不算新鲜事了。但真正做过的人都知道,这里有个绕不开的坎:监督信号从哪来。用合成数据训练,模型到了真实照片上就拉胯&…

2026/10/15 16:44:52 阅读更多 →
AForge.NET 2.2.2实战指南:图像处理与DirectShow摄像头采集

AForge.NET 2.2.2实战指南:图像处理与DirectShow摄像头采集

简介:AForge.NET Framework 2.2.2 是一套面向 C# 开发者的计算机视觉与人工智能综合类库,覆盖图像处理、神经网络、遗传算法、机器学习、机器人控制等方向。该版本是 AForge 系列较新的正式发布版,官方定位适用于学术研究、教学实验和工业原型…

2026/10/15 16:44:52 阅读更多 →
MATLAB卫星姿态控制飞轮PID仿真全解析:建模、调参与避坑

MATLAB卫星姿态控制飞轮PID仿真全解析:建模、调参与避坑

简介:这是一套基于MATLAB的卫星姿态控制系统学习资源,采用飞轮作为执行机构,配合PID控制算法完成三轴姿态稳定控制。资料面向航天器工程与控制理论的初学者,也适合用作课程设计或毕业设计的参考项目。通过飞轮角动量交换与PID反馈…

2026/10/15 16:43:52 阅读更多 →

最新新闻

herdr-gpui Teleport 深度解析:带着未提交改动、运行中进程和 Agent 会话跨主机迁移工作树

herdr-gpui Teleport 深度解析:带着未提交改动、运行中进程和 Agent 会话跨主机迁移工作树

【免费下载链接】herdr-gpui Native client for Herdr on macOS, Linux, and Windows, built with Rust and GPUI. View terminal sessions, workspaces, Git worktrees, and agent activity through your local Herdr daemon. 项目地址: https://gitcode.com/gh_mi…

2026/10/15 17:31:51 阅读更多 →
共享儿女填补孤独缺口,却替代不了子女的那通电话

共享儿女填补孤独缺口,却替代不了子女的那通电话

(知潮网)它能递给老人一把伞,却补不上子女那通电话——共享陪伴是温情,还是被明码标价的生意? 晚上七点,很多家庭的厨房里,菜凉了,筷子摆了两双,最后一双始终没动过。不是…

2026/10/15 17:31:51 阅读更多 →
Aspose.Words.Cpp 18.11:无Office依赖的C++原生Word文档处理库

Aspose.Words.Cpp 18.11:无Office依赖的C++原生Word文档处理库

简介:Aspose.Words.Cpp_18.11.zip 是面向C开发者的专业级Word文档处理SDK资源包,适用于需在无Office依赖环境下实现文档自动化生成、编辑、格式转换与批量邮件合并的中高级开发场景。资源共1150个文件,涵盖1082个头文件(h&#xf…

2026/10/15 17:31:51 阅读更多 →
Flutter时间解析避坑指南:DateTime.parse与millisecondsSinceEpoch本质解析

Flutter时间解析避坑指南:DateTime.parse与millisecondsSinceEpoch本质解析

1. 为什么看似简单的字符串转时间,却让 Flutter 开发者反复栽跟头?在某跨平台系统重构项目中,我接手了一个已上线半年的订单时间展示模块。用户反馈“部分订单时间显示为 1970-01-01”,后台日志里却明确记录着2023-08-15T14:22:37…

2026/10/15 17:31:51 阅读更多 →
Matlab概率分布与分位数实战:从选型到异常值检测

Matlab概率分布与分位数实战:从选型到异常值检测

1. 从"这组数据像什么形状"开始聊概率分布做数据分析的人都有一个共同的体会:拿到一组数据,第一件事往往不是算均值方差,而是先画个直方图看看它长什么样。这个"长什么样",在统计学里有个正式的名字&#xff…

2026/10/15 17:31:51 阅读更多 →
C++运算符避坑指南:从整数除法到短路求值,这些细节你注意了吗?

C++运算符避坑指南:从整数除法到短路求值,这些细节你注意了吗?

1. 为什么运算符值得单独写一篇笔记 刚学 C 那会儿,我总觉得运算符这东西太基础了,加减乘除谁不会啊,翻书的时候都是直接跳过的。直到后来在项目里踩了几个不大不小的坑——比如整数除法把小数部分悄悄吃掉导致金额计算差了几分钱、自增运算符…

2026/10/15 17:30:51 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →