I2C、SPI、UART三种串口怎么选:线数与拓扑对比

2026-11-11 15:43:20 31阅读

封面

一、先锚定:三种接口各是什么定位

给开发板加一颗新器件,接线之前都得先回答同一个问题:这颗器件到底用什么接口说话。翻开源项目仓库的 README,最常见的三种答案就是 I2C、SPI 和 UART。三种都是串行接口,数据一位一位地传,但线数、速率和主从结构差别很大,选错了轻则跑不通,重则把库文件换了一遍才发现是协议用拧了。这篇按线数、速率、拓扑、配置细节四个维度横向对比,最后给分场景的选型结论。

先锚定对比对象。I2C 是两线制、带地址寻址的总线,支持多主多从;SPI 是四线制的高速总线,一个主机带多个从机;UART 是两线制的异步点对点接口,没有时钟线。下面逐项对齐。

二、线数:两线与四线的取舍

I2C 只占两条线:SDA 走数据,SCL 走时钟,一主多从、多主多从都在这两条线上完成。UART 也是两条线,但含义完全不同:发送端的 TX 接到接收端的 RX,两条线各自单向,靠这个交叉实现双向传输。SPI 则是四条线:SCLK 时钟、MOSI 主机发从机收、MISO 从机发主机收,再加一条片选线 SS/CS。

I2C消息帧与位定义图

引脚紧的板子上 I2C 优势明显——两条线挂一串器件;SPI 用四条线换来了更高的吞吐。复现开源项目时经常遇到 README 只写"接 I2C",翻原理图才发现同一颗传感器其实同时留了 SPI 焊盘,就是给人按需取舍用的。

三、速率:SPI 领跑,I2C 次之,UART 看波特率

SPI 的速率由时钟频率决定,一个时钟周期传一位,而且没有起始位、停止位这类包开销,数据可以不间断地流式传输;协议讲解页给的原话是比 I2C 快近一倍。另外 MISO 和 MOSI 分开,收发可以同时进行。

I2C 比 SPI 慢,而且数据帧固定 8 位,每传完一帧还要等对端回 ACK 才能发下一帧,这是它为"两线挂多设备"付出的代价。

UART 没有时钟线,速率完全由两端约定的波特率决定,以 bps 计。两端的波特率差超过约 10%,位的时序就错开了,通信开始出错。所以调 UART 的第一件事永远是核波特率。

四、主从拓扑:靠地址、靠片选、还是点对点

I2C 靠地址帧寻址。每条消息开头先发地址帧,7 位地址能区分 128 个器件,10 位地址能到 1024 个;每个地址帧和数据帧后面都跟着 ACK/NACK 应答位,收到没收到一清二楚。一主多从、多主多从都支持。

SPI主从连接图

SPI 只允许一个主机。主机选谁说话靠片选:片选线空闲时保持高电平,要和哪个从机通信就把它的 CS 拉低。主机有多个片选脚,从机就并行接线,一人一条 CS;只有一条片选脚时,可以把从机串成菊花链。

UART 天生点对点:一根 TX 一根 RX 两端直连,没有寻址机制,想一对多就得自己在上层加协议。这是它扩展性最弱的地方,也是它最简单的地方。

UART两线连接示意图

五、配置细节:上拉电阻、片选时序、波特率

I2C 的两条线是开漏输出,必须接上拉电阻,常见做法是 SDA 和 SCL 各接一个 4.7KΩ 上拉到 Vcc,漏掉这一步总线起不来。SPI 的时序要先拉低片选再发时钟,通信结束后把 CS 放回高电平。UART 要配齐三样:两端波特率一致、数据位 5 到 9 位、停止位 1 到 2 位,中间可选加一位奇偶校验位——它能发现传输中一位出错,但两位同时翻转就查不出来了。

六、典型器件场景

按器件类型分:温湿度、IMU、EEPROM、RTC 这类低速小数据器件几乎都走 I2C,接法省事;屏幕、Flash、SD 卡、高速 ADC 这类要吞吐的走 SPI;GPS 模块、蓝牙模块的 AT 指令、和电脑之间的调试口,是 UART 的主场——TX/RX 两根线直连,配好波特率就能跑。

七、分场景选型结论

场景一:引脚紧张、器件多、每颗器件数据量小,优先 I2C,两条线解决全部通信,ACK 机制还能逐帧确认送达。

场景二:追速率、要大吞吐、走线短,选 SPI,代价是每颗从机多占一条片选脚。

场景三:和 PC 联调、模块直连、跑日志,UART 最省心,两根线完事,前提是两端波特率一定核到一致。

边界提醒:I2C 不适合大数据量互传,8 位帧长加逐帧 ACK 会把吞吐拖垮;SPI 没有校验位也没有 ACK,长线或干扰强的环境要自己在上层补校验;UART 在多器件场景基本无解,别硬拗。

一句话收束:两线省事找 I2C,要快找 SPI,点对点调试找 UART。以上口径是 2026 年 11 月 11 日核对三篇协议讲解页的结果,具体某颗器件支持哪种接口,以它的 datasheet 为准。你复现项目时踩过哪种接口的坑,评论区聊聊。


作者:开源复现员
链接:https://www.aiddithome.com/p/493a01c1eff5f.html
本作版权归作者所有,未经允许请勿转载。若存在违规行为,您可以点击 “举报”。


登录 后发表评论
4条评论
触底反弹的Tony
1楼 · 5小时前

复现项目最怕的就是README只写一句通过串口通信,不说是UART还是I2C,最后翻原理图才定下来。这篇把线数和拓扑讲清楚了,收藏了。

第三次终于亮了
2楼 · 5小时前

之前一直没搞明白SPI为什么要四根线,原来MISO和MOSI分开才能同时收发。菊花链那段也解开了我的疑问。

拆开看看再说
3楼 · 5小时前

刚把一块OLED屏从I2C改成SPI驱动,刷新率确实上来了,代价是多占了几个IO。选型这事真是没有两头甜。

刷视频进来围观
4楼 · 5小时前

4.7K上拉这个细节太真实了,第一次接I2C总线漏了上拉,扫不到任何设备,查了一晚上。