当前位置: 首页 > ds >正文

CANopen协议简单介绍和使用

文章目录

  • 一、CAN总线介绍
  • 二、CAN总线的帧类型
  • 三、CAN总线的特性
  • 四、Linux中的CAN帧驱动结构体
  • 五、CAN总线升级版本-CANFD
  • 六、更高层封装的协议-应用层封装的CANopen协议
  • 总结

一、CAN总线介绍

CAN总线(Controller Area Network) 是一种串行通信协议,最初由德国博世公司于1986年开发,主要用于汽车电子系统中的控制单元通信。如今,它已广泛应用于汽车、工业自动化、医疗设备、航空航天等多个领域。

二、CAN总线的帧类型

1.数据帧:用于节点向外传输数据
2.遥控帧:用于向远端节点请求数据
3.错误帧:用于向远端节点通知错误,请求重新发送上一次的数据
4.过载帧:用于通知远端节点,本节点还没有做好接收数据的准备
5.帧间隔:用于将数据帧和遥控帧与前面的帧进行分割开来

三、CAN总线的特性

  1. CAN总线可以实现多主控制,在总线空闲时,所有的单元都可开始发送消息,多主控制,最先访问总线的单元可获得发送权
    多个单元同时开始发送时,发送高优先级 ID 消息的单元可获得发送权;
  2. 发送数据的优先级的定义,在 CAN 协议中,所有的消息都以固定的格式发送。总线空闲时,所有与总线相连的单元都可以开始发送新消息;两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为 ID)决定优先级;ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各消息 ID 的每个位进行逐个仲裁比较;仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作;
  3. 在总线空闲时,所有的节点都可以发送数据。这一点可以说是CAN总线的容易扩展的原因。与总线相连的单元没有类似于“地址”的信息;因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变;
  4. 数据重传和数据重发。可通过发送“遥控帧” 请求其他单元发送数据;错误检测功能·错误通知功能·错误恢复功能;所有的单元都可以检测错误(错误检测功能);检测出错误的单元会立即同时通知其他所有单元(错误通知功能);正在发送消息的单元一旦检测出错误,会强制结束当前的发送;强制结束发送的单元会不断反复地重新发送,此消息直到成功发送为止,错误恢复功能;
  5. 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协议的核心。

http://www.xdnf.cn/news/3471.html

相关文章:

  • 基于静态局部立方体贴图的高效软阴影
  • 先知AIGC超级工场,如何助力企业降本增效?
  • 上位机 日志根据类型显示成不同颜色
  • VS乱码问题
  • 2025年Jetpack Compose集成网络请求库的完整实施方案
  • Dify LLM节点的记忆功能深度探究
  • 滚珠丝杆怎么选型?
  • 《解锁LibTorch:开启C++深度学习新征程》
  • Windows 系统中安装 flash - attn
  • 智慧校园综合整体解决方案-8PPT(58页)
  • AI 知识库:企业知识管理的利器
  • 【C++】频繁进行动态内存分配和释放可能导致多方面的问题
  • 深入探讨互联网大厂Java核心技术与架构设计
  • windbg调试dump文件
  • 信号与系统-风中醉风
  • 2025 RSAC|自主式 GenAI 安全智能体(Agent)开启防御新纪元
  • Splunk 使用Role 实现数据隔离
  • firecrawl的docker安装和api调用
  • Linux安装MySQL详细教程
  • 视觉标记token:解锁AI视觉理解新维度的钥匙
  • 强化学习之基于无模型的算法之基于值函数的深度强化学习算法
  • DeepSeek-V3 解析第二篇:DeepSeekMoE
  • 数据库的死锁相关(一)
  • 动态规划 -- 子数组问题
  • nginx 配置要领
  • 客户服务升级:智能语音外呼系统在多领域的场景应用解析
  • 大模型时代的新燃料:大规模拟真多风格语音合成数据集
  • 面经很简单的
  • 机器学习_KNN算法
  • 【SpringBoot】基于mybatisPlus的博客管理系统(2)