CANopen协议简单介绍和使用
文章目录
- 一、CAN总线介绍
- 二、CAN总线的帧类型
- 三、CAN总线的特性
- 四、Linux中的CAN帧驱动结构体
- 五、CAN总线升级版本-CANFD
- 六、更高层封装的协议-应用层封装的CANopen协议
- 总结
一、CAN总线介绍
CAN总线(Controller Area Network) 是一种串行通信协议,最初由德国博世公司于1986年开发,主要用于汽车电子系统中的控制单元通信。如今,它已广泛应用于汽车、工业自动化、医疗设备、航空航天等多个领域。
二、CAN总线的帧类型
1.数据帧:用于节点向外传输数据
2.遥控帧:用于向远端节点请求数据
3.错误帧:用于向远端节点通知错误,请求重新发送上一次的数据
4.过载帧:用于通知远端节点,本节点还没有做好接收数据的准备
5.帧间隔:用于将数据帧和遥控帧与前面的帧进行分割开来
三、CAN总线的特性
- CAN总线可以实现多主控制,在总线空闲时,所有的单元都可开始发送消息,多主控制,最先访问总线的单元可获得发送权
多个单元同时开始发送时,发送高优先级 ID 消息的单元可获得发送权; - 发送数据的优先级的定义,在 CAN 协议中,所有的消息都以固定的格式发送。总线空闲时,所有与总线相连的单元都可以开始发送新消息;两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为 ID)决定优先级;ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各消息 ID 的每个位进行逐个仲裁比较;仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作;
- 在总线空闲时,所有的节点都可以发送数据。这一点可以说是CAN总线的容易扩展的原因。与总线相连的单元没有类似于“地址”的信息;因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变;
- 数据重传和数据重发。可通过发送“遥控帧” 请求其他单元发送数据;错误检测功能·错误通知功能·错误恢复功能;所有的单元都可以检测错误(错误检测功能);检测出错误的单元会立即同时通知其他所有单元(错误通知功能);正在发送消息的单元一旦检测出错误,会强制结束当前的发送;强制结束发送的单元会不断反复地重新发送,此消息直到成功发送为止,错误恢复功能;
- CAN总线可以连接的设备的数量在现实世界中是有一定的限制的。CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的;但实际可连接的单元数受总线上的时间延迟及电气负载的限制;降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。
四、Linux中的CAN帧驱动结构体
truct can_frame {canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */canid_t can_id; /* 32 位 CAN_ID + EFF/RTR/ERR 标志 */__u8 can_dlc; /* 以字节为单位的帧有效负载长度 (0 .. 8) */__u8 __pad; /*填充*/__u8 __res0; /* 保留 / 填充 */__u8 __res1; /* 保留 / 填充 */__u8 data[8] __attribute__((aligned(8)));
};
五、CAN总线升级版本-CANFD
CAN FD(Controller Area Network with Flexible Data-rate)是传统 CAN 协议的升级版,旨在解决传统 CAN 在数据传输速率和数据负载方面的局限性。
主要功能:
可变速率:CAN FD 支持在仲裁阶段(最高 1 Mbps)和数据阶段(最高可达 8 Mbps)之间动态切换速率。
数据负载扩展:单帧数据长度从传统 CAN 的 8 字节扩展到 64 字节,减少协议开销,提高数据吞吐量。
增强的错误检测:采用更长的 CRC 校验(17 位或 21 位),覆盖填充位,降低错误漏检率。
兼容性:与传统 CAN 协议兼容,支持在同一网络中共存。
六、更高层封装的协议-应用层封装的CANopen协议
过程数据对象(PDOs):用于实时数据交换
服务数据对象(SDOs):用于设备配置和参数更新
网络管理(NMT)协议:用于控制和监控网络状态
同步(SYNC)和紧急消息(EMCY):用于确保时间关键型过程的执行
本次选用CANopenNode的CANopen开源协议栈,移植开源协议栈至linux系统中,开启网卡进行测试。
CANopenNode源代码开源地址
CANopenLinux源代码开源地址
打开CAN设备
root@localhost:~/CANopenLinux-master/CANopenNode#
root@localhost:~/CANopenLinux-master/CANopenNode# ip link set can0 up type can bitrate 500000
root@localhost:~/CANopenLinux-master/CANopenNode#
编译源代码
在本地创建CANopen的连接,注意在使用CANopen的命令行操作之前,需要将本地CAN网络卡进行打开,否则会出现以下的报错信息:
正常运行的收发如下:
打开上位机软件可以发现发送过来的数据,CANopen命令字典的使用。使用这个对象字典编辑器可以实现对象字典的生成,这个工具非常方便。然后将生成的对象字典文件加入到源码中再次编译即可。
对象字典编辑器下载地址
总结
本次对CAN协议进行一个整理以方便后续查看。CAN的稳定性和可扩展性使得CAN协议在工业场景中使用非常广泛。目前在应用层有进一步的封装,CANopen协议的使用更加灵活,需要理解对象字典的含义,了解NMT主机管理机制和SDO以及PDO,其中学会理解和使用对象字典是学习CANopen协议的核心。