下面是CAN协议与OSI网络模型的一个对比。CAN的物理层分了三层分别是MDI,PMA和PLS,数据链路层分了两层:MAC与LLC。这五层就是最原始的CAN协议,标准是ISO11898。也就是说CAN协议一开始是没有应用层的。后来有一种叫CANOpen的基于CAN的应用层协议被开发出来,标准是CiA301。

在实际开发CAN器件的时候不一定要用CANOpen,你可以根据自己的需要定制自己的应用层协议。

CANOpen协议共有6种通讯对象,分别是:PDO、SDO、SYNC、TIME、EMCY、NMT。这6种通讯对象完成了CANOpen协议的所有通讯功能。其中我们只介绍使用较多的PDO、SDO、NMT(4.4)。

通信对象ID(COB-ID)
CANOpen协议的通讯对象主要利用了CAN协议中的数据帧和远程帧。为了区分不同的通讯对象,CANOpen协议利用数据帧/远程帧中的ID。其中第7位到第10位为功能代码。第0位到第6位为节点ID,用以区分不同节点的相同功能。这样就允许最多127个从节点与主节点通讯。

下面是预定义的各通讯对象的COB-ID

其中绿色部分为广播的通讯对象,蓝色部分为点对点的通讯对象。

COB-ID的大小也决定了通讯对象的优先级,其中NMT的优先级最高,PDO的优先级高于SDO。

CANOpen的网络管理使用了master/slave结构。Master通过模块控制服务,可以控制slave的状态:{STOPPED, PRE-OPERATIONAL, OPERATIONAL, INITIALISING}.模块控制服务可以只针对一个节点,也可以是所有节点同时改变。

stm32 CANOpen相关推荐

  1. VxWorks下 canOpen移植心得 stm32 - ppc

    工作中碰到关于VxWorks canOpen协议栈的移植,现在是边移植边写一下心得: 基础环境是ppc8265 + VxWorks5.5 (风河的tornado真心比workbench难用). 软件基 ...

  2. 嵌入式CANopen协议从入门到落地产品(更新2021.9.8)

    一.前言 我写CANopen系列博文的初衷是分享如何使用STM32单片机开发一款CANopen产品,所谓实战为主,理论为辅.只看CANopen协议的理论是很枯燥,而且根本看不会.我认为掌握CANope ...

  3. STM32+CubeMX开发工程笔记汇总(更新2021.8.12)

    一.前言 使用STM32开发产品已经快两年了,一路走来真的非常有意思. 单片机型号:从STM32F103->STM32F407->STM32H743 库: 从标准库->HAL库(ST ...

  4. CANopen | 对象字典OD 03 - 启动CANopen节点的服务数据对象SDO

    文章目录 一.前言 二.实验的目的 三.对象字典OD 3.1.Slave1.od 3.2.Slave1.c 四.CAN盒子(收发器) 4.1.通过SDO方式修改CANopen从站的心跳时间 一.前言 ...

  5. CANopen | 对象字典OD 04 - 创建对象字典的变量(映射变量)

    文章目录 一.前言 二.实验目的 三.对象字典 3.1.找到工程里的对象字典文件 3.2.创建映射变量 四.STM32代码 4.1.Slave1.c 4.2.main.c 五.CAN盒子(收发器) 5 ...

  6. CANopen | 对象字典OD 02 - 修改CANopen节点的心跳报文发送间隔

    文章目录 一.前言 二.实验的目的 三.对象字典OD 3.1.Slave.od 3.2.Slave1.c 四.CAN盒子(收发器) 五.细节补充 5.1.Slave1.od文件的作用 一.前言 通过修 ...

  7. CANopen | 移植01 - STM32H743 + Canfestival的移植并让FDCAN1运行CANopen协议

    文章目录 一.前言 二.移植前的准备 三.移植 3.0.移植的目的 3.1.工程的实际硬盘上添加文件夹 3.2.往bsp文件夹放入bsp代码 3.3.往canfestival里放入源代码 3.4.往o ...

  8. STM32H743+CubeIDE-CanFestival实现两个CANopen Master同时独立运行

    文章目录 一. 前言 1.1 两路CANopen Master解决的问题 1.2CanFestival库移植 1.3 STM32H743 二. 两套对象字典 三. Master节点初始化 四. Can ...

  9. CANOpen定时器

    在CANOpen中,有部分和时间相关的子协议,比如pdo和lifegrd等,这就要求移植的时候实现定时器的底层接口. 在timer.h中给出了接口声明 /* 设置定时器重载值 */ void setT ...

最新文章

  1. 3分钟看完一篇论文,这个AI文本生成模型把今年NeurIPS 2300+篇总结了个遍
  2. Windows 10 太难用,如何定制你的 Ubuntu?
  3. oracle 截取字符串中指定位置_手撕虚拟内存(1)——字符串在虚拟内存中的段位置与/proc虚拟文件系统...
  4. 《系统集成项目管理工程师》必背100个知识点-54冲突解决方法
  5. 未来计算机会有多发达,人工智能到底有多强?未来人工智能会主宰世界?
  6. reactjs ref属性:字符串类型的ref和createRef
  7. 的union_C语言“隐秘的角落”——union没那么简单
  8. SQLLite (一)基本介绍
  9. Jquery 实现原理之 Ajax
  10. 【C/C++】递归算法
  11. Android 第四章 ListView 的使用
  12. 模板设计模式_C常用设计模式——模板方法模式
  13. 为激励女工程师推出的编程盛宴
  14. [fastjson] - fastjson中 JSONObject 和 JSONArray
  15. 安全的API接口解决方案
  16. 【mysql知识点总结】
  17. C#调用海康SDK播放视屏
  18. java给视频添加水印_javaCV视频添加水印
  19. freebsd协议栈学习
  20. 三套方案7日打造骨感美人

热门文章

  1. SCI论文投稿到接收的时间
  2. 国内邮箱免费邮箱注册哪个好?
  3. 用53款全免费软件重装Windows(xbeta译)
  4. Java——ZZULIOJ_1043: 最大值
  5. html判断是苹果,JavaScript判断是否是iPhone X系列机型,H5和其他环境兼容
  6. “老衲印象”开发团队章程
  7. 老博会|2023第九届北京国际老年用品展览会
  8. python图片压缩算法_使用K均值算法进行图片压缩
  9. 相干解调与非相干解调
  10. 怎样打开xp默认共享?