CAN总线协议教程

系列文章目录



前言


1.简介:CAN总线

什么是CAN?

CAN是“控制器局域网”的缩写。控制器局域网是由 ISO 11898 标准定义的电子通信总线。这些标准定义了通信的发生方式、布线的配置方式以及消息的构造方式等。该系统统称为CAN总线。

我们将涵盖的内容

为了更深入地了解CAN的细节,CAN总线是一种广播类型的总线。这意味着所有节点都可以“听到”所有传输。无法仅向特定节点发送消息;所有节点都将始终接收所有流量。然而,CAN硬件提供本地滤波,因此每个节点只能对感兴趣的消息做出反应。我们将在第 2 节“CAN 报文”中对此进行更多讨论。

我们还将讨论总线如何使用不归零 (NRZ) 和位填充。在这个系统中,模块以有线方式连接到总线:如果只有一个节点将总线驱动到逻辑 0,那么无论传输逻辑 1 的节点数量如何,整个总线都处于该状态。

CAN标准定义了四种不同的报文类型。这些消息使用巧妙的按位仲裁方案来控制对总线的访问,并且每条消息都标有优先级。

CAN标准还定义了一个复杂的错误处理和限制方案,在第7节“CAN错误处理”中有更详细的描述。

本教程的第 6 节讨论了位定时和时钟同步。这里有一个位时序计算器,可用于计算CAN总线参数和寄存器设置。

CAN总线布线可以使用不同的物理层(第3节)来实现,其中一些在这里描述,并且还有相当多的CAN总线连接器类型(第5节)正在使用中。我们还为那些对消息细节感兴趣的人提供了一些示波器图片(第 4 节)。

2.CAN报文

CAN总线是一种广播型总线。这意味着所有节点都可以“听到”所有传输。无法仅向特定节点发送消息;所有节点都将始终接收所有流量。然而,CAN硬件提供本地滤波,因此每个节点只能对感兴趣的消息做出反应。

CAN报文
CAN使用短报文 - 最大实用程序负载为94位。消息中没有明确的地址;相反,可以说消息是内容寻址的,也就是说,它们的内容隐含地决定了它们的地址。

报文类型
CAN总线上有四种不同的报文类型(或“帧”):

  1. 数据框
  2. 远程帧
  3. 误差框架
  4. 过载框架

数据框架

数据框是最常见的消息类型。它包括以下主要部分(为了简洁起见,省略了一些细节):

仲裁字段,用于确定两个或多个节点争用总线时消息的优先级。仲裁字段包含:
	对于 CAN 2.0A,一个 11 位标识符和一个位,即 RTR 位,后者在数据帧中占主导地位。
	对于 CAN 2.0B,29 位标识符(还包含两个隐性位:SRR 和 IDE)和 RTR 位。
数据字段,其中包含 0 到 8 个字节的数据。
CRC 字段,其中包含在消息的大多数部分计算的 15 位校验和。此校验和用于错误检测。
确认槽;任何能够正确接收报文的CAN控制器都会在每条报文的末尾发送一个确认位。发送器检查是否存在确认位,如果未检测到确认,则重新传输消息。


注 1:值得注意的是,总线上存在确认位并不意味着任何预期的收件人已收到该消息。我们唯一知道的是总线上的一个或多个节点已正确接收到它。

注 2:仲裁字段中的标识符尽管名称不同,但不一定能识别消息的内容。

CAN 2.0A(“标准CAN”)数据帧。
CAN 2.0A(“标准CAN”)数据帧。

CAN 2.0B(“扩展CAN”)数据帧。

远程框架

远程帧与数据帧类似,但有两个重要区别:

它被显式标记为远程帧(仲裁字段中的 RTR 位是隐性的),并且
没有数据字段。

远程帧的预期目的是请求相应数据帧的传输。例如,如果节点 A 传输仲裁字段设置为 234 的远程帧,则节点 B 如果正确初始化,则可能会响应仲裁字段也设置为 234 的数据帧。

远程帧可用于实现请求-响应类型的总线流量管理。然而,在实践中,远程帧很少使用。还值得注意的是,CAN标准没有规定此处概述的行为。大多数CAN控制器可以编程为自动响应远程帧,或通知本地CPU。

远程帧有一个问题:必须将数据长度代码设置为预期响应消息的长度。否则,仲裁将不起作用。

远程帧(2.0A型)

远程帧(2.0A型)

有时声称,一旦识别到标识符,响应远程帧的节点就会开始传输,从而“填满”空的远程帧。事实并非如此。

错误帧

摘要:(所有人,大声)“哦,亲爱的,让我们再试一次”

简单地说,错误帧是一种特殊的报文,它违反了CAN报文的成帧规则。当一个节点检测到故障时,它就会被传输,并会导致所有其他节点检测到故障——所以它们也会发送错误帧。然后,发送器将自动尝试重新传输消息。有一个精心设计的错误计数器方案,可确保节点无法通过重复传输错误帧来破坏总线流量。

错误帧由一个错误标志(6 位相同值的位)和一个错误分隔符(8 个隐性位)组成。错误分隔符提供了一些空间,总线上的其他节点在检测到第一个错误标志时可以发送其错误标志。

错误帧

错误帧

重载框架

摘要:“我是一个非常忙碌的小82526,请您稍等片刻吗?
这里提到过载帧只是为了完整起见。在格式方面,它与错误帧非常相似,并且它由变得过于繁忙的节点传输。过载帧并不经常使用,因为今天的CAN控制器足够聪明,不会使用它。事实上,唯一会生成过载帧的控制器是现已过时的 82526。

标准与扩展 CAN

最初,CAN标准将仲裁字段中标识符的长度定义为十一(11)位。后来,客户需求迫使标准扩展。新格式通常称为扩展 CAN,允许标识符中不少于二十九 (29) 位。为了区分这两种帧类型,使用了控制字段中的保留位。

这些标准的正式名称为

2.0A,仅具有 11 位标识符,
2.0B,具有完整 29 位标识符的扩展版本(或 11 位标识符,您可以混合使用它们。一个 2.0B 节点可以是
“2.0B 活动”,即它可以发送和接收扩展帧,或
“2.0B 被动”,即它将静默丢弃接收到的扩展帧(但见下文。
1.x是指原始规范及其修订版。

如今,新的CAN控制器通常是2.0B型的。如果 1.x 或 2.0A 类型的控制器接收到 29 个仲裁位的消息,它会非常不安。2.0B 被动型控制器将容忍它们,如果它们是正确的,则承认它们,然后丢弃它们;2.0B 有源型控制器既可以发送它们,也可以接收它们。

实现 2.0B 和 2.0A(以及 1.x)的控制器是兼容的,并且可以在同一总线上使用,只要实现 2.0B 的控制器不发送扩展帧!

有时人们主张标准CAN比扩展CAN“更好”,因为扩展CAN报文的开销更大。这不一定是真的。如果您使用仲裁字段来传输数据,那么扩展CAN实际上可能比标准CAN具有更低的开销。

基本CAN与全CAN

术语“基本CAN”和“完全CAN”起源于CAN的童年。曾几何时,英特尔 82526 CAN 控制器为编程器提供了 DPRAM 风格的接口。然后是飞利浦的 82C200,它使用面向 FIFO(队列)的编程模型和有限的滤波能力。为了区分这两种编程模型,人们出于某种原因将英特尔的方式称为“全CAN”,将飞利浦的方式称为“基本CAN”。如今,大多数CAN控制器都允许两种编程模式,因此没有理由使用术语“全CAN”和“基本CAN”——事实上,这些术语可能会引起混淆,应避免使用。

当然,“全CAN”控制器可以与“基本CAN”控制器通信,反之亦然。没有兼容性问题。

总线仲裁和消息优先级

报文仲裁(两个或多个CAN控制器就谁使用总线达成一致的过程)对于数据传输的实际可用带宽非常重要。

任何CAN控制器都可以在检测到空闲总线时启动传输。这可能会导致两个或多个控制器(几乎)同时启动一条消息。冲突按以下方式解决。发送节点在发送时监视总线。如果一个节点在发送隐性电平时检测到一个显性电平,它将立即退出仲裁过程,转而成为接收者。仲裁在整个仲裁场上执行,当该字段被发送时,总线上只剩下一个发射器。此节点继续传输,就好像什么都没发生过一样。其他潜在的发射器将在下次总线可用时尝试重新传输其消息。在仲裁过程中不会浪费任何时间。

此按位仲裁成功的一个重要条件是,没有两个节点可以传输相同的仲裁字段。此规则有一个例外:如果消息不包含任何数据,则任何节点都可以传输该消息。

由于总线是有线的,并且主位在逻辑上为 0,因此具有数字最低仲裁字段的消息将赢得仲裁。

问:如果一个节点单独在总线上并尝试传输,会发生什么情况?
答:当然,节点会赢得仲裁,并愉快地进行消息传输。但是,当承认的时候到了......在 ACK 插槽期间,没有节点会发送主位,因此发送器将检测 ACK 错误,发送错误标志,将其发送错误计数器增加 8 并开始重传。这将发生 16 次;然后发射器将变为被动错误。根据错误限制算法中的特殊规则,如果节点是错误被动的,并且错误是 ACK 错误,则发送错误计数器不会进一步增加。因此,节点将永远继续传输,至少在有人确认消息之前是这样。

邮件寻址和识别

再次值得注意的是,CAN报文中没有明确的地址。每个CAN控制器将拾取总线上的所有流量,并使用硬件过滤器和软件的组合,确定消息是否“有趣”。

事实上,CAN中没有报文地址的概念。相反,消息的内容由消息中某处的标识符标识。CAN报文被称为“内容寻址”。

传统的消息地址将像“这是节点 X 的消息”一样使用。内容寻址消息类似于“这是一条包含标记为 X 的数据的消息”。这两个概念之间的差异很小,但意义重大。

根据标准,仲裁字段的内容用于确定消息在总线上的优先级。所有CAN控制器还将使用整个仲裁场(有些将仅使用一部分)作为硬件过滤过程中的关键。

该标准并未规定必须将仲裁字段用作消息标识符。尽管如此,这是一种非常普遍的用法。

有关标识符值的说明

我们说过标识符中有 11 位 (CAN 2.0A) 或 29 位 (CAN 2.0B)。这并不完全正确。由于与某个旧的CAN控制器兼容(猜猜是哪个?),标识符不能将7个最高有效位设置为所有1,因此11位标识符只保留标识符0…2031,而29位标识符的用户可以使用532676608不同的值。

请注意,所有其他CAN控制器都接受“非法”标识符,因此在现代CAN系统中,标识符2032…2047可以不受限制地使用。

3.CAN物理层

CAN总线

CAN总线使用不归零(NRZ)和位填充。有两种不同的信号转导状态:显性(逻辑上为 0)和隐性(逻辑上为 1)。这些对应于某些电气级别,具体取决于所使用的物理层(有几个。模块以有线方式连接到总线:如果只有一个节点将总线驱动到主导状态,那么无论传输隐性状态的节点数量如何,整个总线都处于该状态。

不同的物理层

物理层定义了总线上的电平和信号方案、电缆阻抗和类似内容。

有几个不同的物理层:

最常见的类型是CAN标准ISO 11898-2部分定义的类型,它是一种两线平衡信号方案。它有时也被称为“高速CAN”。
同一 ISO 标准的另一部分 ISO 11898-3 定义了另一种用于较低总线速度的双线平衡信号方案。它具有容错性,因此即使一根总线线被切断或短路到接地或 Vbat,信号也可以继续。它有时被称为“低速CAN”。
SAE J2411 定义了单线(当然还有接地)物理层。它主要用于汽车,例如GM-LAN。
确实存在几个专有的物理层。
RS485 的修改用于不存在 CAN 驱动器的旧时代。
转到第 6 页查看一些示波器图片,供那些对消息细节感兴趣的人使用。

通常,不同的物理层不能互操作。在良好的条件下,某些组合可能有效或似乎有效。例如,在同一总线上同时使用“高速”和“低速”收发器可以工作…有时。

许多CAN收发器芯片都是由恩智浦制造的;替代供应商包括博世、英飞凌、德州仪器和 Vishay Siliconix。

一种非常常见的类型是 82C250 收发器,它实现了 ISO 11898 定义的物理层。82C251 是改进版本。

“低速CAN”的通用收发器由恩智浦TJA1054。

最大总线速度

根据标准,CAN总线的最高速度为1 Mbit/秒。然而,一些CAN控制器将处理高于1Mbit/s的速度,可以考虑用于特殊应用。

低速CAN(ISO 11898-3,见上文)最高可达125 kbit/s。

单线CAN在标准模式下可以达到50 kbit/s左右,使用ECU编程等特殊的高速模式,可以达到100 kbit/s左右。

最低总线速度

请注意,某些总线收发器不允许您低于特定比特率。例如,使用 82C250 或 82C251 可以毫无问题地降低到 10 kbit/s,但如果使用 TJA1050,则不能低于 50 kbit/s 左右。查看数据表。

最大电缆长度

在 1 Mbit/s 的速度下,可以使用约 40 米(130 英尺)的最大电缆长度。这是因为仲裁方案要求信号的波前能够传播到最远的节点,并在对位进行采样之前再次传播回来。换句话说,电缆长度受到光速的限制。已经考虑过提高光速的提议,但由于其星系间后果而被拒绝。

其他最大电缆长度为(这些值为近似值):

100 米(330 英尺),速度为 500 kbit/s
200 米(650 英尺),速度为 250 kbit/s
500 米(1600 英尺),速度为 125 kbit/s
6 公里(20000 英尺),速度为 10 kbit/s

如果使用光耦合器提供电流隔离,则最大总线长度会相应减小。提示:使用快速光耦合器,并查看通过设备的延迟,而不是指定的最大比特率。

总线终端

必须终止 ISO 11898 CAN 总线。这是在总线两端使用一个 120 欧姆的电阻器完成的。终止有两个目的:

1. 消除总线末端的信号反射。
2. 确保总线获得正确的直流电平。

ISO 11898 CAN总线无论其速度如何,都必须始终端接。我再说一遍:ISO 11898 CAN总线无论其速度如何,都必须始终终止。对于实验室工作,只有一个终结器可能就足够了。如果你的CAN总线可以工作,即使你没有在上面放置任何终止符,你只是幸运的。

请注意,其他物理层(例如“低速 CAN”、单线 CAN 等)可能需要也可能不需要端接。但是您的普通高速 ISO 11898 CAN 总线将始终需要至少一个端接器。

在这篇文章中了解更多关于CANbus终端的信息。

电缆

ISO 11898 规定电缆阻抗标称为 120 欧姆,但允许阻抗在 [108…132] 欧姆的范围内。

当今市场上满足这一要求的电缆并不多。将来很有可能扩大允许的阻抗间隔。

ISO 11898 适用于双绞线电缆,屏蔽或非屏蔽。单线标准 SAE J2411 的工作正在进行中。

CAN连接器

CAN总线连接器根本没有标准!通常,每个高层协议(!)定义一种或几种首选的CAN总线连接器类型。常见类型包括

9 针 DSUB,由 CiA 提出。
5 针 Mini-C 和/或 Micro-C,用于 DeviceNet 和 SDS。
6 针 Deutch 连接器,由 CANHUG 提出用于移动液压系统。转到第 7 页查看几种不同的连接器布局。

4.CAN示波器图片

这是一张完全正常的ISO 11898 CAN总线的图片,运行速度为1 Mbit/s。收发器是 82C251;换句话说,物理层是 ISO 11898 指定的层。

测量是在 CAN_H 和 GND 之间完成的。 请注意,静态和隐性总线电压约为 2.5 V。当主位被传输时,电压上升到3.5V左右。

现在这是相同的总线,但测量是在 CAN_L 和 GND 之间完成的。

这是另一条消息,以 125 kbit/s 的速度发送。消息的(11 位)标识符为 300,或十六进制的 12c。仔细观察,您应该能够识别消息中的第一位。

这是一张更棘手的图片。它显示与上述相同的消息,仍然是(11位)标识符300,仍然是125 kbit/s,但在CAN总线上没有终止。CAN电缆是短线扁平带状电缆。

那么,发生了什么?这是 125 kbit/s,所以一个比特是 8 微秒。

1. 首先,发射器发送一个起始位。这是一个合乎逻辑的“0”,即一个主导水平。
2. 然后传输标识符。300 十进制是十六进制的 12c,或二进制的 001 0010 1100。前两个零传输得很好。这解释了如图所示的 24 微秒优势水平。
3. 然后应该传输一个“1”,但由于总线没有终止,上升的斜率不是应该的。传输节点现在会认为它在总线上看到了一个“0”。
4. 由于这发生在仲裁阶段,发送器将停止传输——它认为其他节点正在传输。总线现在将处于隐性状态,因为实际上没有人在传输。
5. 在 6 个隐性位之后,发送器和接收器都将检测到一个 stuff 错误并开始错误处理。此时,已经过去了 80 微秒(一个起始位、两个“0”、一个被误解的位和六个隐性位——总共 10 位 = 80 微秒)。
6. 所有检测到 stuff 错误的节点现在都将开始传输错误帧。在这种情况下,误差帧是被动的,因为在捕获上述图片之前产生了许多错误,因此发送器是误差被动的。被动误差帧与主动误差帧一样,但它以隐性电平传输,因此在总线上不可见。
7. 被动误差帧以 6 位为准。
8. 然后,所有节点都在等待 8 个隐性位的时间段,称为错误分隔符。
9. 然后,所有节点都在等待 3 个隐性位的时间段,称为中场休息。
10. 总结上面的数字,我们得出 1+6+6+8+3 = 24 个隐性位 = 192 微秒(见图!

寓意:始终终止CAN总线!反射不一定会造成伤害,但边缘的不良形状会扼杀通信。

这是另一个时间尺度上的相同 CAN 总线。CAN总线的长度约为2分米(8英寸)。下冲和振铃是可见的,但在这种情况下显然并不重要。这一次,缓慢上升的边缘是罪魁祸首。

这是相同的设置,但这次发射器和接收器都处于错误活动状态。

发生了什么事情?

1. 就像上图一样,传输了三个“0”(需要 24 微秒),下一个位被误解,因此发送器认为它已经输掉了仲裁。
2. 发射器等待 6 位,然后检测到内容错误。被误解的位和 6 位需要 56 微秒。
3. 发射器和接收器现在开始发送错误帧。它是 6 个主位(48 微秒)。
4. 传输错误帧的节点现在等待 8 个隐性位,但由于上升斜率不好,第一个位被误解。节点会认为这是另一个传输错误帧的节点,并会忽略它。
5. 当总线回到隐性级别时,所有节点都等待 8 位。
. 然后是 3 个隐性位的中场休息。
7. 3+9 = 12 位 = 96 微秒,如图所示。
8. 然后发射器再次尝试,结果相同。过了一会儿,变送器变为错误被动,并将如前所述运行。
这是另一张照片。在此设置中,(正确端接的)CAN总线上只有一个节点。它试图传递信息,但没有人在听。

那么发生了什么?

1. 首先,发射器发送整个消息。
2. 发射机期望 ACK 插槽中有一个主电平,但由于没有人在监听,因此没有 ACK 到达,因此发射机检测到确认错误。
3. 然后,发射器发送一个被动错误标志(被动的,因为在上图中,它已经尝试发送了几秒钟,因此它不再是主动错误。
4. 被动错误标志后面是错误分隔符和中场休息。
5. 由于此节点尝试发送消息但失败,因此它必须等待另外 8 位才能启动新传输。这在CAN规范中称为“暂停传输”。
5. 发送节点还必须将其 tx 错误计数器增加 8,但在 CAN 规范中的特殊情况下,这仅在发送器处于错误活动状态时才会发生。当发送器变为错误被动时,它不会(在这种情况下)增加其 tx 错误计数器,因此传输将永远重试。

因此,您在上图中看到的是正在传输的消息,然后是一个小的停顿,这是错误标志、错误分隔符、中场休息和暂停传输的总和。然后重新传输和重新传输消息,然后…

5.CAN连接器

9 针 DSUB

这种连接器布局是 CiA 推荐的,几乎是工业标准。

如果提供电源,则应在 +7…+13 V、100 mA 范围内。模块提供公连接器,并且必须在内部连接引脚 3 和 6。

引脚编号对于从连接器侧查看的公连接器或从焊接侧查看的母连接器有效。– 要记住引脚,请注意CAN_LOW 的引脚数为 LOW,CAN_HIGH引脚数为 HIGH。

5 针 Mini-C

5pinresize2

由 DeviceNet 和 SDS 使用,并且恰好在这两种协议之间兼容。

这些模块具有公连接器。提供的电源为 24V ± 1%。

注意:在DeviceNet规范版本1.x中,图9.13中的母连接器的编号顺序错误。规范 2.0 及更高版本已经做到了这一点。

6 针 Deutsch DT04-6P

CANHUG 推荐用于移动液压应用。

模块侧公头,总线侧母头。目前没有关于所供电的建议。

6.CAN位时序

位的布局

出于定时目的,CAN总线上的每个位被分成至少4个量子。量子在逻辑上分为四组或段:

同步段
传播段
阶段段 1
阶段段 2

在这里插入图片描述

这是CAN数据位的图片。

同步段始终为一个量子长度,用于时钟的同步。当总线上的数据发生变化时,预计此处会发生位边缘。

需要传播段来补偿总线线路的延迟。

有用的工具
位时序计算器
计算给定输入频率和给定总线速度的所有可能的CAN总线参数集。

转到计算器
如有必要,相段可以缩短(相段 1)或延长(相段 2),以保持时钟同步。总线电平在相段 1 和相段 2 之间的边界处采样。

大多数CAN控制器还提供在位期间采样三次的选项。在这种情况下,采样发生在采样点之前的两个量子的边界上,并且结果受多数解码的影响(至少 82527 是这种情况)。

时钟同步

为了调整片上总线时钟,CAN控制器可以缩短或延长位的长度,以量子的整数。这些位时间调整的最大值称为同步跳转宽度 SJW。

硬同步发生在起始位的隐性到显性转换上。位时间从该边缘重新启动。

当消息的同步段内未出现位边时,将发生重新同步。其中一个相位段的缩短或延长取决于信号中的相位误差;可以使用的最大量由 Synchronization Jump Width 参数确定。

位时序寄存器计算

大多数CAN控制器允许编程器使用以下参数设置位时序:

时钟预分频器值
采样点前的量子数
采样点后的量子数
同步跳转宽度 (SJW) 中的量子数

通常为此提供两个寄存器:btr0 和 btr1。但是,不同控制器之间的情况往往略有不同,因此请仔细阅读数据表。

在恩智浦(前身为飞利浦)的 82c200 和 SJA1000 上,寄存器布局如下:

BRP0..BRP5 设置时钟预分频器值
SJW0..SJW1 设置 SJW 的长度
TSEG10..TSEG13 设置采样点前的量子数(不包括起始位)
TSEG20..TSEG22 设置采样点之后的量子数。
如果要获得三个样本,则 SAM 设置为 1,如果一个样本足够,则设置为 0。

注意:这些参数的实际值比写入寄存器的值多一个。

示例:如果馈送到SJA1000的振荡器信号为 16 MHz,我们想要 250 kbit/s 的比特率,采样点接近整比特的 62%,SJW 为 2 量子,我们可以设置:

BRP = 4,量子长度为 2 * 4 / 16000000 s = 500
ns,TSEG1 = 5,在采样点之前给出 5 个量子,
TSEG2 = 3,在采样点后给出 3 个量子。

BRP0..BRP5 设置时钟预分频器值
SJW0..SJW1 设置 SJW 的长度
TSEG10..TSEG13 设置采样点前的量子数(不包括起始位)
TSEG20..TSEG22 设置采样点之后的量子数。
如果要获得三个样本,则 SAM 设置为 1,如果一个样本足够,则设置为 0。

注意:这些参数的实际值比写入寄存器的值多一个。

示例:如果馈送到SJA1000的振荡器信号为 16 MHz,我们想要 250 kbit/s 的比特率,采样点接近整比特的 62%,SJW 为 2 量子,我们可以设置:

BRP = 4,量子长度为 2 * 4 / 16000000 s = 500
ns,TSEG1 = 5,在采样点之前给出 5 个量子,
TSEG2 = 3,在采样点后给出 3 个量子。

然后,每个比特将包含 5 + 3 = 8 个量子,这导致所需的比特率为 1 / (8 * 500 ns) = 250 kbit/s。然后,寄存器值应如此处的示例所示。

采样点为 5/8 = 62.5% 位。

btr0 =(SJW – 1) * 64 + (BRP -1) =(2-1)*64 + (4-1) =67 =0×43
btr1 =SAM * 128 + (TSEG2 – 1)* 16 + (TSEG1 – 1) =0*128 + (3-1)*16 + (4-1) = (“4”,因为不包括起始位)35 =0×23

7.CAN错误处理

CAN如何处理错误

错误处理内置于CAN协议中,对CAN系统的性能非常重要。错误处理旨在检测CAN总线上出现的消息中的错误,以便发送器可以重新传输错误的消息。总线上的每个CAN控制器都将尝试检测消息中的错误。如果发现错误,发现节点将传输错误标志,从而破坏总线流量。其他节点将检测由错误标志引起的错误(如果它们尚未检测到原始错误)并采取适当的操作,即丢弃当前消息。

每个节点维护两个错误计数器:传输错误计数器和接收错误计数器。有几条规则控制这些计数器如何递增和/或递减。从本质上讲,检测到故障的发送器增加其传输错误计数器的速度快于侦听节点增加其接收错误计数器的速度。这是因为很有可能是发射机有错!当任何错误计数器升到某个值以上时,节点将首先变为“错误被动”,即在检测到错误时不会主动破坏总线流量,然后“关闭总线”,这意味着节点根本不参与总线流量。

使用错误计数器,CAN节点不仅可以检测故障,还可以执行错误限制。

错误检测机制

CAN协议定义了不少于五种不同的错误检测方法。其中两个在位级别工作,另外三个在消息级别工作。

1. 位监控。
2. 位填充。
3. 框架检查。
4. 确认检查。
5. 循环冗余校验。

位监控
CAN总线上的每个发送器都监控(即回读)发射的信号电平。如果实际读取的位电平与传输的位电平不同,则会发出位错误信号。(在仲裁过程中不会产生任何位错误。

位填充
当一个节点传输了相同级别的五个连续位时,它会将相反级别的第六位添加到传出位流中。接收器将删除此额外位。这样做是为了避免总线上有过多的直流分量,但它也为接收器提供了额外的机会来检测错误:如果总线上出现超过五个相同电平的连续位,则会发出 Stuff Error 信号。

帧检查
CAN报文的某些部分具有固定的格式,即标准准确定义了必须出现的电平以及何时出现。(这些部分是 CRC 分隔符、ACK 分隔符、帧结束和中场休息,但有一些额外的特殊错误检查规则。如果CAN控制器在这些固定字段之一中检测到无效值,则会发出表单错误信号。

确认检查
总线上所有正确接收消息的节点(无论它们是否对其内容“感兴趣”)都应在消息中所谓的确认槽中发送主导级别。发射器将在此处传输隐性电平。如果发射机无法检测到 ACK 插槽中的主电平,则会发出确认错误信号。

循环冗余校验
每条消息都具有一个 15 位循环冗余校验和 (CRC),任何在消息中检测到的 CRC 与其自身计算的 CRC 不同的节点都将发出 CRC 错误信号。

错误限制机制

总线上的每个CAN控制器都将尝试检测每条消息中概述的上述错误。如果发现错误,发现节点将传输错误标志,从而破坏总线流量。其他节点将检测由错误标志引起的错误(如果它们尚未检测到原始错误)并采取适当的操作,即丢弃当前消息。

每个节点维护两个错误计数器:传输错误计数器和接收错误计数器。有几条规则控制这些计数器如何递增和/或递减。从本质上讲,检测到故障的发送器增加其传输错误计数器的速度快于侦听节点增加其接收错误计数器的速度。这是因为很有可能是发射机有错!

节点以错误活动模式启动。当两个错误计数器中的任何一个升至 127 以上时,节点将进入称为 Error Passive 的状态,当传输错误计数器升至 255 以上时,节点将进入总线关闭状态。

错误活动节点在检测到错误时将传输活动错误标志。 Error Passive 节点在检测到错误时将传输 Passive Error Flags。 处于总线关闭状态的节点根本不会在总线上传输任何内容。

增加和减少错误计数器的规则有些复杂,但原理很简单:发送错误给出 8 个错误点,接收错误给出 1 个错误点。正确传输和/或接收的消息会导致计数器减少。

示例(稍微简化):假设总线上的节点 A 今天很糟糕。每当 A 尝试传输消息时,它都会失败(无论出于何种原因)。每次发生这种情况时,它都会将其传输错误计数器增加 8 并传输一个活动错误标志。然后它将尝试重新传输消息。同样的事情发生了。

当传输错误计数器升至 127 以上时(即在 16 次尝试后),节点 A 变为被动错误。不同之处在于它现在将在总线上传输被动错误标志。被动错误标志由 6 个隐性位组成,不会破坏其他总线流量,因此其他节点不会听到 A 抱怨总线错误的声音。但是,A 继续增加其传输错误计数器。当它升至 255 以上时,节点 A 最终屈服并关闭总线。

其他节点对节点 A 有何看法?– 对于 A 传输的每个活动错误标志,其他节点将增加其接收错误计数器 1。当 A 发生总线关闭时,其他节点的接收错误计数器中的计数将远低于错误被动的限制,即 127。对于每正确接收到的一条消息,此计数将减少 1。但是,节点 A 将保持总线关闭状态。

大多数CAN控制器将为两种状态提供状态位(和相应的中断):

“错误警告” – 一个或两个错误计数器高于 96
如上所述,BUS关闭。

一些 - 但不是全部!– 控制器还为错误被动状态提供位。一些控制器还提供对错误计数器的直接访问。

CAN控制器在发生错误时自动重新传输消息的习惯有时会很烦人。市场上至少有一个控制器(飞利浦的SJA1000)可以完全手动控制错误处理。

总线故障模式

ISO 11898 标准列举了 CAN 总线电缆的几种故障模式:

1. CAN_H打断了
2. CAN_L打断了
3. CAN_H电池电压短路
4. CAN_L对地短路
5. CAN_H对地短路
6. CAN_L短路到电池电压
7. CAN_L短路到CAN_H线
8. CAN_H和CAN_L在同一地点被打断
9. 与终端网络的连接丢失

对于故障 1-6 和 9,“建议”总线以降低的信噪比运行,如果发生故障 8,则生成的子系统运行。对于故障 7,在降低信噪比的情况下生存是“可选的”。

在实践中,使用 82C250 型收发器的 CAN 系统将无法承受故障 1-7,并且可能会或可能不会承受故障 8-9。

不过,有一些“容错”驱动程序(如 TJA1053)可以处理所有故障。通常,您以受限的最大速度支付此容错费用;对于TJA1053,它是 125 kbit/s。

8.更高层协议

CAN标准定义了硬件(“物理层”——有几个)和基本级别的通信(“数据链路层”)。CAN协议本身只是指定如何使用共享通信介质将小数据包从A点传输到B点。但是,为了管理系统内的通信,需要更高层协议(HLP)。

更高层协议包括 J1939、CANopen、CCP/XCP 等通用标准。


总结

作为一名技术人,资料搜索能力很重要,这文章也是通过其他大佬的教程找到的,感觉还是不错的。

CAN总线,经过长达1个多月的学习,看了不止10个视频(包含CAN,UDS等),目前可以说入门了,对CAN总线的物理层,数据链路层,网络层有一定的认识。

这篇文章也是通过浏览器翻译获取的,可能会存在遗漏之处,还望多多指教。

参考链接(包括但不限于):
https://kvaser.com/can-protocol-tutorial/##connectors

题外话

以上就是今天要讲的内容,如果您觉得文章还不错,还请您给个三连加关注,非常感谢!

本文作者:WeSiGJ

欢迎加入技术交流群:

QQ群:701203462

  • 27
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
当涉及到CAN总线教程时,以下是一些重要的主题和步骤,希望能对你有所帮助: 1. 什么是CAN总线? CAN(Controller Area Network)总线是一种常见的实时通信协议,广泛应用于汽车、工业控制和其他领域。它允许多个节点在同一个总线上进行通信,具有高可靠性和高实时性。 2. CAN总线的基本组成 CAN总线由多个节点组成,其中包括一个或多个控制器和多个设备。控制器负责管理总线上的通信,而设备则是实际进行数据交换的节点。 3. CAN总线的通信方式 CAN总线使用一种基于事件的通信方式,即只有在节点有数据要发送时才会发送。这种方式称为事件驱动通信,可以最大程度地提高总线的利用率。 4. CAN总线的物理层 CAN总线的物理层(如电缆、传输速率等)需要根据具体应用来选择。通常使用双绞线作为传输介质,可选择不同的传输速率,例如CAN 2.0标准中的高速(1 Mbps)或低速(125 Kbps)。 5. CAN总线的帧格式 CAN总线使用帧来进行数据交换,包括标准帧和扩展帧。标准帧包含11位标识符,扩展帧则包含29位标识符。帧中还包含数据域、控制域和校验位等字段。 6. CAN总线的错误检测和纠正 CAN总线具有强大的错误检测和纠正能力。每个节点在发送数据时都会对数据进行CRC校验,并在接收数据时验证CRC以检测错误。此外,CAN总线还具有冲突检测和错误恢复机制。 7. CAN总线的应用 CAN总线广泛应用于汽车领域,用于汽车电子系统中的各种控制单元之间的通信。它还被用于工业自动化、航空航天、医疗设备等领域。 这只是一个简要的概述,如果你对CAN总线感兴趣,可以进一步深入学习相关的资料和教程。希望这些信息能够对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WeSiGJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值