[CAN] CAN BUS的错误检测和错误状态管理
目录
错误检测
Bit error 位错误
Stuff error 填充错误
CRC error 校验错误
Form error 格式错误
ACK error
错误计数器
错误计数器的计数规则
CAN错误状态
主动错误状态
被动错误状态
离线状态
如何理解三种错误状态
错误状态迁移
如何理解错误状态机的迁移
2. 总线上有节点工作不正常,经常被发出有错误的数据
控制器局域网络(Controller Area Network, CAN)是当今汽车和工业自动化系统的重要标准。可靠性是CAN总线协议的核心优势之一,这使其成为安全关键应用的理想选择。但值得注意的是,错误处理对CAN的稳健性来说至关重要。
CAN总线错误的发生可能有多种原因,比如电缆故障、噪声、不匹配的终端电阻、CAN节点故障等。识别、分类和解决此类CAN错误是确保整个CAN系统持久性能的关键。错误处理可以识别和拒绝错误的信息,使发送者能够重新传输信息。此外,该过程有助于识别和断开持续传输错误信息的CAN节点。
CAN 总线的错误管理主要需要从三个方便进行分析
1. 错误检测机制
2. 错误计数机制
3. 错误状态
错误检测
CAN控制器可以通过收发器监测总线电平,并在接收、发送时对报文进行错误检测,控制器应提供以下错误检测机制。
- 总线监测(也就是通过收发器回环到RX PIN来监测总线电平)
- 位填充检查
- 帧格式检查
- CRC校验
- ACK检查
检查到错误有五种错误类型,它们并不相互排斥(也就是可以同时出现)。
- Bit error 位错误
- Stuff error 填充错误
- CRC error
- Form error
- ACK error
Bit error 位错误
在总线上发送比特的节点也应监视总线。 当监视的位值与发送的位值不同时,认为检测到位错误。
例外:
在仲裁期间发送隐性信息位时,显性位不应导致位错误,或者在 ACK 时隙期间发送了一个隐性位;
发送被动错误标志并检测到显性位的节点不应将此解释为位错误。
Stuff error 填充错误
在帧字段中连续六个相等位电平出现时,认为检测到填充错误,因为帧字段应通过位填充的方法进行编码。(超过5个相等电平就应该插入一个相反的电平)
CRC error 校验错误
CRC 序列应由发送器的 CRC 计算结果组成。 接收器应以与发送器相同的方式计算 CRC。 当计算出的 CRC 序列不等于接收到的序列时,应检测到 CRC 错误。
Form error 格式错误
当固定格式位字段包含一个或多个非法位时,应检测到格式错误。
例外:
接收器在 EOF 的最后一位监测显性位,或任何节点在错误定界符或过载定界符的最后一位监测显性位,不应将此解释为形式错误。
ACK error
每当发送器在 ACK 时隙期间没有监测到显性位时,它就会检测到一个 ACK 错误。
错误计数器
每个CAN控制器内部都有两个计数器,分别为接收错误计数器REC和发送错误计数器TEC。
两个计数器长度都为8bit,上电后为0,最大计数到255。
- Receive error counter(REC):接收错误计数器
- Transmit error counter(TEC):发送错误计数器
错误计数器的计数规则
当节点在发送或接收数据时,如果检测到错误,对应的错误计数器就会增加1或者8。
当成功接收或发送一帧数据,对应的计数器就减1。
错误计数器详细的更新规则如下:
错误计数器应根据以下规则进行更新(在给定的帧传输期间可以应用多个规则)。
a) 当接收器检测到错误时,接收错误计数器REC+ 1。例外:发送活动错误标志、过载标志期间的位错误。
b) 当接收器在发送错误标志后检测到显性位作为第一位时,接收错误计数器REC+8。
c) 当发送器发送错误标志时,发送错误计数器REC+8。
1) 例外 1:如果发送器是错误被动状态,并且由于未检测到显性 ACK 而检测到 ACK 错误,并且在发送其被动错误标志时未检测到显性位。
2) 例外 2:如果发送方因为仲裁期间发生填充错误而发送错误标志,因此,填充位应该是隐性的,并且已作为隐性发送但被监视为主导的。
在这两种例外情况下,传输错误计数器保持不变。
d) 如果发送器在发送活动错误标志或过载标志时检测到位错误,则发送错误计数器TEC+8。
e) 如果接收器在发送活动错误标志或过载标志时检测到位错误,则接收错误计数器TEC+8。
f) 在发送活动错误标志、被动错误标志或过载标志后,任何节点都应容忍最多7 个连续显性位。在检测到第14个连续显性位后(在活动错误标志或过载标志的情况下)或在被动错误标志后检测到第 8 个连续显性位之后,并且每当在出现额外的8个连续显性位序列之后,REC和TEC都需要+8。
g) 成功传输一个帧后(收到 ACK 并且没有检测到错误,直到 EOF 被检测到完成),传输错误计数器应减1,直到为0。
h) 成功接收一个帧后(接收到 ACK 时隙没有错误并且成功ACK 位的发送),接收错误计数器应减 1,如果它介于1和127。如果接收错误计数器为0,则应保持为零 (0),如果它大于127,则应将其设置为介于119和127。
CAN错误状态
CAN节点的错误状态机用于表明节点当前的错误状态。
错误状态由3种状态组成
- error-active:主动错误状态
- error-passive:被动错误状态
- bus-off:离线状态
不同的错误状态下,节点对错误产生后的处理机制是不同的,错误状态的命名其实也是按照当前状态下对错误的反应来命名的,而不是指示当前的节点错误。
主动错误状态
主动错误状态为节点的默认状态,在该状态下,如果节点在接收或发送数据时吗,检测到RX PIN从总线上接收到的报文有错误,那么节点可以发送错误帧(连续6个显性电平)。发送错误帧的目的有两个。第一是通知其他节点,总线上出现了错误。第二,破坏掉当前检测到有错误的这帧报文。防止错误报文被其他节点接收。
被动错误状态
错误被动状态的“被动”是相较错误主动状态而言,在错误被动状态下的节点,如果检测的总线错误,不能主动发送错误帧。但当前错误的数据不会被节点接收。
离线状态
当节点进入离线状态,不能再进行数据收发。
如何理解三种错误状态
简单来说,错误主动即使发现错误后主动打断这一帧错误并通知其他节点。这样的行为可以理解为当前节点认为自己状态很健康,发现错误有必要主动采取措施,保证整个总线的数据正常传输。
而错误被动的节点,可以认为是节点发现出错太多,这些错误很有可能是自身的原因产生的,对自身的状态产生怀疑,所以不再主动对总线上的错误采取措施(我自己知道错误就行了,不要再给总线上其他节点添乱)
而离线状态,则是节点发现错误过于频繁,并且很多错误是由自己发送产生的,此时需要将自己从总线上隔离出去,防止进一步影响其他节点通讯。
错误状态迁移
三种错误状态的迁移主要由两个错误计数器来完成。
当两个计数器其中一个超过127,节点就会进入错误被动,关闭错误帧的发送。
当发送错误计数器达到255时,节点直接进入离线状态,进行自我隔离
CAN错误状态机迁移图
如何理解错误状态机的迁移
当出现错误时,错误计数器进行累加,并且大部分比的错误,计数器都是直接加8。而正常收发一帧数据,计数器只会减1。这样的设计结合状态迁移的规则,是非常巧妙的,考虑如下几种场景。
1. 总线工作健康,只是由于短时间的干扰偶发一两个错误
所以如果只是偶发的几个错误导致错误计数器增加了一些值,在正常收发数据的节点,错误计数器都会很快会自减,不会超过127。所以节点会一直处于错误主动状态。
2. 总线上有节点工作不正常,经常被发出有错误的数据
如果错误帧/正常帧的比例超过1/8,那么错误计数器的值就会持续累加。如果节点状态短时间恢复正常,那么还可以继续工作。但是如果节点发生了永久性的故障,持续的发生错误,那么错误计数器持续增加超过127或者255,节点就会进入错误被动或者总线关闭状态
[CAN] CAN BUS的错误检测和错误状态管理相关推荐
- 基于长短读长和参考基因组的组装错误检测算法的研究
基于长短读长和参考基因组的组装错误检测算法的研究 论文目录 致谢 第1-6页 摘要 第6-7页 ABSTRACT 第7-8页 序言 第9-13页 1 引言 第13-26页 1.1 基因测序项目介绍 第 ...
- crc错误 modbus poll_Modbus通讯错误检测方法
标准的Modbus串行网络采用两种错误检测方法.奇偶校验对每个字符都可用,帧检测(LRC和CRC)应用于整个消息.它们都是在消息发送前由主设备产生的,从设备在接收过程中检测每个字符和整个消息帧. 用户 ...
- Modbus通讯错误检测方法
标准的Modbus串行网络采用两种错误检测方法.奇偶校验对每个字符都可用,帧检测(LRC和CRC)应用于整个消息.它们都是在消息发送前由主设备产生的,从设备在接收过程中检测每个字符和整个消息帧. 用户 ...
- MMC检测到此管理单元发生一个错误。建议关闭并重新启动MMC
MMC检测到此管理单元发生一个错误.建议关闭并重新启动MMC 要变通解决此问题, 请按照下列步骤操作进入 WMI MMC 管理单元: 1. 开始--运行--输入mmc然后单击 确定 . 2. 在 文件 ...
- 错误检测dP-bitstream-ei_flag runRestrictRef
JM86模型,对于错误检测,dP->bitstream->ei_flag在什么情况下置1? 还是无错的时候dP->bitstream->ei_flag=0,有错时dP-> ...
- 程序代码错误检测_错误检测代码
程序代码错误检测 错误检测代码 (Error Detecting Codes) A group of bits is known as words, and these words move as a ...
- c 提示错误expected) before ; token_NLP.TM[33] | 纠错:pycorrector的错误检测
纠错是NLP中的一个看着不是很火但非常重要的部分,来聊聊pycorrector是怎么做的. 导读:大家好,我是机智的叉烧,这是我NLP.TM系列下的第33篇文章(部分文章还未更新到知乎中,微信公众号下 ...
- pg库sharelock_PG数据库错误: 检测到ShareLock死锁处理
PostgreSQL 是一个免费数据库,对于处理分析型+交易型混合型系统来说确实很不错,特别是版本的升级到11.2后性能提升很多,很多运行机制跟oracle越来越接近,确实很强大,但是开源系统确实存在 ...
- 论文阅读——椭圆检测算法 2018 使用梯度分析利用错误检测控制的精确椭圆检测
本文是2018年<Pattern Recognition>期刊(2区SCI)上的一篇文章,是最新的椭圆检测,论文题目为<Accurate detection of ellipses ...
- 内存错误检测工具——kfence工作原理分析
一.功能介绍 Linux 5.13引入一个新的内存错误检测工具:KFENCE(Kernel Electric-Fence,内核电子栅栏).KFENCE是一个低开销的.基于采样的内存错误检测工具.KFE ...
最新文章
- C++ 笔记(25)— 理解 C++ 中的头文件和源文件的作用
- MyBatis使用动态代理报 invalid bound statement (not found) 错
- c++修复工具_几款平价又好用的U盘修复工具分享
- 【剑指offer】面试题53 - 1:在排序数组中查找数字 I(java)
- poj 无向图最小环问题 详解,模板
- UnsupportedOperationException:can‘t convert to dimension :typx=0x1
- android 辅助音量放大,为什么总是感觉手机音量太小?教你开启这个功能,声音瞬间放大一倍...
- 锁定计算机后 360wifi,电脑中360路由器WiFi密码忘记了的四种解决方法
- 品牌稿件怎么写?这些品牌稿件写作技巧值得一看
- Java se-画出坦克
- 函数的调用(传值调用和传址调用)
- arduino笔记22:Aeduino Mega2560
- Dubbo3.0系列(6)- Dubbo3.0支持的RPC协议
- 云南工程职业学院计算机网址,云南工程职业学院欢迎您(2020)
- 【跟随万一老师的足迹】查找目录下文件,在万一老师的基础上升级下,支持多文件查找 - 文件操作(一)
- 深入探讨CCD工业摄像机相关技术特性
- Flink的部署模式session 、pre job、aplication
- lisp 左手钢筋_CAD左手键与加载过程.docx
- 神经网络中梯度的概念,神经网络梯度公式推导
- 用Issue来管理项目!
热门文章
- win7我的计算机无法搜索,win7搜索功能无法正常使用的有效解决方法
- 笔记本电脑测试性能哪个软件好,新笔记本测试如何进行 旧笔记本测试性能【图文】...
- matlab评价模型和预测模型
- 雷电2接口_Steinberg 发布旗舰级 32 bit / 384 kHz 雷电 2 音频接口 AXR4
- Windows常用快捷键
- 建议收藏!4款良心的时间轴软件
- Mybatis-Plus条件构造器
- 台式计算机开关电源原理图,计算机开关电源基本结构及原理
- android状态栏半透明灰色,快速解决Android7.0下沉浸式状态栏变灰的问题
- ubuntu安装aircrack-ng/reaver/minidwep-gtk用来跑pin