CAN协议概览
CAN报文,第2页/共3页
远程帧
概要:“大家好,谁能帮忙生成标签为X的数据?”
远程帧和数据帧相似,但是有两个重要的不同之处:
- 它被显式标记为远程帧(仲裁字段中的RTR位为隐性),并且
- 没有任何数据字段。
远程帧的目的是请求传输相应的数据帧。例如,如果节点A发送一个仲裁字段设置为234的远程帧,那么节点B(如果已经正确初始化)可能会回应一个仲裁字段也设置为234的数据帧。
远程帧可用于实现一类请求-响应类型的总线流量管理。但是,远程帧在实践中很少使用。还有一点值得注意,CAN标准没有规定此处列出的行为。大部分CAN控制器可以进行编程来自动响应远程帧或通知本地处理器。
关于远程帧,有一点需要指出:数据长度代码必须设置为所需响应报文的长度。否则,仲裁将不会工作。
有时候,人们会认为响应远程帧的节点在识别标识符后马上开始发送,从而会“填满”空的远程帧。事实上并非如此。
远程帧(2.0A类型):
错误帧
概要:(大声叫喊)“噢,伙计,让我们再试一下”
简而言之,错误帧是一种违反CAN报文帧规则的特殊报文。节点检测到故障时会发送错误帧,并且将导致所有其它节点也检测到故障,从而其它节点也将发送错误帧。然后发送方将自动尝试重传报文。有一种精心设计的错误计数器方案能够确保节点无法通过重复发送错误帧来破坏总线通信。
错误帧由一个包含6位相同值(因此违反位填充规则)的错误标志和一个包含8个隐性位的错误分隔符组成。错误分隔符提供有一些空间,总线上的其它节点在检测到第一个错误标志时可以把它们的错误标志发送到这部分空间中。
错误帧图示:
过载帧
概要:“我是非常繁忙的小型82526,您可以稍等片刻吗”
这里提到过载帧只是为了知识的完整性。它的格式和错误帧非常相似,由过于繁忙的节点发送。过载帧很少用到,因为当今的CAN控制器非常智能,能够避免过载。事实上,会生成过载帧的唯一一种控制器是现在已经过时的82526。
标准CAN和扩展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的管理性负载要小。