有线通信协议基础

提到通信协议,除了常见的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电平;
  • 协议标准明确规定,每个字节从最高位开始传输,以最低位结束。是最典型的MSB First协议;

这里插一下位序概念(数据传输时的位顺序),分为了MSB和LSB两种。这里假设我们要传输一个8位数据:0b11110001(bit7 -> bit1,权重左边高,所以所以左边是高位)

  • MSB(Most Significant Bit) = 最高有效位(数值最大的位,通常是bit 7或bit 15),MSB First的传输数据顺序:11110001,先传高位;
  • LSB(Least Significant Bit) = 最低有效位(数值最小的位,通常是bit 0),LSB First的传输数据顺序:10001111,先传低位;

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高电平,表示未成功接收数据或不需要更多数据;
  • 主机等待应答:主机释放数据线(开漏输出:主机输出高电平时,实际是断开下拉MOS管,由上拉电阻控制电平)。

Q: 等待应答过程中,释放SDA原理,为什么这里SDA可以保持和拉低?
A: 首先我们知道了I2C是支持多主从的通信方式,他的物理连接如下:

    VCC
    |
    [R] 上拉电阻
    |
    |----- SDA线 ----- 主机1 ---- 从机1 ---- 从机2
    |
    主机2

从接线我们中,我们可以看到设备上所有的SDA引脚都在同一根线上,实现释放总线的的关键在于,每个设备都是开漏输出且总线上有上拉电阻。

开漏输出是由一个CMOS管来驱动,我的代码 → GPIO输出寄存器 → MOS管 → 实际SDA引脚,所以当我的设备配置GPIO为高电平时,MOSFET断开,意味着SDA引脚什么都不接,上拉电阻把SDA拉高,这时就是释放总线。

当有任意设备,输出低电平,MOSFET闭合, SDA总线直接接到GND,从而拉低总线,实现从机应答。

            VCC
             |
            [R] 上拉电阻(外部)
             |
    SDA ---------| N-MOSFET
                 |
                GND

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模拟时序,通过软件控制高低电平时序。

  • 优点:
    • 不依赖硬件,灵活;
    • 兼容性强;
  • 缺点:
    • 效率低,速度慢,占用CPU资源;
    • 稳定性差,容易收到中断等高优先级任务打断;

2.5. I2C时钟拉伸

I2C的容错率比较高,协议允许在SCL低电平时,无限期暂停,时钟拉伸是正常行为。

只要SCL高时SDA稳定,数据就安全有效。例如:

传输字节 0xA5 (10100101b):
SCL: _/‾\_/‾\_/‾\________/‾\_/‾\_/‾\_/‾\_/‾\  // 第4位时钟被拉长
     1  0  1  0  暂停   0  1  0  1
     ↑  ↑  ↑  ↑         ↑  ↑  ↑  ↑
     MSB      第4位被拉长         LSB

2.6. I2C应用

详细I2C应用可以参考EEPROM驱动开发笔记(M24C32)章节。

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通常配合Modbus使用,表现为轮询机制;而CAN在硬件链路层就原生支持多主竞争机制,即使没有应用层协议,其通信行为也是基于仲裁的竞争机制。

/ RS-485 CAN
协议完整性 需外挂协议(如Modbus) 自带完整协议
多主机支持 需软件协调 硬件级多主机仲裁
错误恢复 无自动恢复机制 自动重发错误帧
成本 低(简单驱动芯片) 较高(专用CAN控制器)

5.1. CAN工作原理

5.1.1. CAN通信网络结构

CAN的OSI七层网络主要集中在物理层和数据链路层,数据链路层现行的标准协议:ISO 11898-1。

当然也有标准的应用层(CAN OPEN)、网络层(ISO 15765)等等,但是就目前的工作,没有应用的场景,要么只能自己创造条件,要么只能放弃这部分内容。

5.1.2. 物理层特性

硬件电路包含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.3. 数据链路层特性

帧化、错误检测、仲裁、应答等,这些都属于数据链路层的范畴。

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的错误状态

// todo

6. MODBUS

MODBUS工业领域常用的通信协议之一,属于应用层协议,跟上面其他硬件协议不一样,不管物理层特性,只管数据打包,常需要依赖485、232(MODBUS RTU/ASCII)、以太网(MODBUS TCP/IP、MODBUS OVER UDP)这些底层协议。协议规范公开,无需授权费用,支持广泛厂商设备兼容。

特点:

  • 帧格式清晰(地址+功能码+数据+校验);
  • 可以基于串口(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 ""