为什么 I²C 要上拉电阻,而 SPI 不要?

一句话答案:I²C 的引脚是开漏输出,只会「拉低」,不会「推高」,高电平必须靠上拉电阻拉回来;SPI 的主设备输出通常是推挽输出,高低电平都能主动驱动,因此正常通信通常不依赖上拉;MISO 在未选中时通常为高阻态,具体以器件手册为准。

原笔记引用的 2 张配图目前未提供;此页保留文字与来源,涉及图示的段落需对照原文阅读。

版本与验证范围

收藏整理,原作者与来源见正文;不作为 Lan 的原创项目或实测结论。

来源:抖音视频 · 电子极客 · 「麻瓜打工日记」系列第 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
资料性质
工程笔记。原文的版本、来源与验证边界继续保留。
关联笔记 3
返回文章目录

想去哪里?

22 个入口

首页作品作品展厅全部项目文章总览文件夹标签资料归档关于认识 Lan探索路线工具与工作台最近在做InkFeed · 4.2 英寸电子纸信息终端VIBRATION · 柔性振动检测与采集链路TRACE · 航向保持与灰度循迹小车STRIDE · 八自由度四足机器人SCOPE · 固件日志浏览器温度为什么被 AI 改了?FIFO 有半帧,就一定是故障吗?直线守航向,弧线再看黑线。

Tab 选择入口 · Enter 打开 · Esc 关闭