在单片机开发中,我们经常会接触到UART、I2C、RS-485等各种通信协议,但你是否曾对它们的具体特性和区别感到模糊不清?本文将为你系统梳理包括UART、I2C、SPI、TTL、RS-232、RS-422、RS-485、CAN、USB、SD卡、1-Wire和Ethernet在内的十余种常见通信接口与总线,通过对比分析帮助你建立清晰的认识。
UART通用异步收发器
UART口通常指的是一种物理接口形式,它是一种硬件。UART(通用异步收发器)采用异步、全双工的通信方式。它比同步串口复杂,仅需两根线:一根TXD用于发送数据,一根RXD用于接收数据。
UART的串行数据传输不需要时钟信号来同步,而是依赖于通信双方预先配置好相同的参数,如波特率、数据位、停止位等。

一个完整的UART数据帧包含以下几个部分:
- 起始位:标志数据传输的开始,逻辑电平为“0”。
- 数据位:可以是5、6、7、8或9位,通常使用8位,正好对应一个ASCII字符。
- 奇偶校验位:用于接收方校验数据的正确性,可以是奇校验或偶校验,此位可选。
- 停止位:标志一帧数据的结束,逻辑电平为“1”。

如果你需要用通用IO口来模拟UART通信,那么需要一个引脚配置为输出(模拟TXD),一个引脚配置为输入(模拟RXD)。
I2C总线
I2C是一种同步、半双工的双线式串行总线。它由两条线构成:
- SCL线:串行时钟线,负责产生同步时钟脉冲。
- SDA线:串行数据线,负责在设备间传输数据。
I2C总线支持多主多从架构。连接到总线上的设备既可以作为主设备,也可以作为从设备。主设备负责初始化通信、产生时钟和控制数据传输;从设备则响应主设备的命令。

需要注意的是,无论主设备是发送方还是接收方,时钟信号SCL始终由主设备产生。如果用通用IO模拟I2C,SDA线需要设置为双向输入输出口,而SCL只需一个输出口。
SPI串行外设接口
SPI是一种同步、全双工的四线式串行接口总线,通常采用“一主多从”的架构。一个系统内可以有多个SPI主设备,但任意时刻只能有一个处于激活状态。SPI广泛应用于AD转换器、EEPROM、FLASH、RTC等外设与主控芯片之间的通信。

SPI通信需要4条信号线:
- MOSI:主设备输出,从设备输入。
- MISO:主设备输入,从设备输出。
- SCLK:串行时钟,由主设备产生。
- SS/CS:从设备选择,低电平有效,用于选中特定的从设备。
SPI的通信时序模式由时钟极性(CPOL)和时钟相位(CPHA)共同决定。CPOL定义时钟信号空闲时的电平(0为低,1为高),CPHA定义在时钟的哪个边沿采样数据(0为第一个边沿,1为第二个边沿)。
UART、SPI、I2C比较
为了更直观地对比,我们来看一张汇总表格:

下面再总结一下它们的主要特点与区别:
- I2C:信号线最少(2根),功能强大,支持多主设备,但协议相对复杂,需要双向IO支持,且依赖上拉电阻,抗干扰能力较弱,通常用于板内短距离通信。
- SPI:实现简单,因为有独立的时钟线,所以对数据间隔没有严格要求。速度通常比I2C快。
- UART:异步通信,无需时钟线,但需要双方严格匹配波特率。一帧数据可以是5-9位。
- 选择机制:SPI通过片选信号(SS)选择从设备;I2C通过发送从设备地址来选择。
RS232串口通信
RS-232是一种常见的串行通信标准。它采用负逻辑电平:
- 逻辑“1”:-3V ~ -15V
- 逻辑“0”:+3V ~ +15V
RS-232的传输距离通常在15米左右,可以实现全双工通信,但速率较低,一般在20kbps量级。其物理接口常使用DB9连接器。

下图详细展示了DB9接口每个引脚的定义,最常用的是2号脚RXD(接收)、3号脚TXD(发送)和5号脚GND(地)。

TTL和RS-232互转
单片机的UART接口通常使用TTL电平(0V/5V或0V/3.3V),而PC的串口(COM口)使用RS-232电平。要让两者通信,就需要一个电平转换模块,常用的转换芯片如MAX232。

RS422串口通信
RS-422采用4根信号线实现全双工通信:两根用于发送(T+, T-),两根用于接收(R+, R-),外加一根地线。它采用差分传输,抗共模干扰能力强。
RS-422支持点对多点的通信,但通常有一个主设备,从设备之间不能直接通信。

RS485串口通信
RS-485是RS-422的变种,同样采用平衡发送和差分接收,抗干扰能力强。它通常采用两线制进行半双工通信,速率可达10Mbps,传输距离远,可从几十米到上千米。
其逻辑电平由两条线之间的电压差决定:
- 逻辑“1”:+2V ~ +6V
- 逻辑“0”:-2V ~ -6V
将TTL电平转换为RS-485电平也很常见,下图是基于MAX485芯片的参考电路:

图中,RE引脚(低电平有效)控制接收使能,DE引脚(高电平有效)控制发送使能,通常直接由MCU的GPIO控制。
TTL电平与接口辨析
这里需要明确几个容易混淆的概念:
- 串口/UART口:通常指单片机上遵循UART协议的物理接口,一般为TTL电平,常见为4个引脚(Vcc, GND, RX, TX)。
- COM口:特指个人计算机上的串行通讯端口,多为DB9接口,使用RS-232电平标准。
- TTL、RS-232、RS-485:这些指的是电气层面的电平标准,而不是接口形状。

下图清晰地对比了5V TTL与RS-232两种电平标准:

综上所述,一个完整的单片机与PC通信链路可能如下图所示,需要经过电平转换:

CAN总线
CAN(控制器局域网络)是一种用于实现分布式实时控制的串行通信网络,以其高可靠性和实时性著称,广泛应用于汽车电子等领域。
CAN总线网络主要包含CAN_H和CAN_L两条信号线,各个节点通过这两条线进行差分信号传输。为了消除信号反射,总线两端需要连接120欧姆的终端电阻。

CAN支持多主架构,每个节点既可做主机也可做从机。其通信距离可达10公里(低速时),速率最高可达1Mbps(短距离内)。
下图展示了CAN总线在汽车内部的广泛应用:

CAN电平逻辑
CAN总线采用“线与”规则进行仲裁:只要有一个节点输出显性位(逻辑0),总线就表现为显性位。因此,逻辑0被称为“显性”,逻辑1被称为“隐性”。
从电位规定来看,CAN_H和CAN_L在隐性时电压均在2.5V左右,电位差为0;在显性时,CAN_H升高至约3.5V,CAN_L降低至约1.5V,产生约2V的差分电压。

USB通信串行总线
USB(通用串行总线)的物理接口至少包含四根线,其中两根(D+和D-)是用于传输数据的差分信号线。所有复杂的USB协议通信都基于这两根线完成。
USB采用差分传输,同一时刻只能进行一个方向的数据传输,因此是半双工。其编码方式为NRZI(反向不归零),电平不变代表逻辑1,电平跳变代表逻辑0。

USB转TTL
为了实现单片机(TTL UART)与PC(USB)的通信,常使用USB转串口芯片,如CH340、CP2102等。

需要注意的是,单纯的串口通信(如UART)没有复杂的上层协议,而USB通信则包含一套完整的设备枚举、配置、传输协议,因此底层驱动要复杂得多。
SD卡通信模式
SD卡不仅是一种存储介质,其与主机(如单片机)的通信也有两种模式:
- SD总线模式:使用4条数据线(DAT0-DAT3)、1条命令线(CMD)和1条时钟线(CLK),速度最快。
- SPI总线模式:使用标准的SPI总线(MOSI, MISO, SCLK, CS)进行通信,仅使用1条数据线,兼容性好但速度较慢。

显然,在嵌入式系统中,使用SD总线模式比SPI总线模式的数据传输速率要快数倍。

1-WIRE总线
1-Wire(单总线)由Dallas公司推出,是一种异步半双工串行传输技术。它仅用一根信号线,既传输时钟又传输数据,并且能实现双向通信。

1-Wire的数据速率通常为16.3Kbit/s,最高可达142Kbit/s。由于其端口为开源或三态,因此必须外接一个上拉电阻(通常5K~10KΩ)。它常用于耗材识别、电路板或配件认证等场合。
DMA直接存储器访问
DMA(直接存储器访问)是集成在MCU(如STM32)内部的一个硬件模块。它独立于CPU工作,可以在外设(如UART、SPI)和内存之间直接搬运数据,从而将CPU从繁重的数据拷贝工作中解放出来,大大提高系统效率。

你可以把DMA想象成一条专用的高速公路,让数据能够不经过CPU“绕城”而快速直达。不使用DMA当然也能完成数据传输(通过CPU搬运),但效率会低很多。
Ethernet以太网
以太网是目前最普遍的局域网技术。其接口可分为协议层和物理层:
- 协议层:由MAC(媒体访问控制)控制器实现。
- 物理层:包括PHY(物理层)芯片和传输器(通常包含网络变压器)。
现在很多处理器已内置MAC,但需要外接PHY芯片来提供实际的网络物理接口。

网络变压器(或集成在RJ45连接器中)的主要作用有两个:
- 耦合差分信号,增强抗干扰能力。
- 隔离网线两端设备的地,保护设备免受外部电压浪涌冲击。
下图是一个典型的以太网接口参考电路设计:

希望这篇梳理能帮助你厘清这些常见通信协议和接口的区别与联系。掌握它们的特点和适用场景,是进行嵌入式系统设计和调试的基础。如果你在实践中对这些协议有独特的应用经验或疑问,欢迎在云栈社区与其他开发者交流探讨。