CAN协议教程
介绍:CAN总线
CAN总线是广播类型的总线。这意味着所有节点都可以侦听到所有传输的报文。无法将报文单独发送给指定节点;所有节点都将始终捕获所有报文。但是,CAN硬件能够提供本地过滤功能,让每个节点对报文有选择性地做出响应。
总线使用不归零位填充。模块以线与逻辑连接到总线:如果只有一个节点向总线传输逻辑0,那么不管有多少个节点向总线传输逻辑1,整个总线都处于逻辑0状态。
CAN标准定义四种不同的报文类型。报文使用逐位仲裁智能方案来控制对总线的访问,每条报文都带有优先级标记。
CAN标准还为错误处理和消除定义了详细的方案,这在第9节“CAN错误处理”(第23页)中有更详细的说明。
在本教程第8页讨论位时序和时钟同步。位时序计算器见此页面,您可以用它来计算CAN总线参数和寄存器设置。
CAN可以使用不同的物理层来实现(第5页),这里阐述其中一些。而且,可以使用许多不同种类的连接器。我们还为对报文细节感兴趣的用户提供了许多示波器图片(第6页)。
CAN报文(第1页/共3页)
CAN总线是广播类型的总线。这意味着所有节点都可以侦听到所有传输的报文。无法将报文单独发送给指定节点;所有节点都将始终捕获所有报文。但是CAN硬件能够提供本地过滤功能,让每个节点对报文有选择性地做出响应。
CAN报文
CAN使用短报文 – 最大实用负载是94位。报文中没有任何明确的地址;相反,可以认为报文是通过内容寻址,也就是说,报文的内容隐式地确定其地址。
报文类型
CAN总线上有四种不同的报文类型(或“帧”):数据帧
远程帧
错误帧
过载帧
1. 数据帧
概要:“大家好,这是一些标签为X的数据,希望满足您的需要!”
数据帧是最常见的报文类型。由下列主要部分组成(出于简洁性目的,忽略了一些细节):仲裁字段。当两个或多个节点竞争总线时,确定报文的优先级。仲裁字段包含:对于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”)数据帧
CAN报文(第2页/共3页)
2. 远程帧
概要:“大家好,有没有人能够生成标签为X的数据?”
远程帧与数据帧十分相似,但是有两个重要的区别:它被显式标记为远程帧(仲裁字段中的RTR位为隐性),并且
它没有数据字段。
远程帧的预期目的是征求传输相应的数据帧。例如,如果节点A传输一个仲裁字段设置为234的远程帧,那么节点B(如果已经正确初始化)可能通过一个仲裁字段也设置为234的数据帧进行响应。
远程帧可以用来实现总线通信管理的请求-响应类型。但是,远程帧在实践中很少使用。还有一点值得注意的是,CAN标准没有规定这里列出的特性。大部分CAN控制器都可以进行编程自动响应远程帧或通知本地CPU。
关于远程帧的一个注意事项:数据长度代码必须设置成预期响应报文的长度。否则仲裁将不起作用。
有时据称响应远程帧的节点会在识别标识符后立即开始传输,从而“填充”空的远程帧。但是事实并非如此。
远程帧(2.0A类型):
3. 错误帧
概要:“大家好(大声),让我们重新试一下”
简单地说,错误帧是一种违背CAN报文帧规则的特殊报文。一个节点咋在检测到故障时传送错误帧,这将导致所有其它节点也检测到故障,它们也将发送错误帧。然后传送节点将自动尝试重传报文。有一种精准的错误计数器方案,可以确保节点无法通过重复传输错误帧来破坏总线通信。
错误帧包含一个错误标志。这个错误标志是6位长的相同值(因此违背位填充规则)和一个错误定界符(8个隐性位)。错误定界符提供一些空间,以便总线上其它节点在检测到第一个错误标志时可以发送它们的错误标志。
错误帧图示如下:
4. 过载帧
概要:“我是非常繁忙的小型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个仲裁位的报文会很