没有合适的资源?快使用搜索试试~ 我知道了~
CAN协议教程.pdf
资源推荐
资源详情
资源评论
CAN 协议教程
本 CAN 协议教程概述了 ISO 11898-1 和 ISO 11898-2 标准。对 CAN 的基本原理做出了详细的介
绍,诸如用于汽车设计、工业自动化控制以及更多的应用。
一,介绍: CAN总线
CAN总线是广播类型的总线。这意味着所有节点都可以侦听到所有传输的报文。没有办法
把报文单独发送给特定的节点;所有节点都将原封不动地捕获所有报文。但是, CAN硬件能够提
供本地过滤能力,从而每个节点可以只对感兴趣的报文做出响应。
总线使用不归零的位填充。模块以连续逻辑与方式连接到总线:如果只有一个节点向总线
传输逻辑 0,那么不管有多少个节点向总线传输逻辑 1,整个总线都处于逻辑 0 状态。
CAN标准定义四种不同的报文类型。报文使用一种聪明的位操作仲裁方案来控制对总线的
访问,每条报文都带有优先级标记。
CAN标准还为错误处理和消除定义了详细的方案。这在第 9 节“ CAN错误处理”(第 23
页)中有更详细的说明。
在本教程第 8 页讨论位计时和时钟同步。这里有一个位计时计算器,您可以用它来计算
CAN总线参数和寄存器设置。
CAN可以使用不同的物理层来实现(第 5 页),这里阐述其中一些。而且,可以使用许多
不同种类的连接器。我们还为对报文细节感兴趣的用户提供了许多示波器图片(第 6 页)。
二, CAN报文
CAN总线是广播类型的总线。这意味着所有节点都可以侦听到所有传输的报文。没有办法
把报文单独发送给特定的节点;所有节点都将原封不动地捕获所有报文。但是, CAN硬件能够提
供本地过滤能力,从而每个节点可以只对感兴趣的报文做出响应。
CAN报文
CAN使用短报文 –最大实用负载是 94 位。报文中没有任何明确的地址;相反,可以认为报
文是通过内容寻址,也就是说,报文的内容默示地确定其地址。
报文类型
CAN总线上有四种不同的报文类型(或 “帧”):
1. 数据帧
2. 远程帧
3. 错误帧
4. 过载帧
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”)数据帧
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 个仲裁
位的报文会很麻烦。 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错误,传送错误计数器不再增加。
所以节点将一直继续传送,至少一直到有人确认报文。
报文寻址和标识
剩余22页未读,继续阅读
资源评论
霸道流氓气质
- 粉丝: 1w+
- 资源: 589
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功