在嵌入式系统中,主控芯片与各类传感器及外设芯片之间的通信通常需要遵循特定的规则。这些规则由固定的硬件连接方式和时序约定共同构成,即通信协议。本文将介绍嵌入式领域中常用的几种基础通信协议,包括串口(UART)、IIC(I2C)以及 SPI。
一、串口
串口(UART)是嵌入式系统中最基础最常用的通信方式之一,简单,通用并且无需时钟同步。串口通信是一种异步串行通信方式,数据按位(bit)依次传输,每次传输一个字节(通常为8位)。由于是异步通信,通信双方不共享时钟信号,而是通过约定好的参数来保证数据正确接收。
1. UART
硬件连接:
最基础的串口通信只需要两根信号线:TX(Transmit) :发送数据;RX(Receive) :接收数据。UART 数据传输是全双工的,通信双方可以同时发送和接收数据。此外发送和接收双方需要共地以保证参考电平一致。连线方式示意图如下。

串口通信以帧为单位传输数据,一个完整的数据帧通常包括:起始位(1位),数据位(8位最常用),校验位(奇偶校验,可选),停止位(常用1位)。最常用的搭配是8N1,即8位数据位,无校验,1位停止位。由于没有时钟同步,所以通信双方必须约定一个一致的通信速率,也就是波特率。常用的波特率为9600,115200等。串口通信的简单时序如下图所示。

基础串口通信的优点在于硬件连接简单,无需额外的时钟信号即可实现数据传输,但这也带来了一些局限性。首先,串口通信的传输速率相对较低,其设计以简单可靠为主,在较高波特率或复杂电磁环境下,误码率可能会有所上升。其次,串口通信不适合长距离传输,信号在传输过程中容易受到电磁干扰以及线路延迟等因素的影响,从而降低通信可靠性。此外,串口通信通常采用点对点方式,仅适用于两个设备之间的数据交换,难以支持多设备组网通信。综上所述,串口通信常用于对实时性和速率要求不高的场景,例如调试信息输出、板级模块之间的通信以及短距离程序下载等。
2. RS232
为了解决基本串口通信在传输距离和抗干扰能力以及通信规模等方面的限制,逐渐发展出了 RS232 和 RS485 等更完善的串行通信标准。需要注意的是,这些标准并不是对 UART 协议的替代,而是在物理层对其电气特性进行改善,从而提升通信性能和适用范围。
RS232 是较早提出的一种串行通信标准,广泛应用于计算机与外设之间的连接(笔者常用的设备与上位机通信很多基于 DP9 接口)。RS232 同样是全双工 通信,它通过提高信号电压幅度(通常为 ±3V~±15V)来增强抗干扰能力,并定义了完整的接口规范(如 DB9 接口)。需要注意的是,RS232 除了提高了信号电平幅度之外,其逻辑极性是与 TTL 电平相反的,可见下面时序图。RS232 仍然采用单端信号传输方式,通常用于点对点通信,传输距离一般在 15 米以内,速率相对有限。因此,它常见于早期计算机串口、工业设备调试接口以及一些简单的外设通信场景。下图是 RS232 典型的设备通信连线示意图。

RS232 的时序如下图所示:

3. RS485
随着工业控制等场景对通信距离和可靠性的要求不断提高,RS485 应运而生。RS485 采用了差分信号传输,能够有效抑制共模干扰,从而显著提升抗干扰能力和传输距离(可达上千米)。同时,RS485 支持多节点通信,一条总线上可以挂接多个设备(典型为 32 个或更多),非常适合构建分布式系统。需要注意的是,RS-485 本身只定义了物理层规范,具体的数据通信规则通常由上层协议实现,例如 Modbus 等工业通信协议。
由于 RS485 采用了差分信号传输,一位信号的表示需要两根线的电位差来判断,因此其仅支持半双工通信。差分信号采用两根线来进行信号传输,接收设备通过两根线的电压差判断逻辑值(≥+200mV 为 1,≤−200mV 为 0),因此天然抗共模干扰。

RS485 的时序逻辑如下图所示,其核心改良就是使用差分信号进行数据传输以提高长距离通信的抗干扰能力,本质上还是电气特性的改良,而时序规范还是依据串口标准 。RS485 的另一特性是可以支持多设备通信,如上图所示,一般是有一个主机和若干个从机。由于 RS485 本身只是物理层标准 ,它只定义了电气特性(差分信号、电压范围、阻抗),不包含任何地址或寻址机制 ,因此要实现多设备通信需要依赖 RS485 之上的通信协议,最常见的协议是Modbus。这里只做简单介绍,知道逻辑即可。首先主机发送广播帧,广播帧中含有目标通信从机的地址,广播帧所有从机都可以收到,不匹配的从机就静默处理,匹配的从机就接收数据并发送应答帧。

二、I2C
I2C(Inter-Integrated Circuit) 是嵌入式系统中非常常用的一种同步串行通信协议,该协议最初由飞利浦(现恩智浦)提出,广泛应用于芯片之间的短距离通信,比如传感器、EEPROM、ADC/DAC 等外设。
I2C 仅通过一条串行数据线(SDA) 和一条串行时钟线(SCL) 即可在多个设备 间进行同步、半双工的数据传输。I2C 适用于多设备通信,每个设备都有自己的地址(一般是7位),主设备负责产生时钟并发起通信,从设备则响应主设备的请求。I2C 的典型速率包括标准模式(100 kbps)、快速模式(400 kbps)以及更高速模式(如1 Mbps快速模式+和3.4 Mbps高速模式),因引脚少、连接简单且能灵活扩展,I2C被广泛应用于同一电路板内芯片之间的短距离低速通信。
I2C 的 SDA 和 SCL 都采用一种开漏结构的输出方式,其特点是只能主动输出低电平,而不能主动输出高电平。 如果所有设备都只能拉低,那"高电平"从哪来?此时就需要上拉电阻来提供高电平。上拉电阻把总线"默认拉到高电平",任意设备需要发送"0"时把线拉低,没人拉低时线路被电阻拉回高电平。典型的硬件结构如下图所示。

I2C 的读写时序时序如下图所示,此外后面给出了一个具体的写时序示例。
需要注意的点:
- 起始信号:SCL 为高时,SDA 从高 → 低
- 停止信号:SCL为高时,SDA从低 → 高
- SDA 在 SCL 为高期间必须保持稳定,也就是说数据只能在 SCL 低电平时改变,在 SCL 高电平时读取数据
- 每次传输:8位数据 + 1位 ACK,高位先传(MSB first)
- 起始信号后的 8 位数据,高 7 位为地址,最低位为读写位

三、SPI
相比于 UART 和 IIC,SPI 是相对速度很高的一种同步全双工通信协议。SPI 依赖四条线来工作,分别为:
-
SCLK (Serial Clock): 时钟信号,由"主设备"产生,决定了数据传输的速度。
-
MOSI (Master Out Slave In): 主设备发送,从设备接收。
-
MISO (Master In Slave Out): 从设备发送,主设备接收。
-
SS/CS (Slave Select / Chip Select): 片选信号,用于指定主设备想和哪一个从设备说话。
与前两种协议不同,SPI 通常有四种工作模式,由时钟极性 (CPOL) 和时钟相位 (CPHA) 两个寄存器来控制。
-
CPOL (Clock Polarity): 决定时钟空闲时是高电平还是低电平,0 表示空闲时为低电平。
-
CPHA (Clock Phase): 决定是在时钟的第几个边沿采样数据,0 表示在第1个时钟边沿采集数据。
以"00"为例,空闲时低电平,第一个时钟沿就是上升沿,就是第一个上升沿就开始采集数据。
| 模式 | CPOL | CPHA | 触发边沿 |
|---|---|---|---|
| Mode 0 | 0 | 0 | 空闲时低电平,第一个时钟沿:上升沿 |
| Mode 1 | 0 | 1 | 空闲时低电平,第二个时钟沿:下降沿 |
| Mode 2 | 1 | 0 | 空闲时高电平,第一个时钟沿:下降沿 |
| Mode 3 | 1 | 1 | 空闲时高电平,第二个时钟沿:上升沿 |
SPI 的典型速率:
-
低速应用 (100 kHz - 1 MHz): 常用于简单的传感器(如温湿度传感器 DHT 系列)、低速 ADC 或 电子墨水屏。
-
中速应用 (1 MHz - 20 MHz): 这是最常见的范围。大多数微控制器(如 Arduino、STM32 的普通外设)在这个区间运行。常见的 SD 卡读取、OLED 显示屏驱动、以及高精度的惯性传感器(IMU)通常工作在此频率。
-
高速应用 (20 MHz - 100 MHz+): 常见于高性能主控与高速存储器(如 QSPI Flash)、以太网控制器(如 W5500)或高分辨率 TFT 液晶屏之间的通信。


Steady Progress!