【转】CAN总线与CANOPEN协议入门
1. 什么是CAN总线协议
CAN总线协议最早是为了统一汽车车载设备间通信的标准而开发的协议,后来由于其高速、稳定、可靠的特点,已经被ISO标准化并广泛应用于工控、医疗等领域,目前依然是欧洲汽车网络的标准协议。
CAN总线协议规定了ISO七层通信协议模型的物理层和数据链路层。其具体实现都已经被固化到CAN总线控制芯片中,无需软件实现。
2. CAN总线的传输速率和传输距离
理论上,一条CAN总线上可以连接无数个CAN设备,但实际上受到其他条件限制,数量总是有限的。例如,使用了更上层的CANOPEN协议,则一条总线上只能有128个设备。
3. CAN总线协议的特点和要求
- CAN总线网络属于广播网络,同一条总线的设备都可以发送和接受数据。同一时刻只能有一个设备作为发送设备,其他设备只能为接收设备。
- 同一条总线上的设备必须工作在同一速率下。
- 当两个设备同时发送数据时,根据其CAN通信帧(CAN通信的最小信息单元,详情见下文)的ID号进行仲裁,ID号小的优先级高,将获得发送权,优先级低的则需要放弃发送,转为接收状态。
- CAN设备可以检测总线上的错误类型是暂时性的还是持续性的,如果是持续性的,出错的设备会不停的向总线发送错误帧,一段时间后将自动脱离总线。
- can总线的终端电阻的选择很重要,选择的不好会影响通信质量。
4. CAN总线的通信帧
CAN总线所使用的最基本通信单元称为帧,CAN总线协议规定了数据帧、遥控帧(也有称为远程帧的)、错误帧、过载帧和间隔帧。以下仅详细分析数据帧的帧格式,其他均只描述功能,不详细描述格式。
有些文档喜欢用显性电平和隐性电平来描述帧格式,这里说明一下,显性电平可以理解为逻辑1,隐性电平可以理解为逻辑0。
4.1 数据帧
起始段 | 仲裁段 | 控制段 | 数据段 | CRC段 | ACK段 | 帧结束 | |
---|---|---|---|---|---|---|---|
bit | 1 | 12 | 6 | 0-64 | 16 | 2 | 7 |
控制段:前2bit规定为0,后4bit为数据段的BYTE长度
CRC段、ACK段、帧结束对于软件工程师来说可以不关注,比较重要的是理解仲裁段、控制段和数据段的含义。
4.2 遥控帧
遥控帧的作用是向其他单元请求数据。比如设备A希望设备B向自己发送数据,设备A就向总线发送一个带有设备B的帧ID的遥控帧,设备B就会将数据发送的总线上。这里再次说明,CAN总线协议是广播的。
遥控帧的帧格式不具体列出,需要说明的是遥控帧也包含帧ID,当遥控帧与数据帧同时要发送时,也要根据ID的优先级仲裁,如果ID相同则数据帧具有更高优先级。
4.3 错误帧
错误帧分为主动错误帧和被动错误帧两类。解释其不同要了解CAN总线的错误处理机制,但是其错误处理机制过于复杂,这里描写一个简化版。
4.4 过载帧和间隔帧
这两种帧研究的比较少,间隔帧好像是为了解决冲突,由于实践中不太关注,所以待研究。
5 什么是CANOPEN协议
6 CANOPEN数据字典
CANOPEN网络中的每一个从站设备都要有一个数据字典,其实数据字典这个翻译不太准确,应该叫做“命令ID与功能对照表”。比如网络中有一个信号灯设备,则这个设备就可能有这样一个数据字典。
index | subIndex | data | 功能 |
---|---|---|---|
0x400 | 0 | 0 | 开灯 |
0 | 1 | 关灯 |
其中index我们可以理解为“命令ID”,subIndex可以理解为“子ID”。
接下来的问题是如何向一个设备发送命令ID呢?对此,CANOPEN协议也有规定,在下文中会进行介绍。
7 设备ID与常用通信对象
那么为什么是127个呢,为了解释这个问题,要先了解CANOPEN协议规定的通信对象。
上文说过,CAN总线协议的数据帧包含一个仲裁段,其前11位是帧ID。CANOPEN协议进一步把帧ID分为FunctionCode和Node-ID两部分,如下:
function Code | Node-ID |
---|---|
4 | 7 |
由于Node-ID只有7位,最大值为127,所以CANOPEN协议的总线上最多有127个从站设备。functionCode和Node-ID在一起又被称为COB-ID。
DATA与数据帧的数据段长度相同,至于有何用途,不同对象有不同要求。
functionCode | Node-ID | DLC | DATA |
---|---|---|---|
4bit | 7bit | 4bit | 8*8bit |
可见,CANOPEN协议的通信对象就是数据帧,只是进一步规定了数据帧的内容格式,所以说CANOPEN协议是基于CAN总线协议的应用层协议。
8 PDO对象
8.1 PDO对象概述
PDO对象的DATA部分可以完全用来传输数据,没有进步做要求。
根据上文知道,CAN总线本质上是广播的,对于B站来说,它面临三个问题(假设B站是主站):
对象 | functionCode | Node-ID | COB-ID |
---|---|---|---|
NMT(Model Control) | 0x0 | 0x0 | 0x0 |
SYNC | 0x1 | 0x0 | 0x80 |
TIME STAMP | 0x2 | 0x0 | 0x100 |
EMERGENCY | 0x1 | 0x1-0x7F | 0x81-0xFF |
PDO | 0x3-0xA | 0x1-0x7F | 0x181-0x57F |
SDO | 0xB-0xC | 0x1-0x7F | 0x581-0x67F |
NMT(ERROR) | 0xD | 0x1-0x7F | 0x701-0x77F |
对于问题2和问题3,我们先假设A站的Node-ID为1,并且需要进一步引入TPDO和RPDO的概念才能解决。
对象 | functionCode | Node-ID | COB-ID |
---|---|---|---|
TPDO1 | 0x3 | 0x1 | 0x181 |
RPDO1 | 0x4 | 0x1 | 0x201 |
TPDO2 | 0x5 | 0x1 | 0x281 |
RPDO2 | 0x6 | 0x1 | 0x301 |
TPDO3 | 0x7 | 0x1 | 0x381 |
RPDO3 | 0x8 | 0x1 | 0x401 |
TPDO4 | 0x9 | 0x1 | 0x481 |
RPDO4 | 0xA | 0x1 | 0x501 |
对于问题3,答案是B站(主站)发送属于A站的RPDO。A站检查到总线上有自己的RPDO就知道数据是发送给自己的。
8.2 PDO对象的引申问题
上一节讲了“主-从”站间PDO对象的通信原理。不过有一个大前提就是我们遵循了《建议》,这就引申出如下两个问题:
9 SDO对象
- SDO对象也分为TSDO和RSDO两种。(遵循《建议》)
- SDO对象是用来操作从站设备的数据字典的。
- SDO对象是一个有应答的通信对象,即主站发送RSDO给从站后,从站如果接收到,必须发送TSDO给主站进行应答。
- SDO对象对DATA段进行了进一步的规定和划分。
functionCode | Node-ID | DLC | ControlCode | Index | SubIndex | data |
---|---|---|---|---|---|---|
4bit | 7bit | 4bit | 8bit | 16bit | 8bit | 32bit |
其中ControlCode、Index、SubIndex和data就是DATA部分,SDO对象对此进行了细分规定。Index,SubIndex和data的含义,可以参考前文数据字典部分的信号灯的例子。
【转】CAN总线与CANOPEN协议入门相关推荐
- CAN总线与CANOPEN协议入门
1. 什么是CAN总线协议 CAN总线协议最早是为了统一汽车车载设备间通信的标准而开发的协议,后来由于其高速.稳定.可靠的特点,已经被ISO标准化并广泛应用于工控.医疗等领域,目前依然是欧洲汽车网络的 ...
- 嵌入式CANopen协议从入门到落地产品(更新2021.9.8)
一.前言 我写CANopen系列博文的初衷是分享如何使用STM32单片机开发一款CANopen产品,所谓实战为主,理论为辅.只看CANopen协议的理论是很枯燥,而且根本看不会.我认为掌握CANope ...
- 【CANopen】CAN总线的高级协议详解
目录 简介 CAL(CAN Application layer) CANopen CANopen对象字典(CANopen Object Dictionary) CANopen communicatio ...
- CANopen总线的高级协议详解
目录 简介 CAL(CAN Application layer) CANopen CANopen对象字典(CANopen Object Dictionary) CANopen communicatio ...
- CANopen协议及应用
文章目录 CANopen协议 CAN总线 CAN报文 CANopen概述 对象字典(Object Dictionary) 概述 通讯对象子协议区 制造商特定子协议 CANopen报文 NMT网络管理 ...
- CANopen协议中文文档
CANopen 协议下载(https://github.com/CANopenNode/CANopenNode) CANopenNode CANopenNode是免费和开源的CANopen协议栈. C ...
- 1、Canopen 轻松入门
Canopen 轻松入门--笔记 1.Canopen在ISO层级中的位置 2.CANopen 的预定义报文 ID 分类 2.1 网络管理(NMT)与特殊协议(Special protocols)报文 ...
- CANopen | 移植01 - STM32H743 + Canfestival的移植并让FDCAN1运行CANopen协议
文章目录 一.前言 二.移植前的准备 三.移植 3.0.移植的目的 3.1.工程的实际硬盘上添加文件夹 3.2.往bsp文件夹放入bsp代码 3.3.往canfestival里放入源代码 3.4.往o ...
- CANOpen协议详解(一):CANfestival源码分析
CANFestival-3源码详解一:重要结构体 有几点需要说明: 1.使用的是官网下载的canfestival-3源代码,下载的压缩包文件名是:Mongo-canfestival-3-asc-1a2 ...
最新文章
- pip install robot framework出现字符集编码错误
- android+apk+修改+签名文件位置,Jenkins打包android应用时自动签名apk详解
- Vue -- element-ui el-table 的合计在第一行显示并可点击
- ML 自学者周刊:第 4 期
- Java字符串简化_关于java查询语句 如何简化的问题
- python基础===PEP网站,代码规范指南
- [vue] 在vue中使用this应该注意哪些问题?
- Tomcat系列(6)——Tomcat处理一个HTTP请求的过程
- (09)Vivado IO约束
- php在线解密mcrypt,PHP 基于 Mcrypt 的加密解密简单类
- 软件测试人员电脑需要安装的基础工具
- CentOS下安裝iRedMail
- CC2530 Hex文件解析
- 蝴蝶效应、青蛙现象、鳄鱼法则
- vue使用three.js加载.FBX模型文件
- 中年妇女xxx_2019年国际妇女节庆祝活动
- Star Trek强势来袭 开启元宇宙虚拟与现实的梦幻联动
- 浏览器f12, ::before ::after是什么意思?
- 宏碁星锐4750的安装驱动步骤
- 2020年蓝桥杯暑假第1次练习赛(C++组)