写点什么

一文搞懂 CAN 和 CAN FD 总线协议

  • 2022-10-19
    北京
  • 本文字数:7614 字

    阅读完需:约 1 分钟

一文搞懂CAN和CAN FD总线协议

这篇文章是将一文搞懂CAN总线协议帧格式一文搞懂CAN FD总线协议帧格式两篇文章的整合,方便各位朋友学习和查阅。

对汽车电子技术感兴趣的小伙伴请关注公众号:美男子玩编程,公众号优先推送最新技术博文,创作不易,请各位朋友多多点赞、收藏、关注支持~


CAN 总线上传输的信息称为报文,当总线空闲时任何连接的单元都可以开始发送新的报文。

CAN 通信是通过以下 5 种类型的帧进行的:

  • 数据帧

  • 遥控帧

  • 错误帧

  • 过载帧

  • 帧间隔

另外,数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有 11 个位的标识符(Identifier: 以下简称 ID), 扩展格式有 29 个位的 ID。

各种帧的用途如下表所示:

​数据帧由 7 个段构成,图解说明如下所示:

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

  • 仲裁段:表示该帧优先级的段,根据仲裁段 ID 码长度的不同,分为标准帧(CAN 2.0A)和扩展帧(CAN 2.0B);

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

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

  • CRC 段:检查帧的传输错误的段;

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

  • 帧结束:表示数据帧结束的段。

1、CAN 数据帧

1.1、帧起始

帧起始由 1 个显性位组成。总线空闲时,发送节点发送帧起始,其他接收节点同步于该帧起始位。

​总线上的电平有显性电平和隐性电平两种。

总线上执行逻辑上的线“与”时,显性电平的逻辑值为“0”,隐性电平为“1”。

“显性”具有“优先”的意味,只要有一个单元输出显性电平,总线上即为显性电平。并且,“隐性”具有“包容”的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平。(显性电平比隐性电平更强。)

1.2、仲裁段

仲裁段用于写明需要发送到目的 CAN 节点的地址、确定发送的帧类型(当前发送的是数据帧还是遥控帧),并确定发送的帧格式是标准帧还是扩展帧。

仲裁段在标准格式帧和扩展格式帧中有所不同。标准格式帧的仲裁段由 11 位标识符和远程发送请求位 RTR 组成,扩展格式帧的仲裁场由 29 位标识符和远程发送请求位 RTR 组成。

1.2.1、标准数据帧

标准数据帧基于早期的 CAN 规格(1.0 和 2.0A 版),使用了 11 位的识别域。

CAN 标准帧帧信息是 11 字节,包括帧描述符和帧数据两部分。如下表所列:

​前 3 字节为帧描述部分。字节 1 为帧信息,第 7 位(FF)表示帧格式,在标准帧中 FF=0,第 6 位(RTR)表示帧的类型,RTR=0 表示为数据帧,RTR=1 表示为远程帧。DLC 表示在数据帧时实际的数据长度。

标准数据帧的 ID 有 11 个位。从 ID10 到 ID0 依次发送。禁止高 7 位都为隐性(禁止设定:ID=1111111XXXX)。

字节 2~3 为报文识别码,其高 11 位有效。

字节 4~11 为数据帧的实际数据,远程帧时无效。

1.2.2、扩展数据帧

CAN 扩展帧帧信息是 13 字节,包括帧描述符和帧数据两部分,如下表所示:

前 5 字节为帧描述部分。字节 1 为帧信息,第 7 位(FF)表示帧格式,在扩展帧中 FF=1,第 6 位(RTR)表示帧的类型,RTR=0 表示为数据帧,RTR=1 表示为远程帧。DLC 表示在数据帧时实际的数据长度。

扩展格式的 ID 有 29 个位。基本 ID 从 ID28 到 ID18,扩展 ID 由 ID17 到 ID0 表示。基本 ID 和 标准格式的 ID 相同。禁止高 7 位都为隐性(禁止设定:基本 ID=1111111XXXX)。

字节 2~5 为报文识别码,其高 28 位有效。

字节 6~13 为数据帧的实际数据,远程帧时无效。

1.3、控制段

控制段由 6 个位组成,包括数据长度代码和两个将来作为扩展用的保留位,标准格式和扩展格式的构成有所不同。

数据长度代码指示了数据段中的字节数量。数据长度代码为 4 个位,在控制段里被发送,数据帧长度允许的字节数为 0、1、2、3、4、5、6、7、8,其他数值为非法的。

​保留位(r0、r1)必须全部以显性电平发送。但接收方可以接收显性、隐性及其任意组合的电平。

数据长度码(DLC)与数据的字节数的对应关系如下表所示:

​数据的字节数必须为 0~8 字节,但接收方对 DLC = 9~15 的情况并不视为错误。

1.4、数据段

数据段由数据帧中的发送数据组成,它可以为 0~8 字节,每字节包含了 8 位,首先发送最高有效位 MSB,依次发送至最低有效位 LSB。


1.5、CRC 段

CRC 段是检查帧传输错误的帧,包括:15 个位的 CRC 序列(CRC SEQUENCE)和 1 个位的 CRC 界定符(CRC DELIMITER)构成。

​CRC 序列是根据多项式生成的 CRC 值,CRC 的计算范围包括:帧起始、仲裁段、控制段、数据 段。 接收方以同样的算法计算 CRC 值并进行比较,不一致时会通报错误。

1.6、ACK 段

ACK 段用来确认是否正常接收。由 ACK 槽(ACK SLOT)和 ACK 界定符(ACK DELIMITER)2 个位构成。

​发送单元在 ACK 段发送 2 个位的隐性位。当接收器正确地接收到有效的报文时,接收器就会在应答间隙(ACK SLOT)期间(发送 ACK 信号)向发送器发送一个“显性”的位以示应答,通知发送单元正常接收结束,这称作“发送 ACK”或者“返回 ACK”。

发送 ACK/返回 ACK 是在既不处于总线关闭态也不处于休眠态的所有接收单元中,接收到正常消息的单元 (发送单元不发送 ACK)。所谓正常消息是指不含填充错误、格式错误、CRC 错误的消息。

1.7、帧结束

帧结束是由每一个数据帧和远程帧的标志序列界定的,这个标志序列由 7 个“隐性”位组成。


2、CAN 标准数据帧和扩展数据帧

CAN 协议可以接收和发送 11 位标准数据帧和 29 位扩展数据帧,CAN 标准数据帧和扩展数据帧只是帧 ID 长度不同,以便可以扩展更多 CAN 节点。

2.1、标准数据帧

标准数据帧基于早期的 CAN 规格(1.0 和 2.0A 版),使用了 11 位的识别域。

CAN 标准帧帧信息是 11 字节,包括帧描述符和帧数据两部分。如下表所列:

前 3 字节为帧描述部分。字节 1 为帧信息,第 7 位(FF)表示帧格式,在标准帧中 FF=0,第 6 位(RTR)表示帧的类型,RTR=0 表示为数据帧,RTR=1 表示为远程帧。DLC 表示在数据帧时实际的数据长度。

标准数据帧的 ID 有 11 个位。从 ID10 到 ID0 依次发送,可以出现 2^11 种报文,帧 ID 的范围是:000-7FF,禁止高 7 位都为隐性(禁止设定:ID=1111111XXXX)。

字节 2~3 为报文识别码,其高 11 位有效。

字节 4~11 为数据帧的实际数据,远程帧时无效。

2.2、扩展数据帧

CAN 扩展帧帧信息是 13 字节,包括帧描述符和帧数据两部分,如下表所示:

​前 5 字节为帧描述部分。字节 1 为帧信息,第 7 位(FF)表示帧格式,在扩展帧中 FF=1,第 6 位(RTR)表示帧的类型,RTR=0 表示为数据帧,RTR=1 表示为远程帧。DLC 表示在数据帧时实际的数据长度。

扩展格式的 ID 有 29 个位,基本 ID 从 ID28 到 ID18,扩展 ID 由 ID17 到 ID0 表示,基本 ID 和 标准格式的 ID 相同,可以出现 2^29 种报文,且在数据链路上是有间隙的(对操作者透明),帧 ID 的范围是 0000 0000-1FFF FFFF,禁止高 7 位都为隐性(禁止设定:基本 ID=1111111XXXX)。

字节 2~5 为报文识别码,其高 28 位有效。

字节 6~13 为数据帧的实际数据,远程帧时无效。

2.3、标准数据帧和扩展数据帧的特性

CAN 标准数据帧和扩展数据帧只是帧 ID 长度不同,功能上都是相同的,它们有一个共同的特性:帧 ID 数值越小,优先级越高。



3、CAN 遥控帧

3.1、遥控帧格式

遥控帧是接收单元向发送单元请求发送数据所用的帧,遥控帧由 6 个段组成,遥控帧没有数据段。

遥控帧的构成如下所示:

  • 帧起始(SOF):表示帧开始的段;

  • 仲裁段:表示该帧优先级的段。可请求具有相同 ID 的数据帧;

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

  • CRC 段:检查帧的传输错误的段;

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

  • 帧结束:表示遥控帧结束的段。

遥控帧格式如下图所示:


3.2、数据帧和遥控帧的区别

数据帧和遥控帧主要有两点区别:

  • 遥控帧没有数据帧的数据段;

  • 遥控帧 RTR 位是隐性,RTR 位的极性表示了所发送的帧是数据帧(RTR 位“显性”)还是远程帧(RTR 位“隐性”)。所以,没有数据段的数据帧和遥控帧可通过 RTR 位区别开来。

4、CAN 错误帧

4.1、错误帧格式

错误帧由错误标志(Error Flag)和错误界定符(Error Delimiter)组成。

接收节点发现总线上的报文有错误时,将自动发出活动错误标志,它是 6 个连续的显性位。其他节点检测到活动错误标志后发送错误认可标志,它由 6 个连续的隐性位组成。由于各个接收节点发现错误的时间可能不同,所以总线上实际的错误标志可能由 6~12 个显性位组成。

错误界定符由 8 个位的隐性位构成。当错误标志发生后,每一个 CAN 节点监视总线,直至检测到一个显性电平的跳变。此时表示所有的节点已经完成了错误标志的发送,并开始发送 8 个隐性电平的界定符。

如下所示:

4.2、主动错误标志和被动错误标志

错误标志包括主动错误标志和被动错误标志两种。

  • 主动错误标志:处于主动错误状态的单元检测出错误时输出的错误标志,6 个位的显性位;

  • 被动错误标志:处于被动错误状态的单元检测出错误时输出的错误标志,6 个位的隐性位。


4.3、错误帧种类

错误帧共有 5 种,多种错误可能同时发生,种类如下所示:

  • 位错误

  • 填充错误

  • CRC 错误

  • 格式错误

  • ACK 错误

错误的种类、错误的内容、错误检测帧和检测单元如下表所示:

​重点聊一聊位错误和格式错误。

位错误特性如下所示:

  • 位错误由向总线上输出数据帧、遥控帧、错误帧、过载帧的单元和输出 ACK 的单元、输出错误的单元来检测;

  • 在仲裁段输出隐性电平,但检测出显性电平时,将被视为仲裁失利,而不是位错误;

  • 在仲裁段作为填充位输出隐性电平时,但检测出显性电平时,将不视为位错误,而是填充错误;

  • 发送单元在 ACK 段输出隐性电平,但检测到显性电平时,将被判断为其它单元的 ACK 应答,而非位错误;

  • 输出被动错误标志(6 个位隐性位)但检测出显性电平时,将遵从错误标志的结束条件,等待检测出连续相同 6 个位的值(显性或隐性),并不视为位错误。

格式错误特性如下所示:

  • 即使接收单元检测出 EOF(7 个位的隐性位)的最后一位(第 8 个位)为显性电平,也不视为格式错误;

  • 即使接收单元检测出数据长度码(DLC)中 9∼15 的值时,也不视为格式错误。

发送单元发送完错误帧后,将再次发送数据帧或遥控帧,错误标志输出时序如下表所示:


5、CAN 过载帧

过载帧是用于接收单元通知其尚未完成接收准备的帧,过载帧由过载标志和过载界定符构成。


  • 过载标志由 6 个位的显性位组成,过载标志的构成与主动错误标志的构成相同。过载标志其形式破坏了间歇场的固定格式,结果使其他所有节点也检测到了一个出错状态,就都各自送出一个超载标志。

  • 过载界定符由 8 个位的隐性位组成,过载界定符的构成与错误界定符的构成相同。过载标志发送完毕后,每个节点都对总线进行监察,直到检测到一个隐性位为止。此时,每个节点均已发送完各自的过载标志,接着所有节点还要同时开始发送 7 个隐性位,配齐长达 8 位的过载界定符。

过载帧的构成如下图所示:

6、CAN 帧间隔

帧间隔是用于分隔数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开,过载帧和错误帧前不能插入帧间隔。

帧间隔的构成如下图所示:


帧间隔由间隔段、总线空闲段和延迟传送段组成,具体说明如下所示:

  • 间隔段:间歇由 3 个隐性位构成。在间歇期间,不允许任何节点发送数据帧或远程帧。唯一可以执行的操作是通报超载状态;

  • 总线空闲段:总线空闲时间长短不限。总线一经确认处于空闲状态,则任何节点都可以访问总线来传送信息。因另一帧正在传送而延期发送的帧是从间歇之后的第一位开始送出的。通过对总线进行检测,出现在总线空闲期间的显性位将被认为是帧起始;

  • 延迟传送段:处于错误认可状态的节点完成其发送动作后,在被允许发送下一帧以前,它要在间歇之后送出 8 个隐性位。如果间歇期间执行了(由另一个节点引起的)发送动作,此节点将会变成正被发送的帧的接收器。


7、为什么会出现 CAN FD?

随着总线技术在汽车电子领域越来越广泛和深入的应用,特别是自动驾驶技术的迅速发展,汽车电子对总线宽度和数据传输速率的要求也越来也高,传统 CAN(1MBit/s,8Bytes Payload)已难以满足日益增加的需求。

因此在 2012 年,Bosch 发布了新的 CAN FD 标准 (CAN with Flexible Data Rate) ,CAN FD 继承了 CAN 的绝大多数特性,如同样的物理层,双线串行通信协议,基于非破坏性仲裁技术,分布式实时控制,可靠的错误处理和检测机制等,同时 CAN FD 弥补了 CAN 在总线带宽和数据长度方面的不足。

2015 年 6 月 30 日,国际标准化组织(ISO)已经正式认可 CAN FD,并无反对票通过 ISO 11898-1 作为国际标准草案。

8、什么是 CAN FD?

CAN FD 协议是由 Bosch 以及行业专家预研开发的,并于 2012 年发布。通过标准化对其进行了改进,现已纳入 ISO 11898-1:2015。一开始的 Bosch CAN FD 版本(非 ISO CAN FD)与 ISO CAN FD 是不兼容。

CAN FD 具有以下 4 个主要优点:

1、增加了数据的长度

CAN FD 每个数据帧最多支持 64 个数据字节,而传统 CAN 最多支持 8 个数据字节。这减少了协议开销,并提高了协议效率。

2、增加传输的速度

CAN FD 支持双比特率:与传统 CAN 一样,标称(仲裁)比特率限制为 1 Mbit/s,而数据比特率则取决于网络拓扑/收发器。实际上,可以实现高达 5 Mbit/s 的数据比特率。

3、更好的可靠性

CAN FD 使用改进的循环冗余校验(CRC)和“受保护的填充位计数器”,从而降低了未被检测到的错误的风险。这在汽车和工业自动化等安全攸关的应用中至关重要。

4、平滑过渡

在一些特定的情况下 CAN FD 能用在仅使用传统 CAN 的 ECU 上,这样就可以逐步引入 CAN FD 节点,从而为 OEM 简化程序和降低成本。

实际上,与传统 CAN 相比,CAN FD 可以将网络带宽提高 3 到 8 倍,从而为数据的增长提供了一种简单的解决方案。

9、CAN FD 和 CAN 总线协议帧异同

CAN FD 和 CAN 总线协议帧格式如下所示:

CAN FD 和 CAN 总线协议帧不同点如下所示:

1、传输速率不同

CAN FD 的速率可变,从控制场中的 BRS 位到 ACK 场之前(含 CRC 分界符)为可变速率,最高速率可达到 8Mbps,其他部分与 CAN 相同。

2、数据长度不同

CAN FD 支持的最大数据长度为 64byte,CAN 支持的最大数据长度为 8byte。

3、帧格式不同

CAN FD 新增了 FDF、BRS、ESI 位:

  • FDF 位(Flexible Data Rate Format):原 CAN 数据帧中的保留位 r。表示 CAN 报文还是 CAN-FD 报文,FDF 位常为隐性(1),表示 CAN FD 报文;

  • BRS 位( Bit Rate Switch):表示位速率转换,当 BRS 为显性位(0)时数据段的位速率与仲裁段的位速率一致(恒定速率),当 BRS 为隐性位(1)时速率可变(即 BSR 到 CRC 使用转换速率传输);

  • ESI 位(Error State Indicator):发送节点错误状态指示,主动错误时发送显性位(0),被动错误时发送隐性位(1)。

4、ID 长度不同

CAN FD 标准帧 ID 长度可扩展至 12bit,CAN 的标准帧 ID 为 11bit。

10、解析 CAN FD 帧结构

CAN FD 节点可以正常收、发 CAN 报文,但 CAN 节点不能正确收、发 CAN FD 报文,因为其帧格式不一致。

与 CAN 一样,CAN FD 一共具有:帧起始,仲裁段,控制段,数据段,CRC 段,ACK 段和帧结束,7 部分组成。

10.1、帧起始

CAN 与 CANFD 使用相同的 SOF 标志位来标志报文的起始。帧起始由 1 个显性位构成,标志着报文的开始,并在总线上起着同步作用。

10.2、仲裁段

与 CAN 不同,CAN FD 取消了对远程帧的支持,用 RRS 位替换了 RTR 位,为常显性。IDE 用于区分标准帧和扩展帧。


10.3、控制段

CAN FD 与 CAN 有着相同的 IDE、res 和 DLC 位,同时增加了 FDF、BRS、ESI 三个 bit 位。

  • FDF 位(Flexible Data Rate Format):原 CAN 数据帧中的保留位 r。表示 CAN 报文还是 CAN-FD 报文,FDF 位常为隐性(1),表示 CAN FD 报文;

  • BRS 位( Bit Rate Switch):表示位速率转换,当 BRS 为显性位(0)时数据段的位速率与仲裁段的位速率一致(恒定速率),当 BRS 为隐性位(1)时速率可变(即 BSR 到 CRC 使用转换速率传输);

  • ESI 位(Error State Indicator):发送节点错误状态指示,主动错误时发送显性位(0),被动错误时发送隐性位(1)。


10.4、数据段

CAN FD 兼容 CAN 的数据格式,同时最大还能支持:12、16、 20、 24、 32、 48 和 64byte。

像在传统 CAN 中一样,CAN FD DLC 是 4 位,表示帧中数据字节的数量。为了维持 4 位 DLC,CAN FD 使用从 9 到 15 的其余 7 个值来表示所使用的数据字节数(12、16、20、24、32、48、64)。


10.5、CRC 段

传统 CAN 中的循环冗余校验(CRC)为 15 位,而在 CAN FD 中为 17 位(最多 16 个数据字节)或 21 位(20-64 个数据字节)。 在传统 CAN 中,CRC 中可以包含 0 到 3 个填充位,而在 CAN FD 中,总是有四个固定填充位以提高通信可靠性。


10.6、ACK 段

ACK 紧跟着 CRC 结束标识位。不同的是,CAN FD 支持 2bits 的 ACK 的识别。


10.7、帧结束

与 CAN 一样,CAN FD 的帧结尾也为连续 7 位的隐性位。

11、CAN FD 的改进

CAN FD 采用了两种方式来提高通信的效率:一种方式为缩短位时间提高位速率;另一种方式为加长数据场长度减少报文数量降低总线负载率。

CAN FD 在 CRC 校验段采用了三种多项式来保证高速通讯下的数据可靠性。

1、缩短位时间提高位速率

CAN FD 支持双比特率,与传统 CAN 一样,标称(仲裁)比特率限制为 1 Mbit/s,而数据比特率则取决于网络拓扑/收发器。实际上,可以实现高达 5 Mbit/s 的数据比特率。

从控制段中的 BRS 位到 ACK 段之前(含 CRC 分界符)为可变速率,其余部分为原 CAN 总线用的速率。两种速率各有一套位时间定义寄存器,它们除了采用不同的位时间单位 TQ 外,位时间各段的分配比例也可不同。


2、加长数据段长度减少报文数量降低总线负载率

CAN FD 每个数据帧最多支持 64 个数据字节,而传统 CAN 最多支持 8 个数据字节,这减少了协议开销,并提高了协议效率。

DLC 最大支持 64 个字节,在 DLC 小于等于 8 时与原 CAN 总线是一样的,大于 8 时则有一个非线性的增长,最大的数据场长度可达 64 字节。如下所示为 DLC 数值与字节数的非线性对应关系。


3、CRC 校验段

CAN FD 使用改进的循环冗余校验(CRC)和“受保护的填充位计数器”,由于 DLCs 的长度不同,在 DLC 大于 8 个字节时,CAN FD 选择了两种新的 BCH 型 CRC 多项式,从而降低了未被检测到的错误的风险。


12、如何从传统的 CAN 升级到 CAN FD

尽管 CANFD 继承了绝大部分传统 CAN 的特性,但是从传统 CAN 到 CANFD 的升级, 我们仍需要做很多的工作。

1、在硬件和工具方面,要使用 CANFD,首先要选取支持 CANFD 的 CAN 控制器和收发器,还要选取新的网络调试和监测工具。

2、在网络兼容性方面,对于传统 CAN 网段的部分节点需要升级到 CANFD 的情况要特别注意,由于帧格式不一致的原因,CANFD 节点可以正常收发传统 CAN 节点报文,但是传统 CAN 节点不能正常收发 CANFD 节点的报文。

CAN FD 协议是 CAN-BUS 协议的最新升级,将 CAN 的每帧 8 字节数据提高到 64 字节,波特率从最高的 1Mbps 提高到 8-15Mbps,使得通讯效率提高 8 倍以上,大大提升了车辆的通讯效率。此项技术一直被欧美企业垄断,直至 2016 年,中国 CAN-BUS 领导者—广州致远电子股份有限公司,基于拥有完全知识产权的 CAN FD IP 核代码,研制出中国第一款 CAN FD 接口卡,使中国的总线技术水平与世界最高水平同步。


详解CAN总线:什么是CAN总线?

详解CAN总线:高速CAN总线和低速CAN总线的特性

详解CAN总线:CAN协议分层结构及功能

详解CAN总线:CAN节点硬件构成方案

详解CAN总线:常用CAN连接器的使用方法

详解CAN总线:CAN总线报文格式—数据帧

详解CAN总线:标准数据帧和扩展数据帧​​​​​​

详解CAN总线:CAN总线报文格式—遥控帧

详解CAN总线:CAN总线报文格式—错误帧

详解CAN总线:CAN总线报文格式—过载帧

详解CAN总线:CAN总线报文格式—帧间隔

发布于: 刚刚阅读数: 4
用户头像

【研究方向】物联网、嵌入式、AI、Python 2018-02-09 加入

嵌入式工程师,创客爱好者,公众号:美男子玩编程,全网粉丝10万+。 CSDN博客专家、微软MVP、华为云云享专家、阿里云专家博主、知乎认证科学技术领域答主。

评论

发布
暂无评论
一文搞懂CAN和CAN FD总线协议_汽车电子_不脱发的程序猿_InfoQ写作社区