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学习笔记-module(4)

    1.<script>标签打开defer或async属性,脚本就会异步加载.渲染引擎遇到这一行命令,就会开始下载外部脚本,但不会等它下载和执行,而是直接执行后面的命令. defer与asyn ...

  2. vue Element-UI 分页使用(1)

    最近在使用Element-UI这套框架配合Vue来写前端页面.在用Element-UI来制作表格的时候,遇到了一些小问题,记录方便学习. 其中两个事件是关于切换当前页和切换显示的列表条数的.另外的属性 ...

  3. structs2.8创建拦截器

    控制层 public class PrintUsername { private String username; public String getUsername() { return usern ...

  4. SQLServer 学习笔记之超详细基础SQL语句 Part 8

    Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 7------------------- --触发器str_trigge ...

  5. Cobalt Strike 学习

    前言 本文以一个模拟的域环境为例对 Cobalt Strike 的使用实践一波. 环境拓扑图如下: 攻击者(kali) 位于 192.168.245.0/24 网段,域环境位于 192.168.31. ...

  6. Unity Profiler GPU Usage(GPU使用情况)

    一般情况下性能瓶颈都在CPU上,这儿也列举下几个常见的GPU耗时函数吧. 1 Render.Mesh 绘制网格面(没批处理的面) 2 Batch.DrawStatic 静态批处理 3 Batch.Dr ...

  7. 从零自学Java-6.使用循环重复执行操作

    1.使用for循环: 2.使用while循环: 3.使用do-while循环: 4.提早退出循环(break,continue): 5.为循环命名. 程序Nines:显示1-200的整数与9的乘积 p ...

  8. python 流程控制(条件语句)

    1,python流程控制单条件基本语句 2,python流程流程多条件控制语句 3,三元运算 1,python流程控制单条件基本语句 if 判断条件: 执行语句…… else: 执行语句…… 判断条件 ...

  9. Oracle EBS INV 释放保留

    CREATE or REPPLACE PROCEDURE RelieveReservation AS -- Common Declarations l_api_version NUMBER := 1. ...

  10. SQL Server数据库中外键强制约束的好处是什么,什么时候设置外键非强制约束?(转载)

    Sql Server: What is the benefit of using “Enforce foreign key constraint” when it's set to “NO”? 问 I ...