CAN总线中节点ID相同会怎样?
CAN-bus网络中原则上不允许两个节点具有相同的ID段,但如果两个节点ID段相同会怎样呢?
实验前,我们首先要对CAN报文的结构组成、仲裁原理有清晰的认识。
一、CAN报文结构
目前使用最广泛的CAN-bus网络标准是V2.0版本,该标准又分为A、B两部分,它们主要的区别在仲裁区域的ID码长度。其中CAN2.0A(标准帧)为11位ID,CAN2.0B(扩展帧)为29位ID。下表1为CAN报文结构:
表1 CAN报文结构
二、仲裁原理
CAN总线的仲裁是基于“线与原理”,如图1所示。当个收发器同时发出不同电平信号时,隐性电平总是被显性电平覆盖。CAN控制器在发送报文的同时会监听总线状态与自己发送的电平是否一致,如果不一致发生在ID段则会发生仲裁,如果发生在其他区域则会触发相应错误。

图1 线“与”示意图
下面进入重点,如果两个节点ID段相同会怎样?我们用两个CAN卡 和一台CANScope开始实验,CAN卡模拟CAN标准节点收发报文,CANScope做通信监控,如图2所示。

图2 实验平台搭建
三、实验一“ID段相同但数据不同”
使用一个CAN卡发送ID为000H数据为01020304050607H的CAN帧,使用另一个CAN卡发送ID为000H数据为02020304050607H的CAN帧。CANScope监听的数据如图3所示,可以观察到有大量的数据场填充错误。

图3 数据场填充错误
为什么会这样呢?我们首先分别获取两个CAN卡发送报文对应的波形,如图4。因为两针报文同为标准数据帧,且每帧包含8个字节数据,所以两帧报文对应的波形在ID段、RTR、IDE、R0以及DLC段完全一致。因此,仲裁作用失效,两节点都认为自己获得了优先权,继续发送数据。

图4 报文对应波形对比
现在我们聚焦数据段,第一个字节数据相同,均为为00H;第二个字节数据不同,分别为01H、02H。图5箭头标示处可以看到两者对应位的逻辑分别为0和1。前面我们提到CAN节点在发送报文的同时会检测总线电平是否与自己发送的电平一致,若不一致发生在非仲裁区域则触发相应错误,因此若这两帧报文同时发送到总线上必将发生位发送错误。因为位发送错误会引起节点发送违反填充规则的6个显性位(主动错误破坏该帧数据),故出现数据场填充错误,如图3。

图5 数据场冲突
四、实验二“ID相同数据也相同”
同时使用两个CAN卡发送ID为000H数据为01020304050607H的CAN帧,CANScope做通信监控。首先,我们不勾选“总线应答”选项,使CANScope工作在仅监听模式。实验结果如图6所示,出现的是应答定界符格式错误。

图6 应答界定符格式错误
为什么会发生这种错误呢?发送报文的节点会在ACK段发送两个隐性位,若在第一个位期间接收到显性电平则认为该帧被正确接收。由于仲裁段相同时两节点都认为自己取得仲裁权,在ACK段等待应答,但该网络中仅存在两个节点,因此在ACK段不能收到应答,进而发生应答定界符错误。简单说来这种情形就类似于总线中只有一个节点将不能实现数据发送。图7是在ACK段有无应答时的波形对比。

图7 ACK应答
我们勾选上总线应答,再次开始实验(此时总线中相当于有3个节点)。这时如图8所示,总线数据收发正常。

图8 启动总线应答
总结:当两节点同时发送ID相同数据不同的报文时,将发生数据场填充错误;当两节点同时发送ID相同数据也相同的报文时,若有其他节点应答则不发生错误,若无其他节点应答则发生应答错误。因此,我们在设计CAN总线时应避免ID段相同的情况出现
CAN总线中节点ID相同会怎样?的更多相关文章
- 第三部分 关于HHibernate中关键字ID的配置
实体类映射中,必须配置一个关键字,对应着数据表的关键字,大多数的实体类也都有一个属性表示类的唯一性,在实体类配置文件(.hbm.xml)中,<id>元素的就是这个作用. 一个完整的ID配置 ...
- OTG中的ID脚风波释疑
1. 概要 OTG设备使用插头中的ID引脚来区分A/B Device,ID接地被称作为A-Device,充当USB Host,A-Device始终为总线提供电力,ID悬空被称作为B-Device,充当 ...
- IPNS节点ID
IPNS节点ID访问网站: 当我们修改网站内容重新添加到ipfs时,hash会发生变化,当我们网站更新时,我们可以将网站发布到IPNS,在IPNS中,允许我们节点的域名空间中引用一个IPFS ...
- vue_elementUI_ tree树形控件 获取选中的父节点ID
el-tree 的 this.$refs.tree.getCheckedKeys() 只可以获取选中的id 无法获取选中的父节点ID想要获取选中父节点的id;需要如下操作1. 找到工程下的node_m ...
- 分布式系统中 Unique ID 的生成方法
http://darktea.github.io/notes/2013/12/08/Unique-ID Snowflake 生成的 unique ID 的组成 (由高位到低位): 41 bits: T ...
- ELementUI 树形控件tree 获取子节点同时获取半选择状态的父节点ID
使用element-ui tree树形控件的时候,在选择一个子节点后,使用getCheckedKeys 后,发现只能返回子节点的ID,但是其父节点ID没有返回. 解决办法有三种: 1.element ...
- xpath的数据和节点类型以及XPath中节点匹配的基本方法
XPath数据类型 XPath可分为四种数据类型: 节点集(node-set) 节点集是通过路径匹配返回的符合条件的一组节点的集合.其它类型的数据不能转换为节点集. 布尔值(boolean) ...
- 分布式系统中Unique ID 的生成方法
http://darktea.github.io/notes/2013/12/08/Unique-ID 本文主要介绍在一个分布式系统中, 怎么样生成全局唯一的 ID 一, 问题描述 在分布式系统存在多 ...
- CAN总线多节点通信异常分析及解决
一.CAN物理层特征 CAN收发器的作用是负责逻辑电平和信号电平之间的转换.即从CAN控制芯片输出逻辑电平到CAN收发器,然后经过CAN收发器内部转换将逻辑电平转换为差分信号输出到CAN总线上,CAN ...
随机推荐
- Visual Studio2017 数据库架构比较
一.前言 开发的时候在测试服务器上和线网服务器上面都有我们的数据库,当我们在线网上面修改或者新增一些字段后,线网的数据库也需要更新,这个时候根据表的修改记录,然后在线网上面一个一个增加修改很浪费效率而 ...
- 从Stampery到Chronicled,区块链公证业务的实践
Stampery就是这样一家利用比特币区块链技术代替公证人的创业公司,能为所有的敏感文件提供具有法律约束力的证明.可以用Stampery证明任何文件,它能很好地保护知识产权,证明遗嘱.宣誓.合同.家庭 ...
- Centos 6.9下部署Oracle 11G数据库环境的操作记录
操作系统:Centos6.9(64Bit)Oracle:11g .11.2.0.4.0版本Ip地址:172.16.220.139 废话不多说了,下面记录安装过程:1)安装桌面环境 [root@vm01 ...
- mysql操作命令梳理(4)-中文乱码问题
在平时的mysql运维操作中,经常会碰到插入中文字段后出现乱码的情况,产生中文乱码的原因一般有:1)mysql的编码格式不对,是latin1编码.强烈推荐将mysql下的编码格式都改为utf8,因为它 ...
- Nginx 负载均衡的Cache缓存批量清理的操作记录
1)nginx.conf配置 [root@inner-lb01 ~]# cat /data/nginx/conf/nginx.conf user www; worker_processes 8; #e ...
- 最小生成树模板题POJ - 1287-prim+kruskal
POJ - 1287超级模板题 大概意思就是点的编号从1到N,会给你m条边,可能两个点之间有多条边这种情况,求最小生成树总长度? 这题就不解释了,总结就算,prim是类似dijkstra,从第一个点出 ...
- 个人博客-week7
团队任务收获及个人感想 团队任务已经进行了一个多月的时间,我很荣幸能和软剑攻城队的小伙伴们度过这一个月的开发时光.在这一个月的时间里,我亲身经历了一个软件从想法到实现,从创意到实体的过程.同时我也在和 ...
- <<架构漫谈>>读后感
今天按照老师的要求,看了架构漫谈1--9讲,觉得受益良多,以下是我得点点读后感: (一)什么是架构? 架构的英文是Architecture,从定义上看,架构好像是一个过程,也不是很清晰.下面从架构的缘 ...
- 小学四则运算APP 第二个冲刺 第一天
团队成员:陈淑筠.杨家安.陈曦 团队选题:小学四则运算APP 第二次冲刺阶段时间:11.29~12.09 本次发布的是已完成的功能二(选择题): ChoiceActivity.java: packag ...
- 链表数据结构(C/C++语言实现)
注意:没有使用malloc和free:加了一个头文件,用于清屏和暂停:还有就是一个错误特别容易被忽略,那就是主函数中声明了LinkList p,然后就直接创建链表,忘了给p分配空间.一定要先初始化链表 ...