CAN协议概览

CAN报文,第3页/共3页

基本CAN和完整CAN

术语“基本CAN”和“完整CAN”源于CAN的早期。曾经有一种Intel 82526 CAN控制器为程序员提供DPRAM风格的接口。然后飞利浦公司推出了82C200,这种控制器使用面向先进先出队列的编程模型和有限制的过滤能力。为了区分这两种编程模型,人们因为某些原因把Intel的模型称为“完整CAN”,把飞利浦的模型称为“基本CAN”。如今,大部分CAN控制器同时支持这两种编程模型,所以没有任何理由继续使用术语“基本CAN”和“完整CAN”。事实上,这些术语可以导致混淆,应当避免使用。

当然,“完整CAN”控制器可以与“基本CAN”控制器进行通信,反之亦然。不存在任何兼容问题。

总线仲裁和报文优先级

对于用于数据传输的真实可用带宽而言,报文仲裁(两个或多个CAN控制器协商谁使用总线的过程)非常重要。

任何CAN控制器在检测到总线空闲时都可以开始发送报文。这可能会导致两个或多个控制器(几乎)同时开始发送报文。这种冲突通过以下方式解决。发送节点在发送时监视总线。如果节点自身在发送隐性电平时检测到显性电平,它将立即退出仲裁过程并转变成为接收方。仲裁在整个仲裁字段上进行,该字段发送后,总线上只剩下一个发送节点。这个节点若无其事地继续发送报文。其它潜在发送节点将在总线下次空闲时尝试重传报文。仲裁过程中不丢失任何时间。

这种位操作仲裁获得成功的重要条件是没有任何两个节点发送相同的仲裁字段。这个规则有一个例外:如果报文不包含任何数据,那么任何节点都可以发送该报文。

因为总线是串行与的关系,并且显性位是逻辑0,所以结果是仲裁字段数值最小的报文将赢得仲裁。

问:如果节点是总线上唯一节点并且试图发送报文,会发生什么情况?
答:当然,节点将赢得仲裁并愉快地进行报文发送。但是,在确认环节,没有节点在确认槽期间发送显性位,所以发送方将得知确认错误,然后发送一个错误标志,将其发送错误计数器的值加8并开始重传。相同的过程将重复16次;然后发送方将进入错误消极状态。按照错误限制算法中的一个特殊规则,如果节点处于错误消极状态并且错误是一个确认错误,那么发送错误计数器不再继续增加。所以节点将继续永久地发送报文,直到至少有一个别的节点确认报文。

报文寻址和标识

再次说明,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的使用。