2025年05月17日 19:47:25 来源:广州智维电子科技有限公司 >> 进入该公司展台 阅读量:49
CAN 总线是广播类型的总线。这意味着所有节点都可以“侦听”到所有传输。无法向一个特定的节点发送报文;所有节点都将始终接收所有通信。但是,CAN 硬件能够提供本地过滤能力,从而每个节点可以只对感兴趣的报文做出响应。
总线使用非归零(NRZ)进行位填充。模块以线与逻辑连接到总线:如果只有一个节点向总线传输逻辑 0,那么不管有多少个节点向总线传输逻辑 1,整个总线都处于逻辑 0 状态。
CAN 标准定义四种不同的报文类型。报文使用逐位仲裁智能方案来控制对总线的访问,并且每条报文都带有优先级标记。
CAN 标准还定义了一个精确的错误处理和限制方案,这在“CAN 错误处理”章节中有更详细的说明。
在本教程“CAN 位时序”章节中讨论了位时序和时钟同步。这是一个位时序计算器,可以用来计算 CAN 总线参数和寄存器设置。
CAN可以使用不同的物理层来实现,这里阐述其中一些。而且,可以使用许多不同种类的连接器。“CAN示波器图片”章节中,我们还为对报文细节感兴趣的用户提供了许多示波器图片。

CAN 总线是广播类型的总线。这意味着所有节点都可以“侦听”到所有传输。无法向一个特定的节点发送报文;所有节点都将始终接收所有通信。但是,CAN 硬件能够提供本地过滤能力,从而每个节点可以只对感兴趣的报文做出响应。
CAN 报文
CAN 使用短报文 – 效用负载是 94 位。报文中没有明确的地址;相反,可以认为报文是通过内容寻址,也就是说,报文的内容隐式地确定其地址。
报文类型
CAN 总线上有四种不同报文类型(或“帧”):数据帧、远程帧、错误帧、过载帧。
数据帧是见的报文类型。由下列主要部分组成(出于简洁性目的,忽略了一些细节):
➡ 仲裁字段。当两个或多个节点竞争总线时,确定报文的优先级。仲裁字段包含:
对于 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.0B(“扩展 CAN”)数据帧
远程帧与数据帧十分相似,但是有两个重要的区别:
➡ 它被显式标记为远程帧(仲裁字段中的 RTR 位为隐性)
➡ 没有数据字段
远程帧的预期目的是征求传输相应的数据帧。例如,如果节点 A 发送仲裁字段设置为 234 的远程帧,那么节点 B,如果已经正确初始化,则可以使用仲裁字段也设置为 234 的数据帧进行响应。
远程帧可以用来实现总线通信管理类型的请求-响应类型。但是,远程帧在实践中很少使用。还有一点值得注意的是,CAN 标准没有规定这里列出的行为。大部分 CAN 控制器都可以被编程为自动响应远程帧,或通知本地 CPU。
远程帧有一个注意事项:数据长度代码必须设置成预期响应报文的长度。否则仲裁将不起作用。
有时会声称响应远程帧的节点会在识别标识符后立即开始传输,从而“填充”空的远程帧。但是事实并非如此。

远程帧(2.0A 类型)
简单地说,错误帧是一种违背 CAN 报文帧规则的特殊报文。它在一个节点检测到故障时被传送,并将导致所有其它节点也检测到故障,所以它们也将发送错误帧。然后传送节点将自动尝试重传报文。有一种精准的错误计数器方案,可以确保节点无法通过重复传输错误帧来破坏总线通信。
错误帧包含错误标志,它是 6 位长的相同值(因此违反位填充规则)和错误定界符(8 个隐性位)。错误定界符提供一些空间,以便总线上其它节点在检测到个错误标志时可以发送它们的错误标志。
错误帧图示如下:

这里,我们仅仅出于知识完整性目的而提及过载帧。在格式方面过载帧与错误帧非常相似,并且由会变得重荷的节点传送。过载帧并不常用,因为当今的 CAN 控制器会非常智能化地避免使用过载帧。事实上,会生成过载帧的一种控制器是现在已经过时的 82526。
标准CAN vs. 扩展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 的初创时期。Intel 82526 CAN 控制器曾经一度为程序员提供 DPRAM 型接口。随后 Philips 82C200 CAN 控制器使用面向 FIFO(队列)的编程模型和有限的过滤能力。为了区分这两种编程模式,人们出于某些原因把 Intel 的模式称为“完整 CAN”,把 Philips 的模式称为“基本 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 个有效位设置为全部,所以11 位标识符的标识符只有 0 到 2031,而 29 位标识符可以使用 532676608 个不同的值。
注意,所有其它 CAN 控制器都接受“非法”标识符,所以现代 CAN 系统中标识符 2032 到2047 可以无限制地使用。

CAN 总线
CAN 总线使用非归零(NRZ)进行位填充。有两种不同的信令状态:显性(逻辑 0)和隐性(逻辑1)。这些信号状态对应于取决于所使用的物理层(有几种不同的物理层)的某种电平。模块以线与逻辑连接到总线:如果只有一个节点将总线驱动到显性状态,那么不管有多少隐形状态的节点传送,则整个总线都处于显性状态。
不同的物理层
物理层定义总线上的电平和信令方案、电缆阻抗和类似的方面。有几种不同的物理层:
➡ 见的类型由 CAN 标准 ISO11898-2 部分定义的,它是双线平衡信令方案。有时也称为“高速 CAN”。
➡ 同一 ISO 标准的另一部分 ISO11898-3 定义了另一种双线平衡信令方案,用于降低总线速度。它具有容错能力,所以即使一条总线电缆被切断或对地短路或电池短路,信号都可以继续发出。有时也称为“低速 CAN”。
➡ SAE J2411 定义单线(当然加上接地)物理层。主要用在汽车中,例如 GM-LAN。
还确实存在几种专有的物理层。
➡ 在没有 CAN 驱动程序的早期,使用 RS485 修订版。
➡有关报文的详细信息,请转到第 6 页查看多个示波器图片。
规则规定不同的物理层不能交互操作。某些组合可能在良好的条件下工作,或看上去可以工作。
例如,在同一条总线上同时使用“高速”和“低速”收发器,有时可以工作。
大量 CAN 收发器芯片产自 Philips,其它厂商包括 Bosch、Infineon、Siliconix 和 Unitrode。
一种常见的收发器类型是 82C250,它实现了 ISO 11898 定义的物理层。82C251 是一种改进的版本。
“低速 CAN”的一种常见收发器是产自 Philips 的 TJA1054。
总线速度
按照标准,CAN 总线的速度是 1Mbps。然而一些 CAN 控制器能够处理比 1Mbps 更快的速度,并且可以在特殊应用场合中使用。
低速 CAN(ISO11898-3,参见上文)可以达到 125kbps。
单线 CAN 在标准模式下可高达约 50kbps,并且如果使用特殊的高速模式,诸如用于 ECU 编程,可以高达约 100kbps。
最小总线速度
注意一些总线收发器不允许低于特定的比特率。例如,使用 82C250 或 82C251 时,低于 10kbps不会有问题。但是如果使用 TJA1050,则约不能低于 50kbps。请查看数据表。
电缆长度
以 1Mbps 的速度,可以使用的电缆长度约为 40 米(130 英尺)。这是因为仲裁方案要求信号的波前可以在位被采样之前传播到最远的节点并再次返回。换言之,电缆长度受光速限制。
曾有人提出提高光速,但由于其星际间的后果而被拒绝。
其它的电缆长度是(这些值是近似值)
100 米(330 英尺),速率为 500kbps
200 米(650 英尺),速率为 250kbps
500 米(1600 英尺),速率为 125kbps
6 千米(20000 英尺),速率为 10kbps
如果使用光耦合器来提供电隔离,那么总线长度会相应地减小。提示:使用快速光耦合器并通过设备查看延迟,而不是采用指定的比特率。
总线端接
ISO11898CAN 总线必须进行端接。这是通过在总线各端使用 120 欧姆的电阻来完成的。端接可以达到两个目的:
1. 消除总线终端处的信号反射
2. 确保总线获得正确的直流电电平
不管速度快慢,ISO11898CAN 总线始终都必须进行端接。我将重复一遍:不管速度快慢,ISO11898CAN 总线始终都必须进行端接。对于实验性工作,一个端接器就已足够。如果没有连接任何端接器,但是您的 CAN 总线仍然能够正常工作,那么您只是比较幸运而已。
注意,其它物理层(例如“低速 CAN”、单线 CAN 和其它物理层)不一定需要进行端接。但是常用高速 ISO11898CAN 总线总是需要至少一个端接器。
电缆
ISO11898 规定电缆阻抗标称值为 120 欧姆,但允许[108-132]欧姆区间的阻抗。目前市场上可满足这种要求的电缆并不多。允许的阻抗区间将来很有可能会扩大。ISO11898 针对屏蔽或非屏蔽的双绞线而定义。单线标准 SAE J2411 的相关工作正在进行之中。
CAN 连接器
对于 CAN 总线连接器,根本没有任何标准!通常,每个高层协议都会定义一种或一些的连接器类型。常见的类型包括:
由iCiA提出的 9 针 DSUB。
DeviceNet和 SDS 使用的 5 针 Mini-C 和/或 Micro-C 连接器。
由CANHUG提出的用于移动液压装置的 6 针 Deutch 连接器。
参见“CAN连接器”章节中一些不同的连接器布局。