关闭

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

714人阅读 评论(0) 收藏 举报
分类:

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

任何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错误的只有接收节点。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:140250次
    • 积分:2474
    • 等级:
    • 排名:第15591名
    • 原创:103篇
    • 转载:80篇
    • 译文:0篇
    • 评论:8条
    最新评论