
I2C 技术系列 · 持续更新中本系列从推挽电气层一路打到 Linux spi 子系统,把四根线背后的电气/协议/控制器/驱动/实战全拧成一根线。 想系统追更戳这里查看完整专栏【SPI 技术系列】 其他技术系列专栏欢迎关注、交流、共同成长【I2C 技术系列】 【串口技术系列】【RISC-V 架构系列】【Linux内核系列】本篇定位:SPI 的速度上限、驱动方式、走线规则全由物理层决定。本篇讲清推挽输出、CMOS 电平、四线制/三线制、多电压域转换——和 I2C OD 开漏形成鲜明对比。读完你明白为什么 SPI 能跑几十 MHz 而 I2C 只能几 MHz。推挽是 SPI 速度优势的物理根源I2C 用 OD 开漏,高电平靠上拉电阻慢慢拉,tr 受 Rp×Cb 限制;SPI 用推挽,上拉/下拉都有管子硬驱动,tr 可几纳秒,所以能跑几十 MHz。这一篇开篇就要把推挽 vs 开漏吃透,这是 SPI 一切特性的起点。对照 【I2C 技术系列 01】I2C 电气特性与物理层 一起看。目录一、推挽输出结构1.1 推挽电路原理1.2 推挽 vs 开漏(OD)对比1.3 推挽的边沿速度二、四线制与三线制2.1 标准四线制2.2 三线制(双向数据)2.3 多从四线制(独立 CS)2.4 CS 的作用三、CMOS 电平标准3.1 CMOS 电平阈值3.2 TTL vs CMOS3.3 不同 VDD 的电平3.4 混压连接风险四、驱动能力与扇出4.1 驱动能力4.2 扇出4.3 负载电容对速度的影响五、多电压域电平转换5.1 为什么需要电平转换5.2 SPI 电平转换器件5.3 MOSFET 桥(单线,I2C 那套)5.4 电平转换的时序影响六、SPI vs I2C 物理层对比七、关键问题 QAQ1:为什么 SPI 不能像 I2C 那样多主?Q2:SPI 的 MISO 为什么可以多从共享?Q3:3.3V 主机直接连 1.8V Flash 行不行?Q4:SPI 速度比 I2C 快,具体快在哪?Q5:SPI 不需要上拉电阻吗?Q6:SPI 的 CS 能不能用 GPIO 软控?八、实战案例案例 1:3.3V 主机直连 1.8V Flash,Flash 损坏案例 2:多从 MISO 冲突,数据错乱案例 3:SPI 速度上不去,50MHz 报错案例 4:CS 浮空导致从机误触发案例 5:TTL 器件接 CMOS,电平不匹配九、本篇小结与速查核心要点速查表电气参数速查(3.3V CMOS)延伸阅读参考资料一、推挽输出结构1.1 推挽电路原理VDD │ ┌──┴──┐ │ │ PMOS │ ← 上管(P 沟道) │ │ └──┬──┘ ├──── 输出 ┌──┴──┐ │ │ NMOS │ ← 下管(N 沟道) │ │ └──┬──┘ │ GND输出高:PMOS 导通,NMOS 关断 → VDD 强驱动输出低:NMOS 导通,PMOS 关断 → GND 强驱动两管交替导通,任一时刻输出都硬连到 VDD 或 GND1.2 推挽 vs 开漏(OD)对比特性推挽(Push-Pull)开漏(Open-Drain)高电平驱动PMOS 强拉 VDD外部上拉电阻拉低电平驱动NMOS 强拉 GNDNMOS 拉 GND上升沿 tr几 ns(强驱动)由 Rp×Cb 决定(几百 ns)速度几十 MHz几 MHz(400pF 限制)线与不行(冲突会短路)可以(只拉低)多主不支持(推挽冲突)支持(线与仲裁)多电压域需电平转换上拉到目标电压即可典型总线SPI / UART(TTL)I2C / SMBus推挽不能线与两个推挽输出接同一根线,一个输出高(PMOS 通)一个输出低(NMOS 通),会形成 VDD→PMOS→NMOS→GND 的直通电流,可能烧管。所以 SPI 不能像 I2C 那样多主共享数据线,主从结构是一主多从,主机推挽发 MOSI,从机推挽发 MISO,各走各的线。1.3 推挽的边沿速度推挽驱动能力:几 mA 到几十 mA负载电容小(单从 短线):tr 可 5ns负载电容大(多从 长线):tr 增大,但仍远快于 OD这就是 SPI 能跑 50MHz 的物理基础二、四线制与三线制2.1 标准四线制主 Master 从 Slave ┌───────┐ ┌───────┐ │ SCK ─┼───────────────────┼─ SCK │ │ MOSI ─┼───────────────────┼─ MOSI │ (主出从入) │ MISO ─┼───────────────────┼─ MISO │ (主入从出) │ CS ─┼───────────────────┼─ CS │ (片选) └───────┘ └───────┘SCK:主机发的时钟(同步)MOSI(Master Out Slave In):主发从收MISO(Master In Slave Out):从发主收CS(Chip Select / SS / NSS):主机选中从机(低有效)四线制是 SPI 最常见配置,全双工(同时收发)。2.2 三线制(双向数据)主 Master 从 Slave ┌───────┐ ┌───────┐ │ SCK ─┼───────────────────┼─ SCK │ │ SISO ─┼─────┬─────────────┼─ SISO │ (双向,半双工) │ CS ─┼───────────────────┼─ CS │ └───────┘ ↑ └───────┘ 方向切换数据线双向(MOSI 和 MISO 合一,叫 SISO 或 DIO)半双工(任一时刻只发或只收)优势:省一根线(引脚紧张时)典型:部分传感器 / 智能传感器 / TI 的某些器件2.3 多从四线制(独立 CS)Master ├─ SCK ────┬───────┬───────┐ │ │ │ │ ├─ MOSI ───┬───────┬───────┐ │ │ │ │ ├─ MISO ───┬───────┬───────┤ │ │ │ │ ├─ CS0 ────┤ │ │ → 从0 ├─ CS1 ────┼───────┤ │ → 从1 ├─ CS2 ────┼───────┴───────┤ → 从2SCK/MOSI/MISO 三线共享每个从机独占一根 CS主机拉低某 CS 选中对应从机详见 [[05-SPI片选与多从机制]]2.4 CS 的作用选中从机:CS 拉低,从机 MISO 输出使能未选中的从机:MISO 高阻(不影响总线)帧同步:CS 下降沿标志传输开始,上升沿标志结束CS 是 SPI 的寻址机制(对比 I2C 的 7bit 地址)嵌入式视角:CS 让多从变得简单I2C 多从靠地址,要器件地址不冲突;SPI 多从靠 CS,只要主机有够多 GPIO 当 CS,从机地址随便。所以 SPI 适合Flash 显示屏 ADC这种异构多器件场景,不用管地址冲突。代价是走线多(每从一根 CS)。三、CMOS 电平标准3.1 CMOS 电平阈值参数含义典型(VDD3.3V)VOH(min)输出高电平最小VDD - 0.1 3.2VVOL(max)输出低电平最大0.1VVIH(min)输入高电平最小0.7 × VDD 2.31VVIL(max)输入低电平最大0.3 × VDD 0.99VCMOS 输出摆幅接近满幅(VDD 到 GND)输入阈值按 VDD 比例(0.3/0.7),跟随 VDD噪声容限:高电平 NMH VOH - VIH 3.2 - 2.31 0.89V;低电平 NML VIL - VOL 0.99 - 0.1 0.89V3.2 TTL vs CMOS特性TTL(5V)CMOSVIH2.0V0.7 VDDVIL0.8V0.3 VDD摆幅不满幅接近满幅功耗静态大静态小现代 SPI 器件多为 CMOS(3.3V/1.8V)TTL 器件接 CMOS 要注意 VIH(TTL 2.0V CMOS 0.7 VDD2.31V,可能误判)3.3 不同 VDD 的电平VDDVIH(0.7VDD)VIL(0.3VDD)5.0V3.5V1.5V3.3V2.31V0.99V1.8V1.26V0.54VVDD 越低,噪声容限越小,抗干扰越差1.8V SPI 噪声容限仅 0.5V 左右,PCB 要更讲究3.4 混压连接风险3.3V 主机连 1.8V 从机:3.3V 信号可能损坏 1.8V 器件1.8V 主机连 3.3V 从机:1.8V 高电平可能达不到 3.3V 的 VIH(2.31V),误判必须用电平转换四、驱动能力与扇出4.1 驱动能力推挽输出驱动电流:±4mA ~ ±20mA(看器件)高频时驱动容性负载需要电流:I C × dV/dt例:50MHz,1ns 边沿,30pF 负载:I 30pF × 3.3V / 1ns ≈ 100mA(瞬时)所以高速 SPI 器件驱动能力要强4.2 扇出扇出 一个输出能驱动多少个输入CMOS 输入阻抗高(几乎只电容),直流扇出大限制因素:输入电容总和(影响 tr)例:每从 10pF,5 从 50pF 走线,50MHz 下 tr 可能超标4.3 负载电容对速度的影响tr ≈ 2.2 × Rdrv × Cload Rdrv:驱动器输出阻抗(几 Ω 到几十 Ω) Cload:总负载电容(从机输入 走线) 例:Rdrv20Ω, Cload50pF → tr2.2ns(50MHz OK) Rdrv50Ω, Cload200pF → tr22ns(只能 ~10MHz)多从大电容会拖累速度高速 SPI 要控制从机数 走线长度五、多电压域电平转换5.1 为什么需要电平转换主机 3.3V,从机 1.8V(新 Flash 低压)主机 3.3V,从机 5V(老器件)直接连:① 可能损坏低压器件;② 电平不匹配误判5.2 SPI 电平转换器件TXS0108 / TXB0108(TI,双向自动感测):8 通道,适合 SPI(SCK/MOSI/MISO/CS 多 CS)TXS:带上拉,适合 OD/推挽混合(但 SPI 推挽为主)TXB:纯推挽,适合 SPILSF0108(NXP,无源 FET 桥):8 通道,便宜靠外部上拉定电平,速度受上拉限制专用的 SPI 电平转换:4 通道单向(SCK/MOSI/CS 主→从,MISO 从→主)速度快(100MHz)推荐高速 SPI 用专用器件5.3 MOSFET 桥(单线,I2C 那套)也能用于 SPI,但靠上拉,速度受限(几 MHz)高速 SPI 不推荐5.4 电平转换的时序影响转换器有传播延迟(几 ns)高速 SPI(50MHz,SCK 周期 20ns),延迟占周期比例大SCK 和数据线延迟要匹配(否则相位错位)详见 [[02-SPI信号完整性与时钟分布]]六、SPI vs I2C 物理层对比维度SPII2C输出结构推挽OD 开漏上拉不需要(内部推挽)必须外部上拉线数4(标准)/ 3(三线)2速度几十 MHz100k~3.4M(5M 推挽)多主不支持(推挽冲突)支持(线与仲裁)寻址CS 片选(显式)7bit 地址(协议层)双工全双工(四线)半双工应答无ACK/NACK走线多(每从一 CS)少(两线总线)电平CMOS 推挽OD(电平看上拉)距离短(高频,SI 严)短~中(400pF 限制)典型Flash/显示/ADC传感器/EEPROM/PMICSPI 用线多 推挽换高速 简单SPI 牺牲线数(4 vs 2)和主从灵活性(单主 vs 多主),换来推挽高速和无协议开销(无地址/无 ACK,纯移位)。这是总线设计的经典取舍:I2C 省线但慢且有协议负担,SPI 多线但快且透明。选哪个看场景:低速多传感器用 I2C,高速 Flash/显示用 SPI。七、关键问题 QAQ1:为什么 SPI 不能像 I2C 那样多主?A:SPI 用推挽输出,两个主机同时驱动同一根 MOSI,一个发高一个发低会直通短路(烧管)。I2C 用 OD 开漏,多主冲突只是线与(都拉低就是低,无损),能仲裁。所以 SPI 设计为单主,多主场景用 I2C 或 CAN。Q2:SPI 的 MISO 为什么可以多从共享?A:每个从机的 MISO 输出是三态——CS 未选中时高阻(不驱动),CS 选中时推挽驱动。同一时刻只有一个从机 CS 有效,所以 MISO 线上只有一个从机在驱动,不冲突。这是多从共享 MISO 的物理基础。Q3:3.3V 主机直接连 1.8V Flash 行不行?A:不行。3.3V 信号会损坏 1.8V Flash 输入(过压)。必须用电平转换(TXB0108/专用 SPI 转换)。另外 1.8V Flash 的 MISO 输出 1.8V,3.3V 主机的 VIH2.31V,1.8V2.31V,会被误判为低。双向都要转换。Q4:SPI 速度比 I2C 快,具体快在哪?A:推挽 vs 开漏:推挽 tr 几 ns,开漏 tr 几百 ns(Rp×Cb 限制)无协议开销:I2C 有 START/地址/ACK/STOP,SPI 纯移位(每 SCK 一位)无应答:I2C 每字节 9 个 SCL(8 数据 ACK),SPI 8 个 SCK 全数据全双工:SPI 同时收发,I2C 半双工Q5:SPI 不需要上拉电阻吗?A:标准推挽 SPI 不需要上拉(推挽自己驱动高低)。但CS 线建议加上拉(10k~100k),防止主机复位时 CS 浮空误触发从机。MISO/MOSI/SCK 一般不加(推挽驱动)。某些从机的 MISO 在 CS 未选时是高阻,若担心浮空可加上拉。Q6:SPI 的 CS 能不能用 GPIO 软控?A:可以,而且常见。控制器硬件 CS 和 GPIO 软控 CS 各有优劣:硬件 CS:时序精确(自动拉低/拉高),但灵活性差GPIO 软控:灵活(可任意时刻选中,支持菊花链/多从切换),但时序靠软件Linux spi 框架支持 GPIO CS(cs-gpios设备树属性),常用八、实战案例案例 1:3.3V 主机直连 1.8V Flash,Flash 损坏现象:3.3V MCU 直连 1.8V W25Q Flash,工作几次后 Flash 失效。分析:3.3V 信号过压损坏 1.8V Flash 输入管。解决:加 TXB0108 电平转换,3.3V 域 ↔ 1.8V 域隔离。案例 2:多从 MISO 冲突,数据错乱现象:SPI 挂 3 个从机,读从机 A 时偶尔读到从机 B 的数据。分析:某从机 MISO 未选中时未正确高阻(器件异常 / CS 时序错),与选中从机 MISO 冲突。解决:确认 CS 时序(CS 拉低前 SCK 空闲电平对,CS 拉高后等 tDIS 再读)排查异常从机(换器件测)加 MISO 上拉(10k),未选中时稳定高案例 3:SPI 速度上不去,50MHz 报错现象:W25Q 标称 50MHz,MCU 配 50MHz 读取偶发数据错。分析:PCB 走线长(15cm) 多从,负载电容大,tr 退化,50MHz 采样错位。解决:降到 30MHz 稳定或优化走线(缩短、星型、终端匹配)详见 [[02-SPI信号完整性与时钟分布]]、[[03-SPI速度与电气约束]]案例 4:CS 浮空导致从机误触发现象:MCU 复位期间,SPI Flash 偶发被误写入。分析:MCU 复位时 CS 引脚浮空(高阻),耦合干扰让 CS 误低,Flash 被选中;SCK 也浮空,产生时钟,Flash 收到错误命令。解决:CS 加 10k 上拉(复位时 CS 稳定高,Flash 不被选中)。案例 5:TTL 器件接 CMOS,电平不匹配现象:5V TTL 老器件接 3.3V CMOS MCU,SPI 偶发误判。分析:TTL VOH 2.4V,CMOS VIH(3.3V)2.31V,裕量小,噪声下误判。解决:加电平转换,或用 5V 容忍(VT)的 MCU 引脚。九、本篇小结与速查核心要点SPI 物理层:推挽输出(对比 I2C OD 开漏),tr 几 ns,速度几十 MHz推挽不能线与 → SPI 单主,多从靠 CS 片选四线制:SCK/MOSI/MISO/CS(全双工);三线制:省一数据线(半双工)CMOS 电平:VIH0.7VDD,VIL0.3VDD,噪声容限 ~0.9V(3.3V)多电压域必须电平转换(TXB0108/专用 SPI 转换),直连会损坏或误判驱动能力限制扇出,多从大电容拖累速度CS 建议加上拉,防复位浮空误触发SPI vs I2C:线多换高速,推挽换简单,单主换多从速查表项SPII2C输出推挽OD 开漏上拉不需要(CS 建议)必须线数4/32速度几十 MHz100k~3.4M多主不支持支持寻址CS 片选7bit 地址双工全双工(4 线)半双工应答无ACKtr几 ns几百 ns电气参数速查(3.3V CMOS)参数值VOH(min)2.4V(或 VDD-0.1)VOL(max)0.4V(或 0.1)VIH(min)2.0V(0.7VDD2.31)VIL(max)0.8V(0.3VDD0.99)噪声容限~0.9V延伸阅读[[02-SPI信号完整性与时钟分布]] —— 高频 SI 详解[[03-SPI速度与电气约束]] —— 速度上限分析[[04-SPI协议与时序详解-CPOL-CPHA]] —— 协议层【I2C 技术系列 01】I2C 电气特性与物理层 —— 对比 OD 开漏[[08-SPI控制器寄存器与IP架构]] —— 控制器实现参考资料NXP AN10658(SPI 信号完整性)TI SCAA026(电平转换指南)W25Q Datasheet(电平/时序)STM32 Reference Manual(SPI 章节)SPI 技术系列 00· 总目录 ·下一篇:[[02-SPI信号完整性与时钟分布]]✨ 感谢你的阅读 ✨技术之路漫漫分享是为了更好地交流。如果本文的内容对你有启发希望能得到你的支持 点赞|⭐ 收藏| 关注如果你在调试过程中遇到了其他问题欢迎在评论区 留言我们一起探讨。关注我一起交流底层开发的那些事儿