有线通信协议基础

提到通信协议,除了常见的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

  1. Fitz. (2024). CAN总线—–位同步、仲裁和错误处理. https://blog.csdn.net/m0_73633088/article/details/141175701 

results matching ""

    No results matching ""