有线通信协议基础
说到通信协议,HTPP、TCP/IP张口就来,这是如今网络通信的基石; 但是如今嵌入式系统中也通信协议也数不胜数,UART、I2C、SPI、USB、CAN、PCIe这类是常用的有线通信协议,当然也有无线通信协议Bluetooth、WiFi、ZigBee等;
特性 | UART | I2C | SPI | USB | CAN | PCIe |
---|---|---|---|---|---|---|
通信方式 | 异步串行 | 同步串行 | 同步串行 | 串行总线 | 多主总线 | 点对点串行 |
数据方向 | 半双工/全双工 | 半双工 | 全双工 | 全双工 | 半双工 | 全双工 |
信号线数 | 2(TX、RX) | 2(SCL、SDA) | 4(SCK、MOSI、MISO、SS) | 2(D+、D-) | 2(CANH、CANL) | 2N(双向Lane对) |
速率范围 | 110bps~1Mbps | 100Kbps~3.4Mbps | 几Mbps~几十Mbps | 1.5Mbps~5Gbps+ | 125Kbps~5Mbps | 2.5GT/s~128GT/s |
多设备支持 | 不支持 | 支持 | 支持(需多个SS) | 支持 | 支持 | 支持 |
控制方式 | 无主从 | 主从 | 主从 | 主从 | 多主多从 | 主从 |
通信距离 | 短 | 短 | 短 | 中等 | 中远 | 短 |
抗干扰性 | 一般 | 一般 | 一般 | 中等 | 强 | 一般 |
应用场景 | MCU、传感器 | EEPROM、传感器 | Flash、显示屏 | 键盘、U盘、摄像头 | 汽车、工业自动化 | 显卡、SSD、扩展卡 |
一、UART
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器)即常说的串口。
特点:
- 异步通信:不需要共享时钟信号;
- 点对点连接:通常是一对设备直接通信;
- 全双工通信:独立的发送(TX)和接收(RX)线路,可同时发送和接收数据;
- 简单协议:只需要少量的引脚和基本配置即可通信;
- 速度有限:通常低于 1 Mbps;
UART通常使用两根信号线:TX(Transmit):发送端口,负责将数据发送出去。RX(Receive):接收端口,负责接收数据。
为了实现通信,设备之间需要交叉连接,另外,为了提升通信可靠性,有时会加上地线确保两个设备有共同的电位参考。
1.1 UART工作原理
UART使用异步方式进行数据传输,这意味着它不需要共享时钟,而是依赖双方约定好的波特率(Baud Rate,1秒内传送bit的数量)来同步数据。只要波特率相同,一般就可正常解析数据。
在使用过程中,我们可以直接配置GPIO复用使用硬件UART资源,当硬件资源不够时通过软件模拟串口实现,当然软件模拟串口有一定的局限性。
1.2 UART的基本通信过程
sequenceDiagram
participant 发送端
participant 接收端
发送端 ->> 发送端: 开始位 (发送低电平,通常低电平当作起始位)
发送端 ->> 接收端: Data Bit 1 (发送数据位)
发送端 ->> 接收端: Data Bit 2
发送端 ->> 接收端: Data Bit 3
发送端 ->> 接收端: Data Bit 4
发送端 ->> 接收端: Data Bit 5
发送端 ->> 接收端: Data Bit 6
发送端 ->> 接收端: Data Bit 7
发送端 ->> 接收端: Data Bit 8
发送端 ->> 接收端: 停止位 (发送高电平,通常高电平当作结束位)
接收端 ->> 接收端: 逐位接收数据,并将其组成完整的字节
1.3 UART应用场景
- 设备调试和日志输出(如串口调试工具);
- MCU(微控制器)之间的数据交换;
- 外设通信(如 GPS 模块、蓝牙模块、Wi-Fi 模块);
- 传感器数据采集;
- 嵌入式系统的固件升级(如通过串口烧录程序);
1.4 USART
带时钟信号(SCK)的串口通信,可以实现同步模式,不过通常都用异步模式。
特点:
- 共享时钟:发送和接收的数据会根据时钟信号的上升或下降沿来确定;
- 不需要波特率同步:由于时钟线同步数据,接收端可以不依赖波特率来确定接收时机;
- 高数据传输速率:同步模式通常比异步模式具有更高的可靠性和更快的传输速度;
特性 | 异步模式(UART) | 同步模式(USART) |
---|---|---|
时钟线 | 无 | 有(SCK) |
数据线 | TX、RX | TX、RX |
数据传输方式 | 基于波特率同步 | 基于时钟信号同步 |
应用场景 | 常规串口通信 | 更高速地数据传输 |
1.5 TTL/RS232/RS485通信标准
他们是一种常见的串行通信标准。它定义了串行通信的电气特性,如电平、接线等。
TTL(Transistor-Transistor Logic):
- 是一种电平标准;
- 逻辑“0”:在 TTL 中,逻辑“0”通常对应 0V 到 0.8V 的电压范围。也就是低电平;
- 逻辑“1”:逻辑“1”通常对应 2V 到 5V 的电压范围。也就是高电平;
- 抗干扰能力弱;
RS232(Recommended Standard 232):
- RS232使用负电平和正电平来表示逻辑“0”和“1”;
- 逻辑“0”表示-12V,通常对应-3V到-15V的电压范围;
- 逻辑“1”表示+12V,通常对应3V到15V的电压范围;
- 接口连接具有多根信号线,包括TX、RX、RTS(请求发送)、CTS(清除发送)等;
- RS232 的有效传输距离一般较短(通常为15米以内);
- 抗干扰能力较TTL有所增强;
RS485(Recommended Standard 485):
- RS485使用差分信号来传输数据,通过 A(+) 和 B(-) 两根信号线传输数据,具有更强的抗干扰能力和更远的通信距离;
- 逻辑“0”表示信号A小于信号B;
- 逻辑“1”表示信号A大于信号B;
- 多点通信:支持多点通信(即多个设备共享同一条总线),最多可以连接 32 个设备;
- 通信距离:RS485 能够支持更长的通信距离(通常为 1200 米)和更高的传输速率(最高可达 10 Mbps);
- 使用双绞线由两根相互绝缘的导线相互缠绕而成,特别适合差分信号传输场合,与平行线相比,可以更有效地抑制干扰;
特性 | UART | RS232 | RS485 |
---|---|---|---|
传输方式 | 异步串行通信 | 异步串行通信 | 差分串行通信 |
电平标准 | TTL(0~5V) | 正负电压(±12V 或 ±5V) | 差分电压(A 和 B 信号线) |
支持设备数量 | 1 对 1(点对点通信) | 1 对 1(点对点通信) | 多点通信(最大 32 个设备) |
通信模式 | 全双工 | 全双工 | 半双工(可通过额外线缆支持全双工) |
最大距离 | 通常较短(几米到几十米) | 最长 15 米 | 最长 1200 米 |
应用场景 | 常见于计算机串口 | 计算机串口、POS、打印机 | 工业自动化、仪表控制 |
TTL、RS232和RS485电平标准不同,通常需要通过电平转换器来实现它们之间的互通。常用的MAX232(RS232 转 TTL 转换器)或 RS485转TTL转换器来进行电平转换和实现不同设备之间的通信。
二、I2C
I2C(Inter-Integrated Circuit,一种内部芯片之间的通信),是一种高效的双线通信协议,是一种低成本、简单、可靠的短距离通信。它解决了硬件复杂、设备寻址、多设备管理等问题,广泛用于传感器、存储设备、显示屏等外围设备与MCU的通信的场景。
I2C通常使用两根信号线:SCL(时钟线)、SDA(数据线),以及地线、3.3V。此外,SCL和SDA都是开漏设计,需要接上拉电阻,拉到高平。
特点:
- 简单的双线通信:SCL(时钟线)、SDA(数据线),简化硬件连接和PCB布线;
- 支持多主多从模式,设计使用7位或10位设备地址码,同一总线上可以连接多个从设备,通过地址区分;防止多个主设备同时操作总线引发冲突,需要引入总线仲裁;
- 双向,半双工通信协议;
- 多速率支持(100kHz、400kHz、3.4MHz);
- 应答机制,ACK/NACK 应答机制,每个字节传输后需接收方确认(ACK);
- 采用TTL电平;
2.1 I2C工作原理
I2C由时钟线和数据线共同作用,来实现信号的发送接收:
- 数据传输是通过在SCL线的时钟脉冲引导下进行的。每次时钟脉冲时,SDA线上会传输一个数据位;
- 逻辑“1”:SCL一次脉冲,SDA高电平;逻辑“0”:SCL一次脉冲,SDA低电平;
- 起始信号定义:在SCL高电平期间,SDA从高电平跳变为低电平,表示I2C通信开始;
- 停止信号定义:在SCL高电平期间,SDA从低电平跳变为高电平,表示I2C通信结束;
- ACK(应答,确认信号):接收方在接收每个字节后,拉低SDA,表示成功接收数据;
- NACK(非应答):接收方在接收数据后,保持SDA高电平,表示未成功接收数据或不需要更多数据;
2.2 I2C的基本通信过程
sequenceDiagram
participant 主机
participant 从机
主机 ->> 主机: 起始信号 (SDA在SCL高电平时拉低,表示通信开始)
主机 ->> 从机: 发送设备地址 (SDA->ADDR, SCL产生时钟脉冲)
从机 ->> 主机: 发送应答 (从机拉低SDA表示接收成功)
主机 ->> 主机: 发送数据 (SDA->DATA, SCL产生时钟脉冲)
从机 ->> 主机: 发送应答 (从机拉低SDA表示接收成功)
主机 ->> 主机: 发送停止位(SDA在SCL高电平时拉高,表示通信结束)
像STM32部分GPIO有配置I2C硬件资源,硬件模块会自动处理大部分时序,大大简化了I2C通信的实现,开发者只需要配置相应的参数(如时钟速度、I2C模式等),然后就可以使用简单的API进行数据传输。
当然也可以在STM32上模拟I2C通信(即使用软件模拟I2C)这种方法并不依赖于硬件I2C模块,而是通过GPIO引脚手动控制时钟(SCL)和数据(SDA)线的电平变化来模拟I2C的时序。
三、SPI
SPI(Serial Peripheral Interface,串行外围设备接口),与I2C和UART相比,SPI在速度和灵活性方面具有优势,因此适合用于高速数据传输的应用。
特点:
- 全双工通信,主设备通过MOSI线发送数据,同时接收来自从设备的数据(通过MISO线);
- SPI是同步时钟,所有数据的传输都由主设备生成的时钟信号(SCK)来同步;
- 支持一主多从,主设备通过控制每个从设备的SS线来选择通信对象(因此不需要设备地址),不过这样的化,每增加一个从设备,都需要额外的SS线,这会占用更多的GPIO引脚;
- SPI支持更高的数据传输速率,速度可以根据时钟频率和传输位宽来调节,常见速率可以达到几十Mbps;
- 有四种工作模式;
- 可调节的传输位宽;
- 不支持错误检测,依赖硬件可靠性,或者协议上的设计(CRC校验)来保证数据可靠;
SPI协议是一种主从式通信协议,其中一个设备(主设备)控制通信过程,而其他设备(从设备)响应主设备的请求。SPI使用四根线来传输数据:
- MOSI(Master Out Slave In,主设备发送数据线);
- MISO(Master In Slave Out,主设备接收数据线);
- SCK(Serial Clock,时钟线);
- SS(Slave Select,时钟线);
- 当然这里还需要需要电源和共参考的地线;
3.1 SPI工作原理
- 主设备选择从设备:通过控制SS线来选择一个特定的从设备。选择的方式是将SS线拉低;
- 时钟信号同步:主设备通过SCK线提供时钟信号,所有设备都会根据时钟信号来同步数据传输。数据在时钟的上升沿或下降沿被捕捉,取决于SPI的模式设置;
- 数据传输:数据从主设备通过MOSI线发送到从设备,从设备通过MISO线返回数据到主设备;
- 结束通信:主设备通过将SS线拉高来停止与从设备的通信,表示当前数据传输结束;
SPI协议支持多种工作模式,,这些模式的主要区别在于时钟极性(CPOL)和时钟相位(CPHA)的不同设置。两者决定了数据传输的时序:
- CPOL(Clock Polarity):控制时钟信号的空闲状态(高电平或低电平)。如果CPOL为0,则时钟在空闲时为低电平;如果CPOL为1,则时钟在空闲时为高电平;
- CPHA(Clock Phase):控制数据的采样时刻。CPHA决定了数据在时钟的哪个边沿被采样(上升沿或下降沿);
SPI有四种常见模式,分别由CPOL和CPHA的不同组合产生:
- 模式0:CPOL=0, CPHA=0(时钟空闲时低,数据在时钟的上升沿采样);
- 模式1:CPOL=0, CPHA=1(时钟空闲时低,数据在时钟的下降沿采样);
- 模式2:CPOL=1, CPHA=0(时钟空闲时高,数据在时钟的上升沿采样);
- 模式3:CPOL=1, CPHA=1(时钟空闲时高,数据在时钟的下降沿采样);
选择正确的SPI模式非常重要,它必须与从设备的SPI设置兼容。
3.2 SPI的基本通信过程
sequenceDiagram
participant 主机
participant 从机
主机 ->> 从机: SS 拉低(开始通信)
主机 ->> 从机: SCK(时钟信号开始)
主机 ->> 从机: MOSI 发送数据位(如 0xA5)
从机 ->> 主机: MISO 返回数据位(如 0x3C)
主机 ->> 从机: MOSI 发送下一个数据位
从机 ->> 主机: MISO 返回下一个数据位
主机 ->> 从机: SS 拉高(结束通信)
三、USB
USB(Universal Serial Bus)技术自问世以来,经历了多次重大升级,不断满足日益增长的数据传输和供电需求。从USB2.0、USB3.0和Type-C,带来了显著的性能提升
USB 2.0于2000年发布,最大传输速率480Mbps,是USB 1.1的40倍。它采用半双工通信方式,使用4线制连接(VBUS、D+、D-、GND)。供电能力方面,USB 2.0可提供最大500mA电流。
USB3.0于2008年发布,理论传输速率达到5Gbps。它采用全双工通信,新增了5个触点(2对差分信号线和1根地线)。供电能力提升至900mA,后续的USB 3.1更支持最大3A电流。
USB Type-C于2014年发布,是USB接口的物理形态革新。它采用24针对称设计,支持正反插拔。Type-C接口整合了USB 3.1、DisplayPort、Thunderbolt等多种协议,最大传输速率可达40Gbps(USB4)。
3.1 USB工作原理
USB相较于传统的通信方式要复杂的多,主要基于D+、D-两根差分信号线配合来传输数据,当D+高于D-时,表示逻辑高;当D+低于D-时,表示逻辑低。
协议层机制要复杂的多,目前没有实用场景,所以将来如果用到了再深入学习吧。
四、CAN
CAN(Controller Area Network)总线是一种广泛应用于工业控制和汽车电子领域的现场总线技术。
特点:
- 差分信号传输,最大距离可达10km;
- 支持多主架构,通信速率可配置,最高可达1Mbps;
- 节点可热插拔;
- 异步,半双工通信;
- 可实现广播式、请求式两种通信方式;
仅需要两跟信号线(CAN_H、CAN_L),无需共地;
3.1 CAN工作原理
硬件电路包含CAN总线上的设备,需要包含CAN控制器、CAN收发器
graph
subgraph Node1[设备1]
CANController1[CAN控制器]
CANTransceiver1[CAN收发器]
CANController1 -->|TX| CANTransceiver1
CANController1 -->|RX| CANTransceiver1
end
subgraph Node2[设备2]
CANController2[CAN控制器]
CANTransceiver2[CAN收发器]
CANController2 -->|TX| CANTransceiver2
CANController2 -->|RX| CANTransceiver2
end
subgraph Node3[设备3]
CANController3[CAN控制器]
CANTransceiver3[CAN收发器]
CANController3 -->|TX| CANTransceiver3
CANController3 -->|RX| CANTransceiver3
end
subgraph Node4[CAN总线]
CANTransceiver1 -->|CAN_H| CANBus_H[CAN_H]
CANTransceiver1 -->|CAN_L| CANBus_L[CAN_L]
CANTransceiver2 -->|CAN_H| CANBus_H
CANTransceiver2 -->|CAN_L| CANBus_L
CANTransceiver3 -->|CAN_H| CANBus_H
CANTransceiver3 -->|CAN_L| CANBus_L
end
CAN总线采用差分信号传输,电平状态由CAN_H和CAN_L的电压差决定。显性电平(Dominant)表示逻辑0,CAN_H约为3.5V,CAN_L约为1.5V,电压差约为2V。隐性电平(Recessive)表示逻辑1,CAN_H和CAN_L均为2.5V,电压差为0V。
这里隐性是指默认状态,两线没有压差;反之亦然。
标准数据帧格式:
packet-beta
0:"SOF"
1-11:"ID"
12:"RTR"
13:"IDE"
14:"r0"
15-18:"DLC"
19-83:"Data[64bit]"
84-98:"CRC"
99:"CRC"
100:"ACK"
101:"ACK"
102-109:"EOF"
- 0: SOF(Start of Frame):第 0 位,1 位显性电平(逻辑 0),标志帧的开始。
- 1-11: 标识符(Identifier):第 1-11 位,表示消息的优先级和内容。
- 12-15: 控制字段(Control Field):
- 12: RTR(Remote Transmission Request):1 位显性电平(逻辑 0),表示数据帧;隐性电平(逻辑 1)表示远程帧。
- 13: IDE(Identifier Extension Bit):1 位显性电平(逻辑 0),表示标准帧;隐性电平(逻辑 1)表示扩展帧。
- 14: r0(Reserved Bit):1 位显性电平(逻辑 0),保留位。
- 15-18: DLC(Data Length Code):4 位,表示数据场的字节数(0-8 字节)。
- 19-XX: 数据场(Data Field):从第 19 位开始,长度为 0-8 字节,实际传输的数据。
- XX+1-XX+15: CRC(Cyclic Redundancy Check):15 位 CRC 校验码,用于错误检测。
- XX+16: CRC界定符(CRC Delimiter):1 位隐性电平(逻辑 1),标志 CRC 字段结束。
- XX+17: ACK槽(ACK Slot):1 位隐性电平(逻辑 1),发送节点发送,等待接收节点确认。
- XX+17: ACK(Acknowledge):1 位显性电平(逻辑 0),接收节点发送,确认接收成功。
- XX+18: ACK界定符(ACK Delimiter):1 位隐性电平(逻辑 1),标志 ACK 字段结束。
- XX+19-XX+25: EOF(End of Frame):7 位隐性电平(逻辑 1),标志帧的结束。