一:概述
CAN协议,全称为Controller Area Network,是一种重要的车用网络通信协议。它由德国公司博世(Bosch)设计,首次在1986年公布,并在1991年正式发布为标准。CAN协议被设计用于允许车辆上的微控制器和设备之间无主机的通信。
CAN协议的主要用途包括:
-
车辆内部通信:CAN协议最初就是为了汽车内部的电子设备之间的通信而开发的。它使得汽车内部的各种传感器、执行器、控制单元等能够交换信息,而无需复杂的线束或者中央控制器。
-
工业自动化:随着时间的发展,CAN协议也被广泛应用于工业自动化领域。许多工业设备和系统利用CAN进行数据交换,以实现自动化控制和监测。
-
医疗设备:一些医疗设备也采用CAN协议来确保可靠的数据通信。
-
其他嵌入式系统:除了汽车和工业自动化,CAN协议也被用于各种嵌入式系统的通信,例如航空电子设备、海上导航系统等。
CAN协议因其高可靠性、实时性和低成本而在这些领域得到了广泛的应用。它支持多主通信和错误检测机制,能够在高噪声环境下有效地进行通信,这对于汽车和工业环境来说是至关重要的。
二:CAN的工作原理
CAN在 OSI 参考模型中的映射如下:
-
物理层(Physical Layer):CAN 使用差分信号在总线上传输数据,定义了物理层的电气特性,如电压电平、电缆长度等。
-
数据链路层(Data Link Layer):CAN 协议主要在数据链路层进行定义,包括:
- 帧格式:定义了 CAN 帧的不同类型,如数据帧、远程帧、错误帧等。
- 访问控制:采用 CSMA/CR(Carrier Sense Multiple Access with Collision Resolution)机制,支持多个节点争用总线并通过仲裁解决冲突。
- 差错检测:包括位错误、帧错误、确认错误等,并定义了错误处理机制。
-
网络层(Network Layer)和更高层:CAN 协议主要集中在物理层和数据链路层,并没有定义网络层和更高层的内容。这些功能需要由上层协议(如 CANopen、DeviceNet 等)来实现。
-
应用层(Application Layer):CAN 协议本身不定义应用层的内容,而是由上层协议(如 CANopen、DeviceNet)来定义应用层的功能,如报文格式、网络管理等。
总的来说,CAN 协议主要在 OSI 模型的物理层和数据链路层进行定义,为上层协议提供可靠的串行总线通信服务。上层协议则负责实现网络层及以上的功能。这种分层设计使 CAN 协议灵活适用于不同的应用场景。
物理结构
CAN (Controller Area Network) 总线一般由以下几根线组成:
CAN_H(CAN High)线
这是 CAN 总线的正信号线。
CAN_L(CAN Low)线
这是 CAN 总线的负信号线。
接地线(GND)
提供 CAN 总线及其连接设备的公共参考地。
终端电阻
为了防止信号反射而导致的信号失真,CAN 总线的两端需要连接 120Ω 的终端电阻。
电源线(Vcc)
用于为 CAN 节点提供电源。有时也会与 CAN 接口共用电源。
因此,一个标准的 CAN 总线由以下 4 根线组成:
- CAN_H
- CAN_L
- GND
- 终端电阻
+--+ +--+ +--+
| | | | | |
CAN_H CAN_L GND
| | | | | |
+--+ +--+ +--+
| | |
120Ω 120Ω Vcc
这样的总线结构可以实现可靠的差分信号传输,并提供公共地参考,确保 CAN 通信的稳定性和抗干扰性。
CAN总线协议有 ISO-11898 和 ISO-11519两个系列。其定义有:
ISO-11898 定义了通信速率为 125 kbps ~1Mbps 的高速 CAN 通信标准,属于闭环总线,传输速率可达1Mbps,总线长度 ≤ 40米。
ISO11519 定义了通信速率为 10~125 kbps 的低速 CAN 通信标准,属于开环总线,传输速率为40kbps时,总线长度可达1000米。
如下图所示
多主工作方式
CAN 总线支持多主工作方式,也就是说多个节点可以同时作为主设备来发送数据帧。这种多主工作方式的实现原理如下:
-
仲裁机制:
- CAN 使用 CSMA/CR (Carrier Sense Multiple Access with Collision Resolution) 的总线访问机制。
- 当多个节点同时开始发送时,通过比较发送的位来解决冲突,优先级高的节点继续发送,优先级低的节点退出。
-
优先级机制:
- CAN 帧头部包含一个 11 位或 29 位的 ID 字段,用于标识帧的优先级。
- ID 值越小,优先级越高。当多个节点同时发送不同优先级的帧时,优先级高的帧会获得总线使用权。
-
仲裁过程:
- 当多个节点同时开始发送时,会比较自己发送的 ID 位与总线上观察到的位电平。
- 如果总线上的位电平比自己发送的位电平高(即"0"比"1"高),则该节点会立即停止发送,退出仲裁过程。
- 最终获胜的节点继续发送完整的数据帧。
通过这种基于 ID 优先级的仲裁机制,CAN 总线可以支持多个节点同时作为主设备发送数据帧,不同优先级的帧可以得到合理的调度。
这种多主工作方式具有以下特点:
- 灵活性强:任何节点都可以主动发送数据帧,无需中央控制设备。
- 可靠性高:通过仲裁机制解决了多个节点同时发送的冲突。
- 实时性强:优先级机制确保了重要数据帧得到及时传输。
因此,CAN 总线的多主工作方式非常适合于对实时性和可靠性要求较高的分布式控制系统。
工作状态
CAN 总线节点主要有以下几种工作状态:
-
错误主动状态(Active Error State)
- 节点在正常工作时的默认状态。
- 可以正常发送和接收数据帧。
-
错误被动状态(Passive Error State)
- 当节点检测到太多错误时,会进入该状态。
- 此时节点仍然可以接收数据帧,但不能主动发送数据帧。
-
总线关闭状态(Bus Off State)
- 当节点检测到更多的错误时,会进入此状态。
- 此时节点完全与总线隔离,既不能发送也不能接收数据。
-
重新初始化状态(Initialization State)
- 节点上电或复位后进入此状态。
- 初始化完成后进入错误主动状态。
-
挂起状态(Suspend State)
- 节点进入低功耗模式时进入此状态。
- 此时节点保持静默,不参与总线通信。
总之,CAN 节点的工作状态主要体现了其对错误的容忍程度和参与总线通信的能力。通过这些状态的切换,CAN 协议可以实现错误隔离,确保总线上其他节点的正常工作。
三:CAN的数据帧格式
CAN (Controller Area Network) 协议一共规定了 4 种标准帧格式:
-
标准数据帧(Standard Data Frame)
- 11 位 ID 字段表示帧的优先级。
-
扩展数据帧(Extended Data Frame)
- 29 位 ID 字段表示帧的优先级。
-
标准远程帧(Standard Remote Frame)
- 11 位 ID 字段表示帧的优先级。
- 没有数据区,用于请求其他节点发送数据。
-
扩展远程帧(Extended Remote Frame)
- 29 位 ID 字段表示帧的优先级。
- 没有数据区,用于请求其他节点发送数据。
除了这 4 种标准帧格式外,CAN 协议还定义了以下 2 种特殊帧格式:
-
错误帧(Error Frame)
- 用于通知其他节点发生通信错误。
-
过载帧(Overload Frame)
- 用于在数据帧或远程帧之间插入延迟。
总的来说,CAN 协议共定义了 6 种不同类型的帧格式,分别用于数据传输、错误处理以及通信控制等目的。这些帧格式共同构成了 CAN 总线上的通信机制。
数据帧
CAN (Controller Area Network) 协议定义了几种不同类型的帧格式,其中最重要的是数据帧。CAN 数据帧的格式如下:
-
开始帧(SOF - Start of Frame)
- 1 个隐性位(1),表示帧的开始。
-
仲裁字段(Arbitration Field)
- 11 位 ID(标准帧)或 29 位 ID(扩展帧),用于标识帧的优先级。
- 1 位 RTR(远程传输请求)位,标识是数据帧还是远程帧。
- 1 位 IDE(扩展 ID 使能)位,标识是标准帧还是扩展帧。
-
控制字段(Control Field)
- 4 位 DLC(数据长度代码),表示数据区的长度。
- 3 位保留位。
-
数据字段(Data Field)
- 0~8 个字节的数据。
-
CRC 字段(CRC Field)
- 15 位 CRC 校验码。
- 1 位 CRC 分隔符。
-
确认字段(ACK Field)
- 1 位 ACK 槽,由发送节点发送隐性位。
- 1 位 ACK 分隔符。
-
结束帧(EOF - End of Frame)
- 7 个隐性位,表示帧的结束。
-
间隙(Intermission)
- 3 个隐性位,表示两帧之间的间隔。
上述各个字段组成了完整的 CAN 数据帧。其中 ID 字段用于确定帧的优先级,DLC 字段指示数据区的长度,数据区包含实际要传输的数据。CRC 和 ACK 字段用于保证数据传输的可靠性。
扩展帧
在扩展帧中,仲裁字段的信息被扩充:
- 1 位 SRR(Substitute Remote Request),保留为隐性位。
- 18 位 Extended Identifier$ (EID[17:0])$(EID[17:0]),组成 29 位 ID。
- 1 位 IDE(ID Extension),设置为显性位(0)表示是扩展帧。
- 1 位 RTR(Remote Transmission Request),标识是数据帧还是远程帧。
与标准帧格式相比,扩展帧主要有以下区别:
- ID 字段扩展为 29 位,可以表示更多的优先级。
- 增加了 SRR 位用于保留。
- IDE 位被设置为显性位(0)以标识为扩展帧。
远程帧
CAN (Controller Area Network) 远程帧的格式如下:
-
开始帧(SOF - Start of Frame)
- 1 个隐性位(1),表示帧的开始。
-
仲裁字段(Arbitration Field)
- 11 位 ID(标准帧)或 29 位 ID(扩展帧),用于标识帧的优先级。
- 1 位 RTR(远程传输请求)位,这里设置为 1 表示是远程帧。
- 1 位 IDE(扩展 ID 使能)位,标识是标准帧还是扩展帧。
-
控制字段(Control Field)
- 4 位 DLC(数据长度代码),这里设置为要请求的数据长度。
- 3 位保留位。
-
CRC 字段(CRC Field)
- 15 位 CRC 校验码。
- 1 位 CRC 分隔符。
-
确认字段(ACK Field)
- 1 位 ACK 槽,由发送节点发送隐性位。
- 1 位 ACK 分隔符。
-
结束帧(EOF - End of Frame)
- 7 个隐性位,表示帧的结束。
-
间隙(Intermission)
- 3 个隐性位,表示两帧之间的间隔。
需要注意的是,远程帧没有数据区,只包含 ID、RTR、DLC 等字段。其主要作用是请求其他节点发送指定长度的数据。
当接收到远程帧时,被请求的节点会响应发送对应的数据帧。这样实现了主从式的数据交换,满足了一对多节点之间的轮询通信需求。
错误帧
CAN (Controller Area Network) 协议定义了错误帧的格式,以及针对不同类型错误的处理机制。
CAN 错误帧的格式如下:
-
错误标志(Error Flag)
- 由 6 个连续的相同位组成,可以是显性位(0)或隐性位(1)。
-
错误分隔符
- 8 个隐性位,用于将错误标志与下一个帧分隔开。
CAN 协议定义了以下几种错误类型:
-
位错误(Bit Error)
- 当节点在发送某位时,检测到总线上的电平与自己发送的电平不一致。
- 发生位错误时,节点会立即发送错误标志。
-
格式错误(Form Error)
- 当节点检测到帧格式不正确时,如 SOF 位不是隐性、EOF 位不是隐性等。
- 发生格式错误时,节点会立即发送错误标志。
-
确认错误(Acknowledgement Error)
- 当节点在发送帧时,没有收到其他节点的确认。
- 发生确认错误时,节点会立即发送错误标志。
-
CRC 错误(CRC Error)
- 当接收到的 CRC 校验码与计算的不一致时。
- 发生 CRC 错误时,节点会立即发送错误标志。
当任何节点检测到错误时,都会立即发送错误标志。其他节点收到错误标志后,也会立即停止正在发送的帧,并自己发送错误标志。
通过这种错误帧机制,CAN 协议能够快速检测和隔离错误,确保总线上其他节点的正常工作。出现错误的节点也会根据错误计数器进入错误被动状态或总线关闭状态,避免其持续干扰总线通信。
过载帧
CAN (Controller Area Network) 的过载帧用于在数据帧或远程帧之间插入延迟,其格式如下:
-
过载标志(Overload Flag)
- 由 6 个连续的显性位(0)组成。
-
过载分隔符(Overload Delimiter)
- 8 个隐性位(1)。
当 CAN 节点检测到以下情况时,会发送过载帧:
- 在接收到数据帧或远程帧后,在预期的 3 个隐性位间隙时间内还没有检测到新帧的开始。
- 在发送数据帧或远程帧过程中,检测到总线被占用。
发送过载帧的节点会延迟发送下一个数据帧或远程帧,以给其他节点更多的时间进行同步和准备。
接收过载帧的其他节点会:
- 停止正在发送的帧。
- 重新开始计时,等待下一个帧的到来。
过载帧的使用有以下作用:
- 给忙碌节点一些喘息时间,避免队列溢出。
- 确保节点之间的同步,防止错误发生。
- 提高总线利用率,避免因短暂的总线占用而造成不必要的帧间隔。
CAN 的过载帧机制是为了确保总线通信的连续性和可靠性,是 CAN 协议实现高效、实时通信的重要保障。
四:CANOpen协议
CANopen 是基于 CAN 总线协议的上层应用协议,主要用于工业自动化和移动机械领域。它为 CAN 总线网络提供了更高层次的功能和服务。
1. 对象字典
对象字典是指含有描述的CANopen节点的行为的所有参数的标准化结构。
通过16位索引和8位子索引查找OD条目。例如,符合CANopen的节点OD的索引1008(子索引0)包含节点设备名。
具体来说,对象字典中的条目由属性定义:
- 索引:对象的16位基址
- 对象名称:制造商设备名称
- 目标代码:数组,变量或记录
- 数据类型:例如VISIBLE_STRING或UNSIGNED32或记录名称
- 访问: rw(读/写),ro(只读),wo(只写)
- 类别:指示此参数是否为必需/可选(M / O)
重要的是,设备(例如从设备)的OD条目可以由其他设备(例如主机)使用SDO通过CAN进行访问。
例如,这可能使应用程序主机更改从属节点是否通过特定的输入传感器记录数据,或者从属发送心跳的频率。
链接到电子数据表和设备配置文件
要了解OD,查看电子数据表EDS
和设备配置文件DCF
会很有帮助。
2. 通信服务
CANopen 协议中定义了以下几种主要的通信服务:
-
过程数据对象(Process Data Object, PDO)
- 用于实时、周期性地传输过程数据。
- 分为发送 PDO (TPDO) 和接收 PDO (RPDO)。
- 可以配置为同步或异步传输模式。
- 传输速度快,但有限制数据长度(最多 8 字节)。
-
服务数据对象(Service Data Object, SDO)
- 用于点对点的数据读写操作。
- 可以读取或写入对象字典中的任何对象。
- 传输速度较慢,但数据长度没有限制。
- 包含请求/响应的事务机制。
-
同步对象(Synchronous Object, SYNC)
- 用于在 CANopen 网络中同步数据传输。
- 可以触发 TPDO 的周期性传输。
- 也可以用于同步其他事件,如采样、控制等。
-
紧急对象(Emergency Object, EMCY)
- 当节点出现错误时,用于发送紧急通知。
- 传输速度较快,可以及时通知其他节点。
- 错误代码和错误寄存器包含在 EMCY 对象中。
-
时间戳对象(Time Stamp Object, TIME)
- 用于在 CANopen 网络中传递时间信息。
- 可用于同步网络节点的时钟。
-
心跳对象(Heartbeat Object)
- 用于监控节点的工作状态。
- 每个节点周期性地发送自身的状态信息。
- 其他节点可以检测是否有节点失去响应。
这些通信服务共同构成了 CANopen 协议的通信模型,满足了工业自动化场景下对实时性、可靠性、可配置性等方面的需求。
通过合理配置这些通信对象,CANopen 网络可以实现设备之间高效、可靠的数据交换,为上层应用提供坚实的通信基础。
标签:协议,通讯,错误,总线,ID,发送,工业,节点 From: https://www.cnblogs.com/Asp1rant/p/18173257