3.3 SPI 高速总线与设备级联


3.3 SPI 高速总线与设备级联

本节摘要:SPI 是微控制器上最快的常用总线:几十兆赫兹的时钟、全双工的收发、简单到近乎赤裸的移位寄存器协议。速度的另一面是对时序与信号完整性的苛刻。本节讲清四根线的分工与四种时钟模式的区别,给出多设备共享总线的两种拓扑,并用"SD 卡与彩屏共线"的真实案例演示高速总线的典型冲突与解法。

I2C 一节结束时我们掌握了"两线挂多机"的低速方案;当需求变成"往彩屏刷一帧图"或"从 SD 卡连续读扇区",每秒千字节级的 I2C 就成了瓶颈。SPI 正是为这类需求而生——它是第 3 章速度天平上最快的那个砝码,也是存储、屏幕、高速 ADC 背后的通用接口。

SPI 的四根线各司其职

SCK 是时钟,由主机单方面提供——SPI 没有协商,没有应答,主机打拍子,数据就流动。MOSI(主出从入)与 MISO(从出主入)各管一个方向,构成全双工:发一个字节的同一时刻也收一个字节,即便你只需要单向,移位寄存器也会转满一圈。CS(片选)是点名线,每个从机独占一根:拉低即被选中,拉高即退场。

没有应答机制是 SPI 的性格:它把协议做薄到极致,速度上不封顶,代价是"发没发到"全靠上层自己保证。与之配套的是四种时钟模式——时钟平时是高是低(CPOL),在上升沿还是下降沿采样(CPHA)。四种组合对应四类器件习惯,接错模式的典型症状是"收到的数据全部错位或整体移了一位"。查设备手册的第一张时序图,找"数据在哪个边沿被采样"那句话,模式就定了。

图:共享总线与菊花链两种级联拓扑

图:共享总线与菊花链两种级联拓扑

频率多高算"太高"

SPI 的时钟上限不取决于芯片标称值,而取决于整条物理链路的质量。芯片能跑 50MHz,不代表你的杜邦线能跑。判断链条分三步:第一步看器件手册的最低要求与最高承受;第二步看线缆——面包板加杜邦线在 8MHz 以上就开始不可靠,PCB 短走线轻松跑几十兆;第三步看共存设备——共享总线的频率取所有设备中最慢者的承受值,除非用事务切换频率。

#include <SPI.h> // 多设备共线时的标准事务写法:频率与模式只在事务内生效 void readSdSector() { SPI.beginTransaction(SPISettings(25000000, MSBFIRST, SPI_MODE0)); // SD 卡 25MHz 模式0 digitalWrite(SD_CS, LOW); SPI.transfer(0x00); // 命令字节等 digitalWrite(SD_CS, HIGH); SPI.endTransaction(); // 交还总线配置 SPI.beginTransaction(SPISettings(40000000, MSBFIRST, SPI_MODE0)); // 屏 40MHz digitalWrite(TFT_CS, LOW); SPI.transfer16(0x2C00); // 写显存命令 digitalWrite(TFT_CS, HIGH); SPI.endTransaction(); }

beginTransaction 与 endTransaction 之间的窗口就是"本设备的专属时段":频率、位序、模式随事务生效、随事务释放。这段结构的价值在于两台速率与模式都不同的设备可以安全共享三条线——事务机制替你记住并切换配置。

案例:SD 卡与彩屏共线,刷屏就读不出卡

背景:数据记录仪用同一组 SPI 线接 SD 卡与 TFT 屏。单独测试各自正常;合体后出现诡异规律:刷屏越频繁,写卡失败率越高,失败信息是"初始化通过、写入超时"。

操作:先用逻辑分析仪抓总线,发现刷屏期间 SD 卡片选也出现低电平脉冲——屏的驱动库在某些绘制路径上误操作了全局片选配置,把总线配置改成屏的模式后没有复原,SD 卡在错误配置下收到本不属于它的时钟沿。进一步确认两设备模式其实相同(都是模式 0),但屏驱动把频率全局设成了 40MHz,而 SD 卡在初始化后只保证 25MHz 稳定——高速时钟打给了慢设备。

结果:把两个驱动统一改成事务写法(如上代码),屏保持 40MHz、卡保持 25MHz,写入失败率归零。

解读:SPI 共线的全部纪律可以压缩成一句话:任何时刻总线参数必须与当前片选的设备匹配。全局 setBitOrder 一类的旧式调用正是事故源头——它们改的是"总线"而不是"事务",一处设置、全车遭殃。库与库合用总线时,事务机制是唯一自洽的秩序。

变式:若两台设备必须同时工作(屏持续刷新、卡持续写入),共享总线就不再合适——给它们各自分配独立的 SPI 控制器(ESP32 与 Pico 都有两条以上硬件 SPI),或给慢速设备挪去 I2C,用空间换秩序。

⚠️ 常见坑:MISO 是双向总线,未被片选的设备必须让 MISO 呈高阻态——个别老芯片做不到,会与当前设备"抢话筒",表现为读到的数据是两台设备的按位叠加。手册里查"高阻"或"三态"关键词,没有就别共线。

💡 关键直觉:SPI 的设计哲学是"用引脚数换确定性"。引脚管够时它是最好用的总线;引脚紧张时,先想想菊花链,再想想是不是该换 I2C。

高速总线的实测与布线清单

频率上限不能靠猜,布线与实测各留一张清单。布线侧:时钟线远离复位线与模拟前端,长度尽量短且等长于数据线;每个从设备的电源脚就近去耦;片选线不要与时钟线平行走长距离,避免串扰出幽灵片选。实测侧:先从保守频率(如 4MHz)跑通全功能,再逐级翻倍,每级跑够数据量并校验内容(写入再读回比对哈希);出现第一字节数据正常、后续字节错位的症状,优先怀疑模式不匹配或采样沿选错,而不是频率过高。

还有一条容易被忽略的时序细节:片选拉低到第一个时钟沿之间、最后一个时钟沿到片选拉高之间,多数器件手册规定了最小建立与保持时间。跑高速时用逻辑分析仪量一下这两个间隙,很多"玄机"其实在几十纳秒的间隙里。把这套流程走一遍,你的板子能跑多高频率就有了实测数字,而不是手册抄来的胆量。

本节要点回顾

  • 四根线各司其职:主机单方面供时钟,全双工移位,片选点名,协议薄到极致;
  • 四种时钟模式跟着器件手册走,"哪个边沿采样"一句话定模式;
  • 多设备两种拓扑:独立片选求快求独立,菊花链省脚但延迟叠加;
  • 频率上限由链路质量决定:面包板 8MHz 出头就到顶,共线频率取最慢设备;
  • 事务机制是共线的秩序:频率、模式、位序只在事务窗口内生效。

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U