CAN 总线协议

本文详细介绍了CAN总线协议,包括其基础概念、物理特征、节点结构、寻址方式、总线访问仲裁、数据帧格式、错误处理及位时序等内容。还阐述了CANFD在传统CAN基础上的改进,如更高传输速率和更大数据场。CAN总线广泛应用于汽车等领域,CANFD则满足了高速率数据传输需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CAN 总线协议

1 CAN 基础

1.1 简介

CAN 总线协议(Controller Area Network)控制器局域网总线。是 ISO 国际标准化的串行通信协议。

那 CAN 是为了解决什么问题而出现的呢?

在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。

为适应“减少线束的数量”、“通过多个 LAN(Local Area Network 局域网),进行大量数据的高速通信”的需要,1986 年德国电气商博世公司开发出面向汽车的 CAN 通信协议。此后,CAN 通过 ISO11898 及 ISO11519 进行了标准化,现在在欧洲已是汽车网络的标准协议。现在,CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。

车联网中其它总线:CAN、LIN、FlexRay、MOST、IDB-C。

使用数据总线对比:

点对点方式:早期车上电控单元数量较少,采用如下点对点的连接方式,数据交互的两个节点之间专线专用;

当 ECU(电控单元)数量增加,线束增加、成本增加、布线难度增大;最主要的是:不便于网络的扩展
在这里插入图片描述

总线型网络拓扑结构:节点之间数据交互通过共享介质,即一条总线完成,需要参与总线通信的节点通过支线挂载到总线上。

总线型拓扑结构好处体现在具有良好的扩展性:在原有网络基础上添加新节点,只需要将节点挂到总线上即可,无需对原有网络的硬件、软件做过多的修改;例如,CAN 总线中我们可以使用分析仪检测总线通讯中的错误,就是将分析仪作为一个节点挂到网络中。

但是这种结构不是没有缺点:所有的数据传输都是通过总线进行的,总线的带宽就成了网络传输的数据瓶颈。

CAN 总线:高速 CAN 最高支持 1Mb/s,低速 CAN 最高支持 125kb/s。
在这里插入图片描述

1.2 CAN 总线物理特征

CAN 总线使用双绞线进行数据传输,双绞线特性:阻抗稳定。
在这里插入图片描述
总线电平:我们将黑色认为 CAN_High,白色认为 CAN_Low;

CAN 总线使用差分信号进行传输,如下为 CAN_High、CAN_Low 总线显性和隐性电平。进行差分之后,CAN 总线体现为隐性电平 0V,显性电平 2V;我们将隐性电平称作逻辑 1,显性电平称作逻辑 0,这是因为 CAN 节点在数据传输过程中要执行**线“与”**的操作。

显性电平和隐性电平:显性具有优先的意味,(因为 CAN 总线是有多个节点同时往总线发送数据的)只要有一个单元输出显性电平,总线上即为显性电平,并且,隐性电平具有包容的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平。(显性电平比隐性电平更强)
在这里插入图片描述
时序体现:比如单元 1 发送 0,单元 2 发送 1,总线上体现出的就是 0(显性电平)。对应的 CAN 总线物理电平如下:CAN_High 3.5V,CAN_Low 1.5V,差分电平 2V,总线呈显性。
在这里插入图片描述
可以看到在总线的最远两端,两个节点内部都集成了终端电阻:其作用是保证信号在传输过程中的阻抗连续性,消除了由于阻抗中断等带来的反射波效应。CAN 总线中计算得出一般是 120 欧;上图是闭环总线(高速 CAN),还有开环总线(低速 CAN),开环总线就将终端电阻串在两根线上。

(CAN 协议涵盖了 OSI(Open Systems Interconnection) 基本参照模型中的传输层、数据链路层及物理层。)

1.3 CAN 节点结构

在这里插入图片描述
MCU:负责与其它节点的应用层数据交互,将需要发送的数据传给 CAN 控制器进行发送,或者接收来自 CAN 控制器的数据进行处理。

CAN 控制器:负责进行报文的封装与解封装,将来自 MCU 的数据封装之后以二进制码流的形式传给 CAN 收发器进行发送,或者对从 CAN 收发器收到的数据进行解封装,打包之后传给 MCU 进行处理。

CAN 收发器:负责将二进制位流的信号与物理电平进行转换,根据 CAN 协议物理层定义的电平转换逻辑将 CAN_H、CAN_L 电平拉到相应阈值,或在检测到总线上的数据时,将 CAN_H、CAN_L 的差分电平解析成数据链路层传输的二进制 bit 流传给 CAN 控制器;

数据传输方式:CAN 控制器根据两根线上的电位差来判断总线电平,发送方通过使总线电平发生变化,将消息发送给接收方。

从上图中也可以看出 CAN 网络的总线型拓扑结构,每个节点都是通过 CAN_H、CAN_L 这两根线挂到总线上面;

2 寻址方式

寻址方式:定义数据从哪里来到哪里去,确定其发送与接收的关系。

**点对点寻址方式:**关系明确,发送的数据里面会包含源地址和目标地址,指示数据发送方和接收方。

**广播寻址:**一对多,发送节点只负责将数据发送到总线,不指定接收节点,所有挂在总线上的节点都可以接收到数据,但是具体接不接受是接收节点自己决定的。
在这里插入图片描述
**接收过滤:**CAN 节点内部 CAN 控制器中,存在一个 Filter,这个接收过滤器可以根据应用层的配置,选择上层需要的数据进行传递,不必要的数据过滤掉,好处是减少 MCU 对一些不必要的数据的处理,避免资源浪费;

CAN 总线通过广播寻址和接收过滤实现一对多通信。
在这里插入图片描述

3 总线访问

在 CAN 网络中,节点没有主从之分,是多主控制;每一个节点在总线空闲的时候都可以访问总线。而且是共享传输机制,总线在任一时刻只能被一个节点访问;

所以可能会出现如下情况:在某一时刻总线空闲,多个节点同时想去访问总线,即出现访问冲突的情况,那就需要一种机制去解决这种冲突。

解决机制:当遇到访问冲突,根据每个节点发送的报文 ID,进行优先级裁定。优先级高的先进行发送,低优先级并不会因为仲裁失败就将要发送的报文丢弃,会等到下一次总线空闲时再次尝试重发,叫做非破坏性仲裁机制

如下,仲裁机制工作例子:假设有 3 个节点,在这一时刻,同时想去访问总线,它们会一起往总线上发送数据;
在这里插入图片描述

3.1 仲裁过程

1、目前看到的这个 bit0 是帧起始位,表示一帧报文的开始,这里先不管,后面报文结构会看到。

在帧起始位之后就是 CAN 报文 ID 段,CAN 报文的标准帧 ID 由 11bit 组成,仲裁的过程中会对 11bit 逐位比较。

在帧起始位之后,紧接着发 ID,如果发送的数值都相同,进行线与之后,总线上体现的都是一样的,肯定没有办法去裁定优先级高低。
在这里插入图片描述

2、当出现不一致的时候,我们会通过线与的机制:就是 0 和 1 进行与运算,0 表示显性,1 表示隐形,0 会将 1 覆盖掉,总线呈现显性,这是第一种机制。

在第 4 个 bit,节点 A 发送 1,B 和 C 发送 0,与运算之后得到 0,实际总线上体现出也是 0。

**回读机制:**每个节点在发送数据的时候,会回读总线值,比较自己发送的内容和总线实际值是否一致。

例如在第 4 个 bit A 发送 1,回读出总线 0,就出现了不一致,这时候 A 认为它丢失了仲裁。

仲裁失败之后,节点 A 会由一个发送节点转换为接收节点,后面就不会去发送数据了,从这个时候去接收总线上其它节点发送的数据。
在这里插入图片描述
3、这时 B 和 C 还没有仲裁出优先级,则继续发送数据,当某一位出现的时候,节点 B 发送 0,节点 C 发送 1,进行与运算,总线表现出 0;C 回读总线 0,自己发送 1,所以 C 仲裁失败,转变为接收节点;那 B 回读一致,会继续发送。
在这里插入图片描述
4、ID 场发送完毕,B 仲裁成功,将报文发送完。

之后总线又进入空闲状态,节点 A 和 C,如何没有其它节点加入,会进行新一轮仲裁,那其实我们可以看到 C 优先级高,所以会先发送。
在这里插入图片描述
如上就是报文仲裁过程,会逐位比较 ID 场,根据线与和回读机制判断报文优先级。

在 CAN 报文中,每帧 ID 的数值都是唯一的,没有两个相同的 ID,所以说在遇到冲突的时候,肯定会决出优先级。

其实我们可以看到,在报文的 ID 场,高位上的 0 越多,在仲裁过程中会有优势。对于标准帧来说,ID 越小,优先级越高,所以在实际应用中,会将实时性要求比较高的报文 ID 数值设置的比较小,在总线冲突的时候能够具有优先访问总线的权利。

4 CAN 数据帧

4.1 帧类型

在这里插入图片描述
另外,数据帧和遥控帧有标准格式和扩展格式两种,标准格式有 11bit ID,扩展格式有 29bit ID。

4.4.1 标准帧

如下是标准帧 CAN 报文结构组成:

帧起始:表示数据帧开始的段;

仲裁段:表示该帧优先级的段;

控制段:表示数据的字节数及保留位的段。

数据段:数据内容,可以发送 0~8 字节数据;

校验段:检查帧的传输错误的段。

ACK 段:表示确认正常接收的段;

帧结束:表示数据帧结束的段;

各个段里面也会有一些特殊的标识位。
在这里插入图片描述
1、SOF:固定格式 0,1bit 的显性位。总线在空闲的时候状态都是 1,所以在发送报文的时候,SOF 设为 0。

接收节点在检测到 SOF 之后,会跟当前总线时钟进行同步,称为硬同步,CAN 协议里面还定义了重同步。
在这里插入图片描述
2、仲裁段:由 ID 和 RTR 位组成,ID 前面提到,发送节点可以根据 ID 的数值,进行优先级裁定,而接收节点在接收数据的时候,也可以根据 ID 做一些接收过滤。
在这里插入图片描述

3、RTR:远程帧传输请求;0:数据帧,1:远程帧。

远程帧不携带数据段,只是用来请求数据发送。

在这里插入图片描述

IDE:也是格式指示位,扩展帧格式指示位。0 标识标准帧,1 标识扩展帧。

扩展帧 ID 是 29bit,多了 18bit 的扩展 ID。

扩展帧中 SRR:扩展远程帧请求,替代远程请求位,同 RTR 作用类似。

r 是保留位,没有特殊含义,一般是显性 0。CANFD 会用到。

在这里插入图片描述

DLC:指示数据段字节数量,4bit 最大表示 15,但是传统 CAN 报文,一帧只有 8 字节,所以 0-8 表示 0-8 个字节,9-15 也表示 8 字节,CANFD 会将 9-15 使用起来,FD 最大支持 64 字节。

后面就是数据段。

在这里插入图片描述

4、CRC:15bit 的校验算法,校验范围:SOF 到 数据段。

DEL:界定符位,没有特殊含义。

发送节点计算并发送 CRC,接收节点也计算 CRC 并于收到的 CRC 进行比较。

在这里插入图片描述

5、ACK:是需要接收节点给发送节点的应答。由接收节点发送。

发送节点这 ACK bit 位都是 1,接收节点根据 CRC 决定 ACK,校验成功发送 0,相当于给一个肯定的应答;失败发送 1。(显隐性有关)

发送节点会回读总线上这 bit 具体数值。回读 0,表明有接收节点正确接收到数据,对发送节点来说,认为自己前面发送的数据没有问题,会继续去发送数据;如果失败,认为当前发送数据有问题,停止发送,并在下一位之后发送错误帧。

对于 CRC 校验失败的接收节点来说,也会发送错误帧,是在 ACK 的 DEL 之后去发送。后面会提到。

ACK 段由 ACK Slot 和 ACK 界定符组成。

在这里插入图片描述

6、EOF:7bit 的隐性位,标识 CAN 报文结束。

在每帧 CAN 报文结束之后,会额外增加 3bit 的帧间隔。在帧间隔之后,才允许其它节点访问总线。

那我们可以看到,后面出现了 11bit 的连续隐性位。所以在 CAN 报文中,如果检测到连续 11bit 的1,就表示总线空闲。

如果在前面数据场发送 11bit 1,会不会让其它节点误认为总线空闲,发送数据,而导致数据紊乱?

:不会出现,位填充机制。

在这里插入图片描述

4.2 位填充

位填充:是为防止突发错误而设定的功能;(与他的错误保护机制有关。)

规则:当同样的电平持续 5bit 时,添加一位的反型数据;

填充范围:SOF~CRC 段间的数据,由发送节点插入,接收节点删除,当接收节点第 6bit 与前 5bit 电平相同,将被视为错误,并发送错误帧。

如下例子展示了在 5 个极性相同的位之后插入填充位。

如果用示波器捕捉,包括填充位。

在这里插入图片描述

5 总线错误处理

5.1 错误类型

在这里插入图片描述

**位错误:**比较输出电平和总线电平(不含填充位),当两电平不一样时检测到的错误。

发送节点回读,范围是从 SOF 到 EOF,但是中间有虚线状态:

对于仲裁场:对发送节点来说,是仲裁失败,不是错误。比如某些节点发 1,被其它节点 0 覆盖,会转变位接收节点。

那有没有可能发 0 读 1,不可能,因为显隐性。

**填充错误:**在需要位填充的段内,连续检测到 6bit 相同的电平时所检测到的错误。

SOF 开始到 CRC,如果在这个范围内检测到 6 个极性相同的位,必然是破坏了填充规则,会报一个填充错误。

**CRC 错误:**从接收到的数据计算出的 CRC 结果与接收到的 CRC 不同时所检测到的错误。

**格式错误:**检测出与固定格式的位段相反的格式时所检测到的错误。

对 CRC 的 DEL、ACK 的 DEL 以及 EOF,都是固定格式位,如果检测到相反的,表明破坏固有格式。

**ACK 错误:**发送单元在 ACK Slot 中检测出隐性电平时所检测到的错误(ACK 没被传送过来时所检测到的错误)。

ACK 回读的点平是相反的,发送节点发的是1,如果读 0,是正确的。读 0 表示有接收节点 CRC 校验成功,给了肯定的应答;发1 读1 错误。

接收节点发送完 ACK,给完肯定应答之后,也会去回读,发送是0,如果读到了 1,就会认为错误;在下一个 bit 就会发送错误帧。

试想如果发送节点发送 ACK 是 0,那无论接收节点的 ACK 发 0 还是 1,最终线与机制得到都会是 0,所以发送节点的 ACK 发送 1,能区分出接收节点的正确或错误。

5.2 错误帧

检测出错误,如何告知参与通信的节点:在 CAN 网络中,检测到错误之后,会以发送错误帧的方式,告知其它参与通信的节点,当前正在发送的数据有误。

错误帧格式:由 6bit 的错误帧标识位,和 8bit 错误界定符构成。

错误帧发送原则:当一个错误被检测到之后,错误帧在下一个位立马会发出来;

CRC 错误除外,会先在 ACK Slot 这一位发个 1,给一个否定应答;在 ACK DEL 之后,才发送 CRC 错误帧。

错误帧标识位可分为:

主动错误标识:6 个 0,8 个 1,当一个节点处于主动错误状态,发主动错误帧;

被动错误标识:6 个 1,8 个 1,当一个节点处于被动错误状态,发被动错误帧;

在这里插入图片描述

5.3 错误状态

错误状态的种类:

1、主动错误状态:是可以正常参加总线通信的状态。处于主动错误状态的单元检测出错误时,输出主动错误标识。

由于主动错误标识发送 6bit 显性 0,任何节点都能立即检测出错误,从而丢弃错误帧。

由于 6bit 连续的显性位违反填充规则,进而造成其它节点也可能出现主动错误,真实总线上就出现错误标识重叠部分,错误帧标识位长度为 6 或 12 个显性位(如下发送错误帧的例子会看到)。

2、被动错误状态:被动错误状态是易引起错误的状态。处于被动错误状态的单元虽能参加总线通信,但为不妨碍其它单元通信,接收时不能积极的发送错误通知。处于被动错误状态的单元即使检测出错误,而其它处于主动错误状态的单元如果没发现错误,整个总线也被认为是没有错误的。处于被动错误状态的单元检测出错误时,输出被动错误标识。

另外,处于被动错误状态的单元在发送结束后不能马上再次开始发送。在开始下次发送前,在间隔帧期间内必须插入“延迟传送”(8bit 的隐性位)。

(对于发送节点,如果出现被动错误,被动错误帧就可以直接发出来,告知其它节点发送的数据有误。

而对于接收节点,检测到被动错误之后,发 6 个 1,可能会被发送节点其它数据覆盖掉,它的错误标志是不会被其它节点所发现的,从而不影响其它接收节点的数据,它只能等到其它处于主动错误状态的接收节点也同样检测到错误之后,发送 6 个 0 的错误标识位,去告知其它节点。)

3、总线关闭态:

总线关闭态是不能参加总线上通信的状态。信息的接收和发送均被禁止。

在这里插入图片描述

发送错误计数和接收错误计数来管理错误状态,根据计数值决定进入何种状态。错误状态和计数值的关系如表所示。

在这里插入图片描述

在这里插入图片描述

错误计数值:

发送错误计数值和接收错误计数值根据一定的条件发生变化。

错误计数值的变动条件如下表所示:

一次数据的接收和发送可能同时满足多个条件。

错误计数器在错误标识的第一个位出现的时间点上开始计数。

在这里插入图片描述

**错误帧发送例子:**先假设所有节点都会处于主动错误状态,发 6 个 0;

1、发送节点在某一个位发送 0,但是总线上是 1,对于发送节点来说,根据位监控的机制,回读不一致,所以在下一个 bit 就会停止发送数据,去发送错误帧。

在这里插入图片描述

2、在这一位接收节点收到的是 1,它不知道发送节点发送的是 0 还是 1,收到 1 就认为是 1,接收节点没有察觉到问题,会继续去接收总线上的数据;

在这里插入图片描述

3、直到连续接收到了 6 个 0,因为有填充规则,接收节点会认为错误。

在这里插入图片描述

4、对于接收节点,检测到填充错误之后,在下一个 bit,会发送错误帧,那这个时候,可以看到在总线上面表现出的错误帧,标识位不止 6个 0,可能最多出现 12 个 0,后面是错误界定符。

在这里插入图片描述

5、错误界定符之后,在加上 3bit 帧间隔,又构成了连续 11 个隐性位,总线又进入空闲状态。

由于自动纠错机制在,发送节点会将之前发送数据重发。

在这里插入图片描述

通过这个例子我们也可以看到,在 CAN 当中,错误都是成对出现的,一个节点错误必然会引发其它节点错误,最终表现出的就是所有参与通信的节点都会发错误帧,那所有节点都会将当前正在发送或接收的数据丢弃掉,保证整个总线在数据传输中的数据一致性。

6 位时序

可以思考一下,由于 CAN 没有时钟信号线,而且它的报文中并没有包含用于同步的标志,要怎么做才能对总线的电平进行正确的采样呢?比如我节点1发送3个位出去了,节点2应该在什么时候接收才能保证此时此刻它所接收到的就是第3位或者接收到的电平是正确的? CAN中提出了位同步的方式来确保通讯时序。

由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。一个位可分为 4 段。

同步段(SS)

传播时间段(PTS)

相位缓冲段 1(PBS1)

相位缓冲段 2(PBS2)

这些段又由可称为 Time Quantum(以下称 Tq)的最小时间单位构成。

1 位分为 4 个段,每个段又由若干个 Tq 构成,这称为位时序。

1 位由多少个 Tq 构成、每个段又有多少个 Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。

在这里插入图片描述

采样点:就是读取总线电平并将读到的电平作为位值的点。位值在 PBS1 结束处。

各段的作用和 Tq 数如下所示,1 个位的构成如下所示:

在这里插入图片描述

6.1 取得同步的方法

CAN 协议的通信方法为 NRZ(Non-Return to Zero)方式,各个位的开头或者结尾都没有附加同步信号。发送单元以与位时序同步的方式开始发送数据。另外,接收单元根据总线上电平的变化进行同步并进行接收工作。

但是,发送单元和接收单元存在的时钟频率误差及传输路径上的(电缆、驱动器等)相位延迟会引起同步偏差。因此接收单元通过硬件同步或者再同步的方法调整时序进行接收。

6.1.2 硬件同步

接收单元在总线空闲状态检测出帧起始时进行的同步调整。

在检测出边沿的地方不考虑 SJW 的值而认为是 SS 段。

硬件同步的过程如下:

在这里插入图片描述

6.1.3 再同步

在接收过程中检测出总线上的电平变化时进行的调整。

每当检测出边沿时,根据 SJW 值通过加长 PBS1 段,或缩短 PBS2 段,以调整同步。但如果发生了超出 SJW 值得误差时,最大调整量不能超过 SJW 值。

如下是相位超前和滞后的情况:
在这里插入图片描述

6.4 调整同步的规则

硬件同步和再同步遵从如下规则。

1、1 个位中只进行 1 次同步调整。

2、只有当上次采样点的总线值和边沿后的总线值不同时,该边沿才能用于调整同步。

3、在总线空闲,且存在隐性电平到显性电平的边沿时,则一定要进行硬件同步。

4、在总线非空闲时检测到的隐性电平到显性电平的边沿如果满足条件 1 和 2,将进行再同步。但还要满足下面条件。

5、发送单元观测到自身输出的显性电平有延迟时不进行再同步。

6、发送单元在帧起始到仲裁段有多个单元同时发送的情况下,对延迟边沿不进行再同步。

7 CANFD

7.1 简介

CANFD(CAN with flexible data rate):

传统 CAN 网络最多只能携带 8 字节数据,CAN 总线最大支持1Mb/s 的通信速率,已然难以满足如今高速率数据传输的要求,博世公司在 CAN 基础上推出了 CANFD 方案。

相对于传统的 CAN,CANFD 主要在两点做了改善:

1、更高的传输速率:但并不是从起始到结束一直维持着较高的速度,采用的是可变速率传输,将CANFD报文分为两个部分,仲裁段和数据段,在仲裁段,CAN总线上可能存在多个发送节点,使用较低的传输速率,而数据段结束了仲裁过程,只有一个节点发送数据,传输速率可以切换到更高的值。最大 8Mb/s。

在这里插入图片描述

2、字节数:数据场扩充,最大 64 字节。

总体来说改动较小,方便实施推广。

CANFD 在物理层与 CAN 保持一直,双绞线通信,物理电平与数据信号转换与 CAN 一致,如果原本 CAN 收发器能支持较高速率通信,就不需要更换。协议层面有所变动,需要使用支持 CANFD 报文解析的 CAN 控制器。

7.2 CANFD 数据帧

类似于 CAN 报文,CANFD 只是增加了标识位,以及为了完善协议做了改动。

以标准帧为例:

在这里插入图片描述

参考 CAN 报文结构,看一下变动的地方:

1、由于 CANFD 没有远程帧,所以原本用来标志远程帧的位 RTR 位,在 CANFD 报文中成为保留位,RRS(远程请求替代位)。

FDF(FD 格式):用来区分 CAN 和 CANFD 报文,1 标识 CANFD 报文。

在这里插入图片描述

2、CANFD 存在扩展帧,IDE(扩展符标识位)区别扩展帧和标准帧。

在这里插入图片描述

3、BRS(比特率切换):表示在数据段可以选择较高速率也可以不切换速率,使用和仲裁段相同的速率。

如下,报文传输会经历两种不同的速度。仲裁段 500Kb/s,数据段 4Mb/s,CRC 的 DEL 位之后,总线可能有多个接收节点给予 ACK 应答,切换到 500Kb/s。

在这里插入图片描述

4、ESI(错误状态指示位):在传统的 CAN 报文中,发送节点的错误状态,只有节点本身知道;CANFD 中,发送节点可以通过发送报文中 ESI 告知其余接收节点,当前的错误状态,1 表示被动错误状态,0 表示主动错误状态。

在这里插入图片描述

5、DLC(4bit):标识数据段长度,当是 0-8,线性表示方式,9-15,表示 12-64 之间,一些离散取值。

在这里插入图片描述

6、与 CAN 报文较大改变:

CRC段的优化:长度和校验内容都不相同。

CANFD 数据段有很大的变化空间,会根据不同的数据长度使用不同的CRC校验公式:<16:17bitCRC 校验,>16:21bit CRC 校验;CANFD CRC 校验还会将填充位计算在内,CAN 不包含。

位填充机制不同:CRC 段之前和 CRC 段填充机制不同,SOF 到数据段与 CAN 一致,5 个极性相同的位填充一个反型位;CRC 段的位填充采用固定位置的位填充,CANFD 在 CRC 前增加了4bit,对前序的填充位进行计数校验(填充位计数),CANFD 会统计 SOF 到数据段填充位的个数,将统计数据进行模 8 运算,将统计结果以二级制存放在 Stuff Bit Counter 高 3位中,最后一位是偶校验位,对前 3 个 bit 进行校验。

在这里插入图片描述

在这里插入图片描述

CRC 采用的是固定位置的位填充机制:首先在填充位计数段之前增加一个填充位,该位取值与前 1bit 相反,之后每隔 4bit 增加一个填充位,每个填充位都取前一位的相反值,那么在 CANFD 报文中 17 位的校验,就增加了 6 个固定位置的填充位,21 位就增加了 7 个填充位。

在这里插入图片描述

CANFD 报文波形截图:可以看到传输速率不同,数据段的传输速率切换到较高的值,在较短的时间内传输更多有效数据。

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值