《揭秘CAN-bus不被人关注的重要知识点》(1)

转载 2013年12月02日 15:44:27

一、错误主动、错误被动、总线关闭

任何CAN书籍对CAN控制器的三个状态有详细描述,某个CAN控制器的错误计数器小于128时,为错误主动。大于等于128但小于255时,为错误被动。等于255时为总线关闭。但没有告诉读者到底为什么这样设,设了有什么用。所以我这边写清楚。

1.设置三种错误状态的初衷就是“剔除不正常节点”,但为什么要剔除呢。比如一个网络里面有10个节点,其中9个都是250K波特率,其中有一个“奇葩”是254K,当然造成这个偏差的原因有很多。所以正常节点在通讯过程中,它就在“捣乱”——因为他自己监测到错误、不断发错误帧,导致其他节点无法正常通讯。所以CAN-bus规范中规定了,谁首先发错误帧,谁的错误计数器就+8,而其他响应叠加错误帧的,就+1。所以波特率不正常的节点先“挂掉”——总线关闭。这样保证其他节点能正常通讯。

2.关于错误帧,是有2种——显性、隐性。一个节点处于错误主动状态,发的错误帧是显性的,而如果处于错误被动状态,发的错误帧是隐性的。所以就会导致一个很有意思的现象:一个节点如果在错误主动状态下,收到帧发现不对(比如CRC校验不对),就会发显性错误帧,这时所有节点都会收到这个通知(局部错误全局通知),即使收正确的节点也要把这帧废掉。而发送节点必须重新发送这一帧。所以这个发错误帧的节点是肯定要收正确了,才肯罢休。当然代价就是这个主动发错误帧的接收错误计数器+8,而其他节点都是+1。

3.如果这个节点连续16次都没成功接收,它的错误计数器就到128了,进入错误被动。这时它就惨了。他发的错误帧全部变成隐性。其他节点无法进行获知(不是没有错误,只是错误只有它自己知道了),所以这时,发送节点就不会为它而重发了。它很有可能收不到这帧数据。已经从总线上面“半剔除”了。大家在实际应用过程中,如果遇到大部分节点都能收到,而某一个或者某几个收不到的现象,很有可能是这几个点进入错误被动了。

4.这时候,就很悲催了,错误被动的节点如果继续收错,错误计数器还是+8,而其他节点由于正常接收,错误计数器-1。慢慢地这个错误被动节点就挂掉了,进入总线关闭。因为所有其他节点都跑得“很欢”。这个节点想等连续128个11位隐性电平来恢复,实在是很难。所以要人工去重启一下。

5.大家理解前面4点后,就可以理解为什么我们写程序要去干预错误计数器了,想想如果在汽车中,一个节点如果被偶然干扰后收不到数据,甚至总线关闭,而不能自动恢复,是多么危险的事情。所以在错误计数器达到128时,就应该进行自恢复清空错误计数器。为了避免确实有故障的节点不断恢复,每个应用场合是不同的恢复策略。比如长安汽车中,会先进行10次间隔50毫秒的恢复,如果超过10次,就把这个恢复时间加大到1秒。

6.发送错误计数器和接收错误计数器。前面所说的通常是指接收错误计数器。而发送错误计数器则有一个很重要的规则:如果发送后无应答或者发送仲裁错误,错误计数器不会超过128。这点就保证了发送节点不会“无妄而死”。需要澄清的是,无论发送错误计数器是多少,只要没有总线关闭,发送节点都会在不断重发,只是错误主动下,重发速度快(前面帧结束后3个位),而错误被动状态下,重发速度慢(前面帧结束后11个位)。所以错误被动的节点发得很慢,失去了参与仲裁的平等权利。

7.关于错误类型,可以总结如下:

发生位错误,格式错误(比如CRC多一个位之类),ACK错误的只有发送节点

发生填充错误,格式错误,CRC错误的只有接收节点。

struts2重要知识点总结(1):

struts2最近又看了一边,每看一次都有一次的收获,这里总结struts2中的一些重要的知识点: action介绍: 1:action类代表着一次请求或者调用,每个请求的...

【PhoneGAP学习】Android PhoneGap框架(1)--重要知识点的预先学习(XHR)

PhoneGap推出了好几年了,网络上有不计其数的优秀说明文档和心得,通过学习他们的文章,了解PhoneGap的框架。 话说PhoneGap虽然已经改名换姓成cordova ,但是因由原来的名字被熟...
  • lq83623
  • lq83623
  • 2014年07月16日 23:49
  • 644

Android开发网上的一些重要知识点【1】

1. android单实例运行方法 我们都知道Android平台没有任务管理器,而内部App维护者一个Activity history stack来实现窗口显示和销毁,对于常规从快捷方式运行来看都是...

android中的重要java知识点回顾1(枚举、反射、类加载器等)

------- android培训、java培训、期待与您交流! ---------- 第1节 课程价值与目标介绍 基础知识非常重要,基础知识的深入程度决定了你能力 学习能力很重要,在未来的工作生活中...

Android开发网上的一些重要知识点(1)

1. android单实例运行方法我们都知道Android平台没有任务管理器,而内部App维护者一个Activity history stack来实现窗口显示和销毁,对于常规从快捷方式运行来看都是st...
  • god2030
  • god2030
  • 2016年04月13日 09:44
  • 467

案例分析重要的知识点总结

  • 2017年12月07日 13:50
  • 65KB
  • 下载

C语言最重要的知识点复习

  • 2011年12月06日 18:41
  • 82KB
  • 下载

CAN BusOff相关知识点

郑重声明:本文是根据电子技术论坛中汽车电子板块版主5525的帖子整理得来。 1、什么是CAN Bus Off     举例:     车上一个ECU 1, 一直向总线上发送消息,可怎么都发送不出去。 ...

C语言最重要的知识点复习资料

  • 2012年10月07日 14:25
  • 40KB
  • 下载

网络安全的重要知识点

  • 2014年07月04日 10:07
  • 92KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《揭秘CAN-bus不被人关注的重要知识点》(1)
举报原因:
原因补充:

(最多只允许输入30个字)