CAN总线几种正常的“异常”波形

[复制链接]

   
 
电梯直达

楼主

 
 hubaba 发表于 2016-3-28 14:00 | 只看该作者 
摘要

工程师们通常使用示波器观察CAN总线的信号质量,一般主要关注CAN总线差分信号的幅值、最小位宽、边沿情况等。相信不少工程师都看到过一条报文数据的波形上高高低低存在多个幅值,心里可能会变得忐忑不安,幅值不统一是不是波形出现畸变了呢?其实并非如此,今天就把CAN总线上的幅值“异常”归归类。

一、CAN-bus信号产生原理
众所周知,一个标准CAN节点由微处理器、控制器、收发器构成。多个节点成总线型架构挂在一起,两个端节点上并有终端电阻。其结构简图如下图所示。

图1 CAN-bus节点网络结构
可以看出,与总线直接相连的是CAN节点的收发器,起内部电路等效如下图所示,CAN-H、CAN-L直接由三极管驱动,近似可以看成电流型输出。结合上文所述网络架构中的终端电阻,节点发出信号时电流流过终端电阻产生电压信号,当同一时间多个节点同时发出信号时就会使总线上的电流高于单一节点发出的电流,使得我们观察电压信号时出现突增的现象。

图2 CAN收发器结构
CAN-bus是总线型结构,通常状态下一般只有一个节点占有总线。那么有几种情况会导致多个节点同时发出,进而导致幅值出现“异常”呢,下文通过致远电子CANScope分析仪的几个测试案例总结一下。
二、应答位上的幅值“异常”
最常见的,当CAN网络上存在3个以上的节点时,应答位上的幅值要明显高于同一报文的其他位置,如下图所示。可以看到报文在ID段、数据段、CRC校验段处的幅值均比较一致,但是到应答位处时幅值出现突增。这是为什么呢,大家都知道CAN-bus总线拥有自动应答机制,即当某一节点发送完一帧报文时,所有总线中的其余非只听节点均会在应答位处做出响应,如果报文被成功识别则发出一个显性位做为应答信号。
结合上文所述,应答位此时CAN总线上的电流是若干节点电流叠加的综合,所以应答位的幅值高就很容易讲通了。

图3 应答位上的幅值“异常”
三、ID段上的幅值“异常”
CAN-bus总线的一大特点就是多主结构,即网络中所有节点功能对等,没有主从机的概念,所有节点均可自由收发数据。保证多主结构得以实现的关键在于CAN总线的仲裁机制也称优先级机制。当网络中同时有多个节点同时发送数据时会在ID段处产生仲裁,优先级高的节点会最终占有总线。
如下图所示,可以看到在图中的标记处波形出现了“台阶”。正是由于在“台阶”出现前有两个节点同时发出数据,导致幅值增高,在“台阶”处某一节点由于优先级高占有总线,另一个节点暂时退出,使得幅值又回归平常。

图4 ID段上的幅值异常
四、错误帧上的幅值“异常”
再看看这个案例,可以看到在波形的后半部分也出现了台阶式的幅值增高,光标卡住的显性电平区间可以看到宽度明显超过了5个标准位宽,按照CAN总线的位填充规则(不能存在连续六个相同的显性位或隐性位)表明这是一条错误帧。但是不要误会,并不是因为这个幅值“异常”而导致的错误帧,我们知道CAN总线有错误重发机制,以保证总线传输数据的可靠性。这种可靠性正式通过错误帧的“一票否决制”实现的。
当网络中某一节点识别到一条认为是有问题的报文后会发送六个连续的显性位(即错误帧),投出这一否决票通知网络上所有其他节点,本条报文无效。此后其他节点会以“跟票”的形式全部发出六个显性位错误帧。所以此时多个节点重叠部分的错误帧的幅值就会高一些了。

图5 错误帧上的幅值异常

CAN总线几种正常的“异常”波形的更多相关文章

  1. java 常见的几种运行时异常RuntimeException

    常见的几种如下:   NullPointerException - 空指针引用异常ClassCastException - 类型强制转换异常.IllegalArgumentException - 传递 ...

  2. 5种处理Vue异常的方法

    原文: Handling Errors in Vue.js 译者: Fundebug 本文采用意译,版权归原作者所有 去年一整年,我都在使用最爱的-Vue.js- 来做项目.最近突然意识到,我竟然从来 ...

  3. 2019.12.11 java程序中几种常见的异常以及出现此异常的原因

    1.java.lang.NullpointerException(空指针异常) 原因:这个异常经常遇到,异常的原因是程序中有空指针,即程序中调用了未经初始化的对象或者是不存在的对象. 经常出现在创建对 ...

  4. selenium三种断言以及异常类型

    elenium提供了三种模式的断言:assert .verify.waitfor 1)Assert(断言) 失败时,该测试将终止. 2)Verify(验证) 失败时,该测试将继续执行,并将错误记入日志 ...

  5. 【刷题】java 常见的几种运行时异常RuntimeException

    常见的几种罗列如下: -NullPointerException - 空指针引用异常 ClassCastException - 类型强制转换异常. IllegalArgumentException - ...

  6. selenium 三种断言以及异常类型

    selenium 提供了三种模式的断言:assert .verify.waitfor Assert 失败时,该测试将终止. Verify 失败时,该测试将继续执行,并将错误记入日显示屏 .也就是说允许 ...

  7. java中最常见的几种运行时异常,你get了吗?

    NullPointerException (空指针异常) ClassCastException (类型强制转换异常) NumberFormatException (数字格式异常) NegativeAr ...

  8. C++ Primer笔记2_四种类型转换_异常机制

    1.类型转换 命名的强制类型转换: 有static_cast.dynamic_cast.const_cast.reinterpret_cast static_cast: 编译器隐式运行的不论什么类型转 ...

  9. 网易云课堂_C++程序设计入门(下)_第9单元:白公曾咏牡丹芳,一种鲜妍独“异常”_第9单元 - 作业5:OJ编程 - 使用异常进行图形类的错误处理

    第9单元 - 作业5:OJ编程 - 使用异常进行图形类的错误处理 查看帮助 返回   温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前 ...

随机推荐

  1. js-ES6学习笔记-数组的扩展

    1.Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括ES6新增的数据结构Set和Map). 实际应用中 ...

  2. 【代码笔记】iOS-NSSearchPathForDirectoriesInDomainsDemo

    一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, ...

  3. 关于Mysql数据库的知识总结

    2017年6月8日,天气阴.心情晴. 连续做梦两个晚上了,昨晚竟然梦见一个很长时间不联系的初中同学了,早上上班的路上聊了聊.女孩现在出差在贵州,风景秀美的地方.我说“你现在生活很滋润”.女孩说“那是你 ...

  4. kafka-hadoop-consumer

    写了一个工具,从kafka传输数据到hdfs,采用的api,可以消费指定的kafka topic 或者为了简便可以消费所有的topic中各个partition的数据. 地址:https://githu ...

  5. CentOS7+ApacheServer2.4+MariaDB10.0+PHP7.0+禅道项目管理软件8.0环境部署

    CentOS7+ApacheServer2.4+MariaDB10.0+PHP7.0+禅道项目管理软件8.0环境部署 by:授客 QQ:1033553122 目录 一. 二. 三. 四. 五. 六. ...

  6. Node.js+Ajax实现物流小工具

    半年过去了,好像什么也没干,好像什么也干了. 最近在网易云课堂上看到了这个课程,觉得很有意思,就跟着课程做了一遍,课程地址:http://study.163.com/course/courseMain ...

  7. PHP剔除删除掉危险字符

    本文出至:新太潮流网络博客 /** * [剔除掉危险字符] * @E-mial wuliqiang_aa@163.com * @TIME 2017-04-07 * @WEB http://blog.i ...

  8. Oracle EBS 自治事务

    自治事务程序主要是自主性,那就是,独立于主要的事务.之所以独立,或者提交之后会影响其他事务处理,本质在于它本身符合编译指令的规则,也就是说它属于在编译阶段就执行的指令,而不是在运行阶段执行的. 当自治 ...

  9. 光杆mdf文件的导入

    场景,准备学习SSAS的时候,按照教程在微软下载了示例数据库AdventureWorksDW2012,下载来才发现只有一个mdf文件. 正好今天群里有位兄弟也碰到差不多的问题,客户数据库里的ldf文件 ...

  10. oracle 使用绑定变量极大的提升性能

    初始化操作 SQL> alter system flush shared_pool; SQL> set timing on; 1. 未使用绑定变量的时候代码如下 declare type ...