在嵌入式系统里,CPU 再强也只是孤岛——传感器要读、执行器要控、数据要上传,这一切都离不开通信外设接口。
面试常问、调试常坑、选型常纠结的 UART、I2C、SPI、CAN、USB……这篇文章一次总结清楚:
1. UART / USART:最经典的两根线
UART(通用异步收发器)是嵌入式入门第一课。它只有两根信号线:TXD(发送)和 RXD(接收),外加一根必不可少的 GND 共地线。
所谓异步,就是没有时钟线——双方各自靠约定好的波特率产生本地时钟来对齐数据。
通信双方 TX、RX 交叉连接:
1.1 帧格式:靠起始位对齐,靠停止位收尾
没有时钟线怎么知道一位从哪开始?
答案是起始位:总线空闲时为高电平,接收方检测到下降沿后,在位周期中点采样确认起始位,随后按波特率间隔依次采样。
一帧数据的典型结构:起始位(0) + 8 位数据(LSB 在前)+ 可选校验位 + 停止位(1)。
1.2 波特率:异步通信的生死线
波特率即每秒传输的位数,常用 9600 / 115200 等。双方波特率必须一致,误差超过约 2%~3% 就会采错位(常表现为收到乱码)。
1.3 从 UART 到 RS-232 / RS-485 / TTL
UART 只是控制器内部的外设,电平是 TTL(0V/3.3V),传不远。工程上常在其基础上叠加电气标准:
RS-232:±3~15V 电平,全双工,点对点,15 米左右,老式工控机常见;
RS-485:差分信号(A/B 两线),半双工,抗共模干扰强,可拉 1200 米、挂 32 个节点,Modbus-RTU 的标配物理层;
TTL 串口:MCU 之间短距离直连,GPS 模组常见这一档;配合 CH340 等 USB 转串口芯片就是我们天天用的串口调试。
USART 比 UART 多一个 S——Sync(同步),可输出同步时钟(如驱动智能卡);STM32 的 USART 还支持 IrDA、LIN、硬件流控(RTS/CTS),做高速可靠传输时建议打开流控,防止接收缓冲溢出丢数据。
2. I2C:两根线挂一堆设备
I2C(Inter-Integrated Circuit)由 Philips 提出,只需 SCL(时钟)+ SDA(数据)两根线,就能挂多个设备,是读取传感器、EEPROM、触摸 IC、PMIC 的绝对主力。
2.1 电气结构:开漏 + 上拉,天然的线与
I2C 的 SDA/SCL 都是开漏(Open-Drain)输出:器件只能把线拉低,不能主动输出高电平,高电平靠上拉电阻实现。这个设计带来两个关键特性:
多器件共线不会短路;总线呈现线与逻辑——只要有一个器件拉低,总线就是低,这正是 I2C 应答与多主仲裁的物理基础。
2.2 时序三要素:起始、应答、停止
I2C 所有的聪明都藏在时序规则里:
起始条件:SCL 为高时,SDA 由高变低——总线宣布开会;
数据有效性:SDA 只能在 SCL 低电平期间变化,SCL 高电平期间必须稳定(否则就成了起始/停止条件);
停止条件:SCL 为高时,SDA 由低变高——宣布散会;
应答(ACK):每传完 8 位,第 9 个时钟由接收方把 SDA 拉低表示收到了,主机据此判断从机是否在线、这一字节有没有收下。
2.3 地址、速度与进阶机制
7 位地址:总线上每个从机有唯一地址(保留地址除外,可用约 112 个),也有 10 位地址扩展;
速度等级:标准模式 100kHz → 快速模式 400kHz → Fast-plus 1MHz → 高速模式 3.4MHz。速度越快,上拉电阻要越小(典型 4.7kΩ @100k / 2.2kΩ @400k);
时钟 stretching:从机忙时可以主动拉住 SCL 让主机等待,主机要能等(软件模拟 I2C 经常在这里跪);
多主仲裁:两个主机同时开口,靠“线与”逐位比较,发 1 却读到 0 的那个自动退出,不损坏数据。
3. SPI:追求速度的四线全双工
SPI(Serial Peripheral Interface)是摩托罗拉提出的同步串行接口,用四根线换来了速度和简单:
SCLK:主机提供的时钟;
MOSI:主机出、从机入;
MISO:从机出、主机入;
CS/NSS:片选,拉低选中某个从机(每从机一根)。
3.1 工作原理:一个双向移位寄存器环路
SPI 的本质是主机和从机各有一个移位寄存器(常见 8 位),首尾相连成环。
时钟每来一个脉冲,两边各移出 1 位、移入 1 位——发送和接收同时进行(全双工)。
所以哪怕你只读不写,也必须发一个哑数据(dummy byte)去换出从机的数据。
3.2 CPOL / CPHA:SPI 的四种方言
不同厂商器件的时序偏好不同,SPI 用两个参数描述,共 4 种模式,主从必须一致:
CPOL(时钟极性):空闲时 SCLK 是低(0)还是高(1);
CPHA(时钟相位):第 1 个边沿采样(0),还是第 2 个边沿采样(1)。
3.3 SPI 的优缺点
优点:无协议开销(没有地址、没有应答),速率轻松跑几十 MHz,全双工,驱动 Flash、屏幕、SD 卡首选;
缺点:没有应答机制(从机收没收到无从得知)、没有统一标准(每家器件时序/命令表都不同)、片选线数量限制了挂载设备数、没有硬件纠错。
调试 SPI 先示波器/逻辑分析仪抓四根线,确认①片选是否真被拉低;②CPOL/CPHA 与器件手册是否一致;③模式寄存器先发对命令再读数据。很多 SPI Flash 读不到,其实是先要发读 ID命令 0x9F 验证链路。
4. CAN:汽车与工业现场的钢铁总线
CAN(Controller Area Network)由博世为汽车设计,是真正为高噪声、远距离、多节点、高可靠而生的总线。一辆车上往往有多路 CAN,挂着几十个控制器;工业、医疗、电梯领域同样遍地开花。
4.1 差分传输:显性 0 与隐性 1
CAN 采用 CAN_H / CAN_L 差分线对,总线两端各接一个 120Ω 终端电阻(与线缆特征阻抗匹配,消除反射):
隐性(逻辑 1):CAN_H ≈ CAN_L ≈ 2.5V,差压约 0V,总线松弛;
显性(逻辑 0):CAN_H ≈ 3.5V,CAN_L ≈ 1.5V,差压约 2V,总线被驱动。
和 I2C 一样是线与——显性 0 会覆盖隐性 1,这个不对称性正是仲裁的基础。
▲ 图 9:CAN 总线拓扑——节点并联,两端 120Ω 匹配
4.2 非破坏性仲裁:ID 越小,优先级越高
多节点同时发送怎么办?
CAN 不靠主机调度,而是逐位仲裁:每个节点发送一位的同时回读总线。
发隐性 1 却读到显性 0 的节点,知道自己撞车了,立刻退出转为接收,胜利者继续发送——数据零损耗,这就是非破坏性仲裁。
因此 ID 值越小优先级越高,设计时要给刹车报文分配小 ID,给车窗报文分配大 ID。
4.3 帧结构与可靠性
一帧标准数据报文包含:帧起始 + 11 位 ID + 控制段 + 0~8 字节数据 + 15 位 CRC + ACK 槽 + 帧结束。
位填充:连续 5 个同位电平后自动插入一个反相位,保证跳变沿丰富、收发器时钟同步;
CRC 校验 + 应答:接收节点校验正确后在 ACK 槽拉低总线回应;
错误管理:每个节点有发送/接收错误计数器,错误主动上报,累计超限自动“离线”(bus-off),故障节点不会拖死总线;
速率:经典 CAN 最高 1Mbps(40m 内),CAN FD 数据段可到 5~8Mbps、载荷 64 字节,新车型已大规模上车。
调试 CAN 先量总线电阻(两端电阻并联应约 60Ω)和终端电阻位置(必须在物理两端);波特率和采样点(典型 75%~87.5%)必须全网一致;CAN 收发器(如 TJA1050)的 TXD 被拉死为低会把总线占成显性,S 脚(静音)和终端电阻也要先查。
5. USB:即插即用的万能口
USB 是我们最熟悉又最陌生的接口。USB 2.0 物理层用 D+ / D- 差分线,编码是 NRZI(遇到 0 电平翻转、遇到 1 保持),配合位填充保证同步;USB 3.x 另加 SSTX/SSRX 收发线对,编码换成 8b/10b 等。
它和前几种接口的最大区别在于协议模型:
主机中心:一切通信由主机发起,设备永远被动应答(Host/Device 角色分明,OTG 可切换);
枚举机制:设备插上后,主机通过标准请求读取描述符、分配地址、加载驱动——这就是即插即用的本质;
分层星型拓扑:通过 Hub 理论上可扩展到 127 个设备;
速度等级:低速 1.5Mbps / 全速 12Mbps / 高速 480Mbps / 超高速 5Gbps+。
在嵌入式开发中,USB 最常见的形态是两类:设备类(把开发板做成 CDC 虚拟串口、HID 键盘鼠标、MSC U盘、DFU 固件升级)和主机类(读取 U 盘、USB 转串口)。
6. 其他值得认识的接口
1-Wire:单线 + 寄生供电,每颗器件出厂自带 64 位唯一 ROM ID,DS18B20 温度传感器的招牌;
SDIO:SD 卡/SDIO 的 4bit 并行模式,比卡的 SPI 兼容模式快得多,也常用来对接 SDIO WiFi 模组;
以太网 MAC + RMII:MCU 内置 MAC,通过 MDC/MDIO 配置 PHY;RMII 用 2bit 数据 + 50MHz 参考时钟跑 100M,线比 MII 少,IoT 网关标配;
SWD / JTAG:严格说是调试口,但 SWD 的 SWDIO/SWCLK 本质也是一种同步两线协议,烧录和调试靠这两根线;SWO/Trace 是另加的引脚。
7. 总结
| 接口 | 线数 | 时钟 | 典型速率 | 距离 | 拓扑/主从 | 应答机制 | 典型应用 |
|---|---|---|---|---|---|---|---|
| UART | 2 + GND | 无(异步) | ≤ 1Mbps | 板级/米级 | 点对点 | 无 | 调试串口、GPS、蓝牙模组 |
| RS-485 | 2(建议共地) | 无(异步) | ≤ 10Mbps(短距) | ≤ 1200m(低速) | 一主多从 | 协议自定 | Modbus、工控 |
| I2C | 2 | 有 | 100k~3.4MHz | 板级 | 一主多从/多主 | ACK 应答 | 传感器、EEPROM、OLED |
| SPI | 4+N | 有 | 几十 MHz | 板级 | 一主多从 | 无 | Flash、LCD、SD卡 |
| CAN | 2(建议共地) | 无独立时钟(位同步) | ≤ 1Mbps | ≤ 40m@1M | 多主对等 | ACK + CRC | 汽车、工业现场 |
| USB | D+/D-(3.x 再加两对) | 有(嵌入) | 1.5M~5Gbps | ≤ 5m | 主机中心 | 协议层确认 | 虚拟串口、U盘、HID |
262