有线通信协议基础
提到通信协议,除了常见的HTTP、TCP/IP等网络协议和Modbus等应用层协议外,嵌入式系统中,还广泛使用UART、I2C、SPI等芯片间通信协议,CAN等工业总线,USB、PCIe等高速接口,以及Bluetooth、WiFi、ZigBee等无线协议。
需要注意的是像RS-485、RS-232、TTL等主要定义的是电气特性或物理层规范,而不是完整的通信协议。
| 特性 | 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、扩展卡 |
1. 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)或 MAX485(RS485转TTL)来进行电平转换和实现不同设备之间的通信。
2. 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没有输出能力,依靠外部上拉电阻。因此只要总线上有一个设备拉低电平,整个总线的电平都会被拉低。
这里需要考虑隔离故障。
2.2. I2C工作原理
I2C由时钟线和数据线共同作用,来实现信号的发送接收:
- 数据传输是通过在SCL线的时钟脉冲引导下进行的。每次时钟脉冲时,SDA线上会传输一个数据位;
- 逻辑“1”:SCL一次脉冲,SDA高电平;逻辑“0”:SCL一次脉冲,SDA低电平;
- 起始信号定义:在SCL高电平期间,SDA从高电平跳变为低电平,表示I2C通信开始;
- 停止信号定义:在SCL高电平期间,SDA从低电平跳变为高电平,表示I2C通信结束;
- ACK(应答,确认信号):接收方在接收每个字节后,拉低SDA,表示成功接收数据;
- NACK(非应答):接收方在接收数据后,保持SDA高电平,表示未成功接收数据或不需要更多数据;
2.3. I2C的基本通信过程
sequenceDiagram
participant 主机
participant 从机
主机 ->> 主机: 起始信号 (SDA在SCL高电平时拉低,表示通信开始)
主机 ->> 从机: 发送设备地址 (SDA->ADDR, SCL产生时钟脉冲)
从机 ->> 主机: 发送应答 (从机拉低SDA表示接收成功)
主机 ->> 主机: 发送数据 (SDA->DATA, SCL产生时钟脉冲)
从机 ->> 主机: 发送应答 (从机拉低SDA表示接收成功)
主机 ->> 主机: 发送停止位(SDA在SCL高电平时拉高,表示通信结束)
像STM32部分GPIO有配置I2C硬件资源,硬件模块会自动处理大部分时序,大大简化了I2C通信的实现,开发者只需要配置相应的参数(如时钟速度、I2C模式等),然后就可以使用简单的API进行数据传输。
2.4. 硬件I2C与软件I2C(模拟I2C)的区别
当然也可以在单片机上模拟I2C通信(即使用软件模拟I2C)这种方法并不依赖于硬件I2C模块,而是通过GPIO引脚手动控制时钟(SCL)和数据(SDA)线的电平变化来模拟I2C的时序。
硬件I2C通常指硬件模块实现的,直接通过寄存器配置控制时序。
- 优点:
- 速度快,支持各种I2C模式,往往支持1Mhz以上甚至更高;
- 硬件自动处理时序;
- 稳定;
- 无须CPU参与;
- 缺点:
- 兼容性问题;
- 引脚固定;
软件I2C通常指通过配置GPIO模拟时序,通过软件控制高低电平时序。
- 优点:
- 不依赖硬件,灵活;
- 兼容性强;
- 缺点:
- 效率低,速度慢;
- 稳定性差,容易收到中断等高优先级任务打断;
3. 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 拉高(结束通信)
4. 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)。
4.1. USB工作原理
USB相较于传统的通信方式要复杂的多,主要基于D+、D-两根差分信号线配合来传输数据,当D+高于D-时,表示逻辑高;当D+低于D-时,表示逻辑低。
协议层机制要复杂的多,目前没有实用场景,所以将来如果用到了再深入学习吧。
5. CAN
CAN(Controller Area Network)总线是一种广泛应用于工业控制和汽车电子领域的现场总线技术。
特点:
- 差分信号传输,最大距离可达1km;
- 支持多主架构,通信速率可配置,最高可达1Mbps;
- 节点可热插拔;
- 异步,半双工通信;
- 可实现广播式、请求式两种通信方式;
- 根据标识符(Identifier 以下称为 ID)决定优先级(ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级)。
- 同一网络中,所有单元必须设定成统一的通信速度
仅需要两跟信号线(CAN_H、CAN_L),无需共地;
Q: CAN和RS-485有什么区别?
A:
| / | RS-485 | CAN |
|---|---|---|
| 协议完整性 | 需外挂协议(如Modbus) | 自带完整协议 |
| 多主机支持 | 需软件协调 | 硬件级多主机仲裁 |
| 错误恢复 | 无自动恢复机制 | 自动重发错误帧 |
| 成本 | 低(简单驱动芯片) | 较高(专用CAN控制器) |
5.1. CAN工作原理
5.1.1. 物理层特性
硬件电路包含CAN总线上的设备,需要包含CAN控制器、CAN收发器。
flowchart LR
%% 节点1
subgraph Node1[CAN节点]
direction TB
subgraph MCU1[MCU]
CAN_Controller1[CAN 控制器]
end
CAN_Transceiver1@{ shape: hex, label: "CAN 收发器" }
CAN_Controller1 ---|CAN_TX/CAN_RX| CAN_Transceiver1
end
%% CAN总线
subgraph Node2[CAN BUS]
CAN_High/CAN_Low
end
%% CAN总线连接
CAN_Transceiver1 --- CAN_High/CAN_Low
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。
这里隐性是指默认状态,两线没有压差;反之亦然。
当多节点冲突时,采用的“线与”逻辑:显性(0)优先于隐性(1);只有所有节点均发送隐性(1),总线才表现为隐性。
5.1.2. 数据链路层特性
帧化、错误检测、仲裁、应答等,这些都属于数据链路层的范畴。
CAN通信帧格式:有数据帧、遥控帧、错误帧、过载帧、帧间隔5种帧类型。
- 数据帧:用于发送单元向接收单元传送数据的帧;
- 其中数据帧又分为标准帧和扩展帧,数据帧与扩展帧的核心差异体现在ID的位数和结构上,扩展帧通过更长的ID实现了更大的寻址空间。
- 遥控帧:用于接收单元向具有相同ID的发送单元请求数据的帧;
- 错误帧:用于当检测出错误时,向其他单元通知错误的帧;
- 过载帧:用于接收单元通知其尚未做好接收准备的帧;
- 帧间隔:用于将数据帧及遥控帧与前面的帧分离开来的帧;
这里一帧数据通常分为7个段,帧起始、仲裁段、控制段、数据段、CRC段、ACK段、帧结束
timeline
title CAN Frame Structure
section 帧起始
SOF : 1
section 仲裁段
ID : 11
section 控制段
RTR : 1
IDE : 1
r0 : 1
DLC : 4
section 数据段
Data : 0-64
section CRC段
CRC : 15
section ACK段
ACK Slot : 1
ACK Delimiter : 1
section 帧结束
EOF : 7
标准数据帧格式:
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),发送节点发送,等待接收节点确认。
- ACK(Acknowledge):1 位显性电平(逻辑 0),接收节点发送,确认接收成功。
- XX+18: ACK界定符(ACK Delimiter):1 位隐性电平(逻辑 1),标志 ACK 字段结束。
- XX+19-XX+25: EOF(End of Frame):7 位隐性电平(逻辑 1),标志帧的结束。
5.2. CAN的波特率计算
这里主要观点参考了【Fitz&】的文章《CAN总线—–位同步、仲裁和错误处理》1,写的很好理解。
在了解CAN的波特率计算之前,我们需要对CAN的位时序要有一定概念。
由于CAN总线上没有时钟线,总线上的所有设备通过约定波特率的方式确定每一个数据位的时长。因此发送方每个固定时间输出一个位数据,接收方以约定的间隔采集总线电平。一个CAN网络需要规定一个通信的波特率,各节点都以相同的波特率才能进行数据交换。
因此会出现常见问题:
- 接收方采样点没有跟数据中心对齐;
- 产期累基时钟误差,使采样点偏离;
为了调整采样点位置,CAN总线对每个数据位的进行精细划分、分为同步段(SS)、传播时间段(PTS)、相位缓冲段(PBS1)、相位缓冲段(PBS2)、每个段又由若干个最小单位时间(TQ)构成。
timeline
title CAN 位时间定义图(Nominal Bit Time)
section 时间段定义
Synchronization Segment(SS) : 1 TQ (Time Quantum)
Propagation Time Segment(PTS) : 可变长度
section 采样点标记
Phase Buffer Segment 1(PBS1) : 可变长度 : PBS1前端,Sample Point 2
Phase Buffer Segment 2(PBS2) : 可变长度 : PBS1末端,Sample Point 1
说明
- 同步端(SS):用于同步总线上的各个节点,边沿跳变预期发生在此段内。
- 传播时间段(PTS):补偿信号在总线上的物理传播延迟,确保节点能正确读取电平。
- 相位缓冲段(PBS1):通过重同步机制(延长或缩短此段)补偿时钟偏差。
- 相位缓冲段(PBS2):与PBS1类似,但主要用于缩短相位误差,确保采样点位置正确。
经过如此划分后,将一位数据分割为若干段,然后再段中找的合适的采集位置。数据的跳变沿是在同步段上执行,然后采样在PBS1和PBS2之间的位置去采样。这样就可以解决采样的问题。
因此波特率的计算就比较简单:
\[TQ\,(s) = \frac{Prescaler}{CANClock\,(Hz)}\] \[BitTime\,(s) = (SS + PTS + PBS1 + PBS2) \times {TQ\,(s)}\] \[Baudrate\,(kbps) = \frac{1}{BitTime\,(s)} = \frac{CANClock\,(Hz)}{Prescaler \times (SS + PTS + PBS1 + PBS2)}\]说明
- Prescal,指分频系数
- CANClock,指CAN的时钟周期
- 周期与频率是倒数关系
- 波特率是每比特时间的倒数
同理采样点位置计算如下:
\[SamplePoint = \frac{SS + PTS + PBS1}{SS + PTS + PBS1 + PBS2}\]5.3. CAN的同步机制
上一节中提到了位时序,每一位数据都基于TQ分为了四段。在实际收发的过程中具体是如何解决同步问题呢?这里涉及到CAN的同步机制。
简单来说每接收到一个下降沿进行一次同步。发送单元以约定好的位时序进行数据发送,接收单元根据总线上收到的下降沿进行位时序同步。
但是,发送节点和接收节点作为互相独立的硬件个体,时钟频率误差、传输路径上的(电缆、驱动器等)相位延迟等都会引起时序偏差。因此接收单元需通过硬同步或者重同步的方法进行位时序调整。
硬同步:在单元总线空闲的时候,检测到第一个下降沿时(对应报文的SOF下降沿)进行同步调整。这里直接认为下降沿位SS端,强制对齐SS,然后按照位时序对信号进行采集,达到同步效果。
重同步:在单元接收的过程中,检测到下降沿时,根据SJW(重同步补偿宽度,SJW为PBS1增加或PBS2减少的最大TQ数,由CAN控制器硬件自动调整,无需软件干预)调整同步。例如:在同收发过程中本该在SS段收到的下降沿延却延后2个TQ数,这里CAN收发器通过重同步机制自动调整PBS1增加2个TQ,从而调整电平采集点位置。
硬同步与重同步的主要区别:
- 硬同步只在空闲状态检测出第一个下降沿(帧起始下降沿)时进行,而重同步则在其余各段进行。
- 硬同步是“全局复位”,重同步是“局部微调”。
当位时序总Tq数越大,对误差的量化就会越精确,重同步的同步效果就越理想。因此,合理配置位时序的Tq数极为重要。
5.4. CAN的仲裁机制
总线的某一时刻,存在多个节点外发报文的可能,利用总线仲裁规则,可以合理分配各节点对总线的使用权。
CAN的仲裁涉及到CAN ID,ID决定优先级(ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级),ID值小的优先级更高。当两个以上的单元同时开始发送消息时,对各消息 ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。
原则很简单,利用“线与”规则进行仲裁。每个CAN节点监听总线是否空闲(规定连续11个位隐性电平即为空闲),空闲了,就可以去尝试发送CAN报文。
怎么“线与”呢?显性(0)优先于隐性(1);只有所有节点均发送隐性(1),总线才表现为隐性。
举例,假设三个节点同时尝试发送消息:
- 节点 A:ID = 0x0001(二进制 0000 0000 0000 0001)
- 节点 B:ID = 0x0002(二进制 0000 0000 0000 0010)
- 节点 C:ID = 0x0003(二进制 0000 0000 0000 0011)
- ID在总线上时高位在先,左对齐的(MBS)
所以在第15位时节点A为0,节点A获胜。节点B和C检测到总线是0,而自己发送的是1,因此立即退出发送。
5.5. CAN的错误状态
6. MODBUS
MODBUS工业领域常用的通信协议之一,属于应用层协议。是一种串行通信协议,协议规范公开,无需授权费用,支持广泛厂商设备兼容。
特点:
- 帧格式清晰(地址+功能码+数据+校验);
- 可以基于串口(RS-485/RS-232)进行二进制编码;
- 也可以基于以太网,通过TCP端口502传输
基于串口的标准数据帧格式:
packet-beta
0-7:"Header"
8-15:"Function Code"
16-31:"Start Address"
32-47:"Register Count"
48-63:"CRC"
- 0-7:从站地址
- 8-15:功能码
- 16-31:写入寄存器地址
- 32-47:寄存器值
- 48-63:CRC校验
参考资料
Renesas. (2006). CAN入门书. http://wenku.uml.com.cn/document/qrskf/CAN%E5%85%A5%E9%97%A8%E4%B9%A6.pdf
-
Fitz. (2024). CAN总线—–位同步、仲裁和错误处理. https://blog.csdn.net/m0_73633088/article/details/141175701 ↩