CAN总线之通俗易懂----报文3

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/langshi_2011/article/details/90207888

基本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个最高有效位都设置为1。所以,对于11位标识符,只剩下0到2031,29位标识符可以使用532676608个不同的值。

注意,所有其它CAN控制器都接受“非法”标识符,所以现代CAN系统标识符2032到2047可以自由使用。

猜你喜欢

转载自blog.csdn.net/langshi_2011/article/details/90207888
今日推荐