来源:抖音视频 · 电子极客 · 「麻瓜打工日记」系列第 128 集 · 约 38 秒 · 作品 ID 7698417605141086863
一句话答案:I²C 的引脚是开漏输出,只会「拉低」,不会「推高」,高电平必须靠上拉电阻拉回来;SPI 的主设备输出通常是推挽输出,高低电平都能主动驱动,因此正常通信通常不依赖上拉;MISO 在未选中时通常为高阻态,具体以器件手册为准。
1. 原帖是什么
这条「视频」其实是一张静态原理图 + 背景音乐,没有语音讲解。整张图是一块板子的原理图截图:
此处配图暂缺,参阅原帖。
图里正好把答案摆出来了:左边一颗 RTC(PCF85xx,I²C 接口),SDA/SCL 上接了 4.7 kΩ 上拉;右边一颗 FLASH(SPI 接口),CS/MISO/MOSI/SCLK 上什么都没接。同一个人画的同一张图,一边有上拉一边没有——差别不在偷懒,在于两种总线的输出级不一样。
因为原帖没有语音,下面的解释是我写的,不是作者讲的;判断依据是公开的协议规范和这两张图。
2. 核心差别:输出级长什么样
此处配图暂缺,参阅原帖。
| I²C(SDA / SCL) | SPI(MOSI / SCLK / CS) | |
|---|---|---|
| 输出结构 | 开漏:内部只有一个下拉开关 | 推挽:内部有上管、下管两个开关 |
| 能主动输出高吗 | 不能,只能拉低或松手 | 能,上管闭合就推高 |
| 没有上拉电阻会怎样 | 松手后线浮空,没人给高电平 | 不影响,高低都被主动驱动 |
| 为什么这么设计 | 多设备共用总线,谁都能拉低(线与),还能实现时钟拉伸 | 点对点高速传输,要的是边沿陡、速度快 |
用 011 那条视频的概念说: SPI 的输出级就是 推挽电路——上管推高、下管拉低;I²C 只保留下管(开漏),把「推高」这件事交给了外部上拉电阻。这样任何设备拉低总线,总线就是低;大家都松手,电阻把总线拉回高。多主多从的仲裁、时钟拉伸都建立在这个「线与」特性上。
3. 几个顺带的推论
- 上拉电阻的阻值不是随便选的。 太小电流大、拉低困难;太大边沿变慢。选法在 004 号笔记里有完整计算(示例条件 3.3 V、100 pF 时 4.7 kΩ 上升时间约 398 ns,标准模式够用、快速模式不够)。
- SPI 不需要上拉是常态,但有例外。 当 SPI 做成多从机共享总线时 MISO 是多设备复用,有的方案会在 MISO 或 CS 上加电阻做隔离(比如电阻隔离多机 MISO、或 CS 上拉防止上电时误选中),那是另一回事,不改变「SPI 引脚本身是推挽」这个结论。
- 开漏不是 I²C 独有。 1-Wire、SMBus 的 Alert、一些复位脚也是开漏,原因一样:要么多点线与,要么允许多个源拉低。
- 混用 3.3 V 和 5 V 要先核对电平。 单纯上拉到 5 V 可能超出 3.3 V 引脚耐压;上拉到 3.3 V 又可能不满足 5 V 器件的高电平门限。要同时核对两端的绝对最大额定值和 VIH,条件不满足时用合适的双向电平转换器。参考 TI I²C 电平转换说明。
4. 和你工程的关系
- ESP32-S3 / STM32 的 GPIO 都可以配成开漏或推挽模式。配错模式是 I²C 调不通的常见原因:把 SDA/SCL 配成推挽,单主单从有时也能跑,但多设备总线会互相「顶牛」,仲裁也没法工作。
- 硬件 I²C 外设默认就按开漏行为设计;软件模拟 I²C 时,记得把两个脚设成开漏 + 外部上拉。
- SPI 调不通时先别怀疑缺电阻,方向应该放在模式(0/1/2/3)、CPOL/CPHA、CS 极性、分频这些地方。
来源与关联索引
- 来源
- 个人知识库
- 原笔记
- 抖音收藏待整理/013-为什么I2C要上拉电阻而SPI不要.md
- 资料性质
- 工程笔记。原文的版本、来源与验证边界继续保留。