最近完成了项目CAN
协议模块的编写,CAN
作为一种总线类型,多台设备连接到总线上,在短距离传输上有其优势,套用相关公司的广告就是 “CAN协议 – 方便灵活 功能强大”:
CAN协议为分布式控制系统的设计提供了良好基础。CAN仲裁方法确保每一个CAN节点只需处理与其相关的报文。
CAN协议是在硅片的环境中实现的。这使得CAN设备在拥有错误处理和故障界定功能的同时可保持高速传输。这种用来分发报文至正确接收器的方法有助于充分利用带宽。
传输介质简单, 常见的传输介质是双绞线。CAN系统也可以单线工作。而在一些应用中,不同种类的链路、光链路或无线链路更适合。虽然存在着传输硬件标准(双绞线),但根据系统要求采用不同的传输方案也很常见。
出色的错误处理功能,CAN的错误处理功能是该协议最为突出的优点之一。错误检测机制的范围很广,而且故障界定算法非常先进。错误处理和报文重发会由CAN硬件自动进行。
强大的故障界定功能,CAN协议内置的特别功能会阻止故障节点堵塞整个系统。此类节点最终会被禁止在CAN总线上发送报文。
成熟的标准,CAN协议已经诞生将近30年(从1986年开始)。 现在市面上有很多可用的CAN产品和工具。
CAN总线
CAN总线是广播类型的总线,所有的节点都可以侦听到所有传输的报文。在物理层上,无法将报文单独发送给指定的节点。不过, CAN硬件提供本地的过滤功能,使得节点可以对报文做出选择性的响应。这样的话,通过设定可以接收任意报文。
CAN标准定义四种不同的报文类型。报文使用逐位仲裁智能方案来控制对总线的访问,每条报文都带有优先级标记。具体实现就不深入了, 知道有这么个优先级及可以了。
CAN报文
CAN使用短报文 – 最大实用负载是94位。报文中没有任何明确的地址;相反,可以认为报文是通过内容寻址,也就是说,报文的内容隐式地确定其地址。CAN协议只定义链路层,具体的有高层协议CANOpen来定义。
CAN总线上有四种不同的报文类型:
- 数据帧
- 远程帧
- 错误帧
- 过载帧
数据帧
数据帧是最常见的类型。 包含以下部分:
- 仲裁字段 由标识符(11位/29位)和标记位组成
- 数据字段 包含0-8个数据字节
- CRC字段 包含一个基于报文大部分数据计算得到的15位校验和。校验和用于错误检测。
- 应答时隙。任何能够正确接收报文的CAN控制器都会在每条报文的末尾发送一个应答位。传送节点检查应答位是否存在,如果没有检测到应答位,会重新发送报文。
远程帧
远程帧与数据帧十分相似,但是有两个重要的区别:
它被显式标记为远程帧(仲裁字段中的RTR位为隐性),并且它没有数据字段。
远程帧的预期目的是征求传输相应的数据帧。
如果节点A传输一个仲裁字段设置为234的远程帧,那么节点B(如果已经正确初始化)可能通过一个仲裁字段也设置为234的数据帧进行响应。
错误帧
一般不用
过载帧
一般不用
标准帧和扩展帧
开始的时候, 仲裁字段是定义了11位的标识符, 后续根据应用需求扩展成了29位的标识符。大部分CAN收发器都是支持两种格式的。
总线仲裁和报文优先级
任何CAN控制器都可能在检测到空闲总线时开始传送数据。这可能会导致两个或多个控制器(几乎)同时开始传送报文。传送节点在发送报文时监视总线。如果节点在自身发送隐性位时检测到显性位,它将立即退出仲裁过程并转变成接收方。仲裁针对整个仲裁字段进行,当该字段已经被发送时,总线上恰好只剩一个传送节点。这个节点就像什么都没发生那样继续传送。其它潜在的传送节点将在总线下次空闲时尝试重传它们的报文。仲裁过程不会消耗时间。
总线采用线与逻辑,并且显性位是逻辑0,所以包含数值最低仲裁字段的报文将赢得仲裁。
简单说,是否可以发送报文,需要先检查总线上有没有人在发,只有空闲了,你才能发报文。标识符的值越小优先级越高。
CAN物理层
CAN总线的最大速度是1 Mbps。
如果速度为1Mbps,可以使用的最大线缆长度大约为40米(130英尺)。
高层协议
CAN本身只定义了物理层和链路层的协议。具体应用还需要更高层的协议,一般而言,都是采用的CANOpen。
CANOpen也是项目实现的重点。主要就是通过把标识符拆分为功能码与节点地址。然后约定好各种功能的协议格式。
具体收发器可以实现对不同标识符位的过滤。就类似网络IP协议中的掩码,可以设置只关心某些位,其他位的值不需要关心。比IP更灵活,不仅仅支持后缀掩码,可以支持任意位的掩码。
实现思想
模块的实现主要就是分层思想的应用,从上而下分为应用逻辑层、协议层、驱动层。初始化通过函数注入上层接口,解除底层对上层的耦合。通过参数配置可以灵活选择底层的CAN IO口,以及波特率等的设置。同时,针对TI的eCAN邮箱,应用层通过合理规划分配输入和输出邮箱的标识符,实现多种报文的收发。把可变的都设置成上层可配置的方式。具体这个ecan的使用,除了学习例程、主要就是花时间看看寄存器文档,然后自己实现个demo,实现基本功能。
行动,才不会被动!
欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。