欢迎光临
我们一直在努力

嵌入式通信协议:UART、RS232、RS485、I²C、SPI 、CAN

1. 先建立整体认识

刚接触这些名称时,很容易把它们都叫作“通信协议”。严格来说,它们并不完全处在同一个层次。

名称它主要解决的问题可以把它理解成
UART(串口) 数据按什么格式一位一位发送 规定说话的节奏和句子格式
RS232 UART 数据用什么电压传输 两个人近距离打电话的线路标准
RS485 UART 数据怎样抗干扰、远距离、多节点传输 多人共用的一条工业电话线
I²C 板内多个低速芯片如何用两根线通信 主机点名,从机回答
SPI 板内芯片怎样进行高速同步通信 主机用独立片选叫某个从机工作
CAN 多个节点如何可靠、实时地争用总线 按消息优先级自动排队的广播网络

最需要先记住的一句话是:

UART 不等于 RS232,也不等于 RS485。UART 负责组织数据,RS232 和 RS485主要负责把数据变成适合在线缆上传输的电信号。

典型连接关系如下:

MCU UART ──TTL电平── RS232收发器 ──RS232电平── RS232设备
MCU UART ──TTL电平── RS485收发器 ──A/B差分线── RS485总线

2. 理解通信协议前的五个关键词

2.1 串行与并行

  • 串行通信:数据按位依次发送,线少、适合较远距离。本文介绍的接口都属于串行通信。

  • 并行通信:多位数据同时发送,线多,容易受到各位信号到达时间不一致的影响。

2.2 同步与异步

  • 同步通信:有时钟线,接收方跟着时钟采样,例如 I²C、SPI。

  • 异步通信:没有时钟线,双方提前约定速率,例如 UART。

2.3 单端与差分

  • 单端信号:用一根信号线相对 GND 的电压表示 0 和 1,电路简单,但更容易受干扰。

  • 差分信号:用两根线之间的电压差表示 0 和 1,抗干扰能力更强,例如 RS485、CAN。

2.4 单工、半双工与全双工

  • 单工:只能沿一个方向发送。

  • 半双工:双方都能发送,但不能同时发送,类似对讲机。

  • 全双工:双方可以同时发送和接收,类似打电话。

2.5 波特率与比特率

  • 比特率:每秒传输的二进制位数,单位是 bit/s。

  • 波特率:每秒发生的码元变化次数。

比特率 = 波特率 * log2M

UART 通常一个码元只表示一位,因此工程中经常把波特率近似理解为比特率。不过一帧数据还包含起始位、停止位等开销。例如 115200-8-N-1 发送一个字节需要 10 位,所以理论有效数据率约为:

115200 ÷ 10 = 11520 Byte/s


3. UART 串口

3.1 一句话理解

UART 是一种没有时钟线的异步串行收发方式,通信双方依靠提前约定的波特率和帧格式来正确采样数据。

3.2 基本接线

设备A TX ─────────→ 设备B RX
设备A RX ←───────── 设备B TX
设备A GND ───────── 设备B GND

TX 和 RX 要交叉连接,同时需要共地。只进行单向通信时可以只接一根数据线和 GND。

3.3 UART 数据帧

常见配置 115200-8-N-1 表示:

  • 波特率:115200 bit/s

  • 数据位:8 位

  • 校验位:无校验(N,None)

  • 停止位:1 位

一帧数据的结构通常为:

空闲高电平 → 起始位0 → 数据位(常见低位先发)→ 校验位(可选)→ 停止位1

发送端用起始位通知接收端“新的一帧开始了”,接收端随后根据波特率在每一位中间进行采样。双方波特率偏差过大时,采样点会逐渐偏移,最终产生乱码或帧错误。

3.4 优点与局限

优点:

  • 接口简单,几乎所有 MCU 都支持。

  • 全双工,适合调试信息和模块通信。

  • 软件配置和抓包分析比较容易。

局限:

  • 原生 TTL/CMOS 电平适合板内或短距离连接。

  • 没有地址、应答、重发等统一机制。

  • 多设备组网不方便。

3.5 初学者易错点

  • 两个设备的 TX 不能接 TX,应该 TX 接 RX。

  • 两端的波特率、数据位、校验位和停止位必须一致。

  • 3.3V MCU 不一定能承受 5V UART 信号,需要查看芯片手册。

  • UART 的奇偶校验只能发现一部分错误,不能替代 CRC。


4. RS232

4.1 一句话理解

RS232 将 UART 数据转换为正负电压进行单端、点对点传输,常用于电脑、仪器和传统工业设备。

4.2 为什么不能直接连接 MCU

MCU 的 UART 通常使用 0V 和 3.3V(或 5V)表示逻辑电平,而标准 RS232 使用正负电压,并且逻辑含义通常相反:

逻辑TTL/CMOS UARTRS232 接收端典型判定
逻辑 1 高电平 -3V ~ -15V
逻辑 0 低电平 +3V ~ +15V
不确定区 取决于器件 -3V ~ +3V

因此 MCU 与 RS232 设备之间要加入 MAX232、SP3232 等收发器,完成升压、产生负压和逻辑反相。

4.3 通信方式

最简单的 RS232 通信使用三根线:

  • TXD:发送数据

  • RXD:接收数据

  • GND:信号地

TXD 和 RXD 独立,因此可以全双工通信。标准接口还可能包含 RTS、CTS 等硬件流控信号。

4.4 优点与局限

优点:兼容大量传统设备,点对点连接简单,全双工。

局限:单端传输抗干扰能力一般,不能直接组成多节点总线,距离和速度不适合同时做得很高。传统工程中常把 15m 左右作为保守距离参考,实际能力与线缆、速率和环境有关。

4.5 初学者易错点

  • DB9 接口不代表一定是 RS232,需要查看设备说明书。

  • 不能把 RS232 电平直接接入 STM32 引脚。

  • DTE 与 DCE 设备的 TX/RX 定义不同,连接前应核对引脚,而不是只看插头公母。


5. RS485

5.1 一句话理解

RS485 使用 A、B 两根线的电压差传输数据,适合远距离、强干扰和多节点工业现场。

5.2 差分传输为什么抗干扰

接收器判断的是两根线之间的电压差:

Vdiff = VA – VB

如果外界干扰同时让 A、B 两线都升高 1V,它们之间的差值基本不变,因此接收结果不容易受到影响。这就是差分传输比单端传输更适合工业环境的主要原因。

5.3 两线半双工通信

最常见的 RS485 使用 A、B 两根数据线,所有节点共享总线,同一时刻通常只允许一个节点发送。

MCU 除了 UART TX/RX,通常还要控制收发器的 DE 和 /RE:

准备发送 → 使能发送器 → UART发送 → 等待最后一位真正发完 → 切回接收

如果数据刚写入发送寄存器就切回接收,最后几个字节可能还没有传到总线上。因此应等待 UART 的“发送完成”标志,而不只是“发送数据寄存器为空”。

5.4 终端、拓扑和协议

  • 总线物理上的两端通常各接一个约 120Ω 终端电阻。

  • 断电测量总线两端,两个 120Ω 并联后的等效电阻约为 60Ω。

  • 推荐手拉手的总线型拓扑,避免星形连接和过长支线。

  • 总线空闲状态不稳定时,可以按芯片手册增加偏置电阻。

  • 传统 RS485 的 32 个单位负载不是绝对节点上限,现代 1/2、1/4、1/8 单位负载收发器可支持更多节点。

RS485只规定电气层,不规定地址和报文内容。项目中常在它上面运行:

  • Modbus RTU

  • Profibus 的部分物理实现

  • 自定义“地址 + 命令 + 数据 + CRC”协议

5.5 优点与局限

优点:抗干扰强、距离远、支持多节点、成本较低。

局限:常见两线模式是半双工;总线同时发送会冲突;地址、仲裁、重发和错误处理需要上层协议设计。


6. I²C(IIC)

6.1 一句话理解

I²C 是一种两线、同步、带地址的板级总线:主机产生时钟并点名地址,从机匹配地址后进行应答。

6.2 两根信号线

  • SCL:串行时钟线

  • SDA:串行数据线

SCL 和 SDA 通常采用开漏结构:设备可以主动把线拉低,但不能主动输出高电平,释放总线后由上拉电阻把线拉高。这样多个设备就不会出现一个输出高、另一个输出低而造成的硬件短路,也为应答和多主仲裁提供了基础。

上拉电阻并非固定为 4.7kΩ。阻值需要结合电源电压、总线电容、目标速度和器件灌电流能力选择:

  • 电阻太大:上升沿慢,高速时可能采样失败。

  • 电阻太小:低电平电流增大,器件可能拉不动。

6.3 起始与停止条件

总线空闲时,SCL 和 SDA 都为高电平:

  • SCL 为高时,SDA 从高变低:START 起始条件。

  • SCL 为高时,SDA 从低变高:STOP 停止条件。

  • 正常传输中,SDA 应在 SCL 低电平时改变,在 SCL 高电平时保持稳定。

6.4 一次写寄存器的过程

START
→ 7位从机地址 + 写方向位0
→ 从机ACK
→ 寄存器地址
→ 从机ACK
→ 要写入的数据
→ 从机ACK
→ STOP

每发送 8 位数据,第 9 个时钟用于应答:

  • ACK:接收方拉低 SDA,表示“已收到,可以继续”。

  • NACK:SDA 保持高电平,可能表示地址无人响应、接收结束或设备忙。

读取寄存器时常用“重复起始”过程:

START → 地址+写 → 寄存器地址 → RESTART → 地址+读 → 数据 → NACK → STOP

6.5 地址和速度

I²C 常用 7 位地址。资料中有时会把 7 位地址左移一位并加上读写位,写成“8 位地址”,这是驱动开发中常见的地址混淆来源。

常见速度模式包括:

模式标称速率
Standard-mode 100 kbit/s
Fast-mode 400 kbit/s
Fast-mode Plus 1 Mbit/s
High-speed mode 3.4 Mbit/s

并非所有 MCU 和从机都支持全部模式。

6.6 优点与局限

优点:只用两根信号线即可连接多个设备;自带地址和应答;很适合低速传感器、EEPROM、RTC。

局限:速度和距离受总线电容影响;地址可能冲突;总线被某个器件持续拉低时会卡死;半双工且协议开销比 SPI 大。


7. SPI

7.1 一句话理解

SPI 是一种由主机提供时钟和片选的高速同步接口,MOSI 与 MISO 分开,因此能够全双工传输。

7.2 四类信号

信号方向作用
SCLK 主机 → 从机 主机产生通信时钟
MOSI 主机 → 从机 主机输出、从机输入
MISO 从机 → 主机 主机输入、从机输出
CS/NSS 主机 → 从机 选中目标从机,通常低有效

每增加一个普通 SPI 从机,通常要额外占用一根片选线。多个从机可以共用 SCLK、MOSI 和 MISO,但未被片选的从机必须释放 MISO。

7.3 SPI 为什么能全双工

主机和从机内部都可以看成一个移位寄存器。每产生一个时钟,两端各移出一位,同时移入一位:

主机移位寄存器 ──MOSI──→ 从机移位寄存器
主机移位寄存器 ←─MISO─── 从机移位寄存器

因此读取从机时,主机也必须发送一些占位数据来产生时钟;常见占位值是 0x00 或 0xFF,具体看器件手册。

7.4 四种 SPI 模式

CPOL 决定时钟空闲电平,CPHA 决定在哪个边沿采样:

SPI 模式CPOLCPHA时钟空闲电平
Mode 0 0 0
Mode 1 0 1
Mode 2 1 0
Mode 3 1 1

主从设备的模式必须一致。模式错误时,常见现象是数据整体错一位、数值不稳定或完全读不到数据。

7.5 SPI 没有统一的数据帧

SPI 规定了基本信号和移位过程,但没有统一规定:

  • 从机地址

  • 寄存器地址长度

  • 命令格式

  • 应答方式

  • CRC 和重发

所以使用 SPI 芯片时必须阅读数据手册中的时序图。某些芯片要求 CS 在一整条命令期间保持低电平,有些芯片还要求命令和数据之间插入空时钟。

7.6 优点与局限

优点:速度高、全双工、协议开销小、时序直观。

局限:占用引脚较多;没有统一应答和错误检测;通常只适合 PCB 板内短距离通信;频率升高后需要认真处理走线、阻抗、串扰和边沿质量。


8. CAN

8.1 一句话理解

CAN 是一种差分、多主机、面向消息的可靠总线,多个节点同时发送时,会根据消息标识符进行无损仲裁。

8.2 CAN 不是按设备地址发送

CAN 报文中的标识符描述的是“这是什么消息”,而不是“发给哪台设备”。例如:

ID 0x101:电机转速
ID 0x102:电机温度
ID 0x201:控制指令

所有节点都能看到总线上的报文,每个节点通过过滤器选择自己关心的标识符。这种方式非常适合一个数据被多个节点同时使用的场景。

8.3 差分信号与显性、隐性

CAN 使用 CAN_H 和 CAN_L 两根差分线:

  • 显性位:逻辑 0

  • 隐性位:逻辑 1

显性 0 可以覆盖隐性 1。这个“线与”特性使多个节点能一边发送一边监听总线,并完成仲裁。

8.4 无损仲裁过程

假设节点 A 和节点 B 同时发送:

节点A标识符:001 0010 0000(0x120)
节点B标识符:000 1000 0000(0x080)
            ↑

某一位上,节点 A 发送隐性 1,却从总线读到显性 0,就知道有更高优先级的报文正在发送,于是立即停止发送。节点 B 继续传输,原报文没有被破坏,所以称为“无损仲裁”。

结论:

CAN 标识符数值越小,优先级越高。标识符代表消息含义,同时也承担总线优先级设计。

8.5 CAN 为什么可靠

CAN 控制器内置了较完整的错误处理机制:

  • CRC 校验

  • ACK 应答

  • 位监测

  • 位填充检查

  • 帧格式检查

  • 出错后自动重发

  • 发送错误计数和接收错误计数

  • 错误主动、错误被动和总线关闭等故障隔离状态

持续出错的节点最终会进入 Bus-Off,避免它一直干扰整个网络。

8.6 经典 CAN 与 CAN FD

对比项经典 CANCAN FD
单帧最大数据 8 Byte 64 Byte
数据阶段速率 与仲裁段相同 可切换到更高速率
典型用途 传统汽车与工业控制 更高吞吐量的新系统

经典 CAN 的标称速率最高通常为 1 Mbit/s。通信距离与速率存在明显权衡:速率越高,允许的总线越短。具体值应根据收发器、线缆、拓扑和采样点设计确定。

8.7 布线注意事项

  • 总线两端各使用一个 120Ω 终端电阻。

  • 推荐总线型拓扑,支线尽量短。

  • CAN 控制器不能直接连接 CAN_H/CAN_L,中间需要 CAN 收发器。

  • 地电位差较大或安全要求高时,应使用隔离 CAN 收发器。


9. 六种通信方式横向对比

9.1 核心能力对比

对比项UARTRS232RS485I²CSPICAN
主要定位 异步串行收发 单端物理层 差分物理层 板级总线 板级高速接口 可靠现场总线
是否有时钟线
信号方式 TTL/CMOS单端 正负电压单端 差分 开漏单端 推挽单端 差分
常见数据线 TX、RX TXD、RXD A、B SCL、SDA SCLK、MOSI、MISO、CS CAN_H、CAN_L
双工方式 全双工 全双工 两线常为半双工 半双工 全双工 半双工
多节点能力 通常无 点对点 支持 支持 多从机 多主机
寻址方式 上层协议定义 7位/10位地址 片选线 消息标识符
仲裁机制 支持多主仲裁 无损位仲裁
错误处理 可选奇偶校验 依赖上层 依赖上层 ACK/NACK 依赖器件协议 CRC、ACK、重发、故障隔离
抗干扰能力 较弱 一般 较弱 较弱
典型距离 板内/短距离 短距离 可达数百米至千米级 PCB板内 PCB板内 数十米至数百米
典型速度特点 中等 中低 距离越长速度越低 中低速 高速 实时性和可靠性优先

9.2 成本与开发难度

接口硬件成本引脚占用软件复杂度调试难度
UART 2
RS232 需要收发器 2
RS485 需要收发器和方向控制 2~3 中,需上层协议
I²C 低,需要上拉 2
SPI 3+N个片选 低到中
CAN 需要控制器和收发器 2 较高 较高

9.3 典型应用

场景推荐通信方式主要原因
打印 STM32 调试日志 UART 转 USB 简单、电脑端工具多
连接传统仪器或旧工控机 RS232 设备接口兼容
工厂中连接多个仪表 RS485 + Modbus RTU 距离远、抗干扰、多节点
连接温湿度传感器、RTC I²C 两根线可挂多个低速器件
连接 Flash、ADC、显示屏 SPI 速度高、开销小
汽车节点或高可靠控制网络 CAN 仲裁、校验、重发和故障隔离完善

10. 选型时怎么快速判断

可以按下面的顺序思考:

  • 是不是同一块 PCB? 如果是,优先考虑 UART、I²C 或 SPI。

  • 引脚是否紧张、设备是否较慢? 是则优先 I²C。

  • 是否需要高速连续传输? 是则优先 SPI。

  • 是否只是两个设备简单通信或打印日志? 是则使用 UART。

  • 是否需要连接标准 RS232 仪器? 是则使用 UART + RS232 收发器。

  • 是否距离较远、节点较多、成本敏感? 是则考虑 RS485,并选择 Modbus RTU 等上层协议。

  • 是否要求多主机、实时仲裁和强错误处理? 是则选择 CAN。

  • 一句话速记:

    板内低速少引脚用 I²C,板内高速用 SPI,简单调试用 UART;传统设备用 RS232,远距离多节点用 RS485,高可靠实时网络用 CAN。

    赞(0)
    未经允许不得转载:171主机测评 » 嵌入式通信协议:UART、RS232、RS485、I²C、SPI 、CAN
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址