CAN总线的远程、错误帧的作用!
CAN 远程帧是一个空数据场的帧, 关键是在它的ID场和远程帧标志位,当远程帧标志位为1时他就是远程帧,数据场必须为空,被请求节点通过ID场的辨识来响应,发送被请求的帧到总线上,具体举例,我随便举一个,BCM需要知道车门的状态,一个远程帧过去,车门把自己的状态发回来
---------------------------------------------------------------------------------------------------------------------------------------
错误帧分为主动错误帧和被动错误帧
主动错误帧是6-12个显性位(主动错误标志)+8个隐性位(错误界定符)
被动错误帧是6个隐性(被动错误标志,可被其他节点显性位覆盖)+8个隐性位(错误界定符)
错误帧的工作原理:是打破CAN的位填充规则,从而导致接收数据的节点产生错误。
节点的错误模式:
主动错误模式:是可以正常收发数据的模式(收发错误计数器均小于128),可以发送主动错误帧
被动错误模式:是节点本身受干扰或错误比较多时的工作模式(收或发错误计数器大于127,小于256),该模式下节点只能发送被动错误帧,其实就是不允许它阻塞别的正常节点的通讯
总线关闭模式:节点错误很多时进入的模式(收或发错误计数器等于256),收发都被禁止。
三种模式由收/发错误计数器的值自动进行管理
----------------------------------------------------------------------------------------------------------------------------------------
主动报错"和"被动报错",
1.主动报错站点:只要检查到错误,它立即"主动地"发出错标识.
所谓"出错标识",它本身就是一个"错误的位序列"(连续的6个显性位,不满足
CAN协议的"最多5个连续的同性位"要求),目的是"主动地"告诉大家:即使你们
没有发现"刚才我已发现"的错误,现在我"以身作则"出错啦!你们该看到这个
错误了吧!
2.被动报错站点:如果检查到错误,它只能干瞪眼"被动地"等别人(主动报错站
点)报错,等待的时候它可不能去动总线,直到识别出由主动报错站点发出
的"错误的位序列",它才松了一口气:有人正式报错了!然后他就可以去竞争
总线,该干啥干啥
3.出错标识本身没有什么优先级的问题.
4.对于通过竞争得到总线使用权的发送站点来说,它在一边发一边听,有可能
(a).它自己就发现错误,它就干脆哗啦哗啦,乱发一气(连续的发六个同性位).
就象你小时候在幼儿园练习写字,写错一个笔画你自己就不耐烦了,在纸
上哗啦哗啦,乱画一气.目的就是告诉别人(别的站点),出错了!
(b).它自己没有发现错误,但作为主动报错的接收站点发现了错误(比如因为
线路长,干扰大引起的错误),这个发现错误的站点就会立即哗啦哗啦往总
线上乱发一气(连续的发六个显性位),就象你小时候在幼儿园练习写字,
写错一个笔画你自己没发现,可老师(主动报错站点)发现了就不耐烦了,
在你的纸上哗啦哗啦,乱画一气.目的就是你自己以及告诉别人(发送站点
和别的站点),出错了!
(c).它自己没有发现错误,但作为被动报错的接收站点发现了错误(比如因为
线路长,干扰大引起的错误),这个发现错误的站点只能慢慢的等待,等待
别的主动报错站点报错,如果别的主动报错站点没发现错误,那就继续等,
一直等到该发ACK的时候不给发送站发这个显性的ACK信号,当然了其他站
点可能会发这个ACK,那说明其他站点没有发生错误,没办法,别人能通信,
你不能!然后积攒到一定的时候,你就脱离总线吧!再继续等待一段时间,
脱胎换骨,重新回到总线上(这个时候错误记录都清0了,你肯定是主动报
错站了).就象你小时候在幼儿园练习写字,写错一个笔画你自己没发现,
别的同学(被动报错站点)发现了但他不能说,嘿嘿(乱说话,老师要打屁股
的),他就只能等,等老师来发现你的错误(等待主动报错站点报错),或者
老师没眼力,那就等到收作业的时候,不收你的(不发ACK),不过老师可能
主动来收的(给你发ACK),那你可没办法,继续等吧,等到你也当老师了(脱
胎换骨了),.........
-----------------------------------------------------------------------------------------------------------------------------------------
位仲裁
CAN总线以报文为单位进行数据传送,报文的优先级结合在11位标识符中,具有最低二进制数的标识符有最高的
优先级。这种优先级一旦在系统设计时被确立后就不能再被更改。总线读取中的冲突可通过位仲裁解决。如图2
所示,当几个站同时发送报文时,站1的报文标识符为011111;站2的报文标识符为0100110;站3的报文标识符为
0100111。所有标识符都有相同的两位01,直到第3位进行比较时,站1的报文被丢掉,因为它的第3位为高,而其
它两个站的报文第3位为低。站2和站3报文的4、5、6位相同,直到第7位时,站3的报文才被丢失。注意,总线中
的信号持续跟踪最后获得总线读取权的站的报文。在此例中,站2的报文被跟踪。这种非破坏性位仲裁方法的优
点在于,在网络最终确定哪一个站的报文被传送以前,报文的起始部分已经在网络上传送了。所有未获得总线读
取权的站都成为具有最高优先权报文的接收站,并且不会在总线再次空闲前发送报文。
数据错误检测
CAN协议可使用五种检查错误的方法,其中前三种为基于报文内容检查。
1,循环冗余检查(CRC)
在一帧报文中加入冗余检查位可保证报文正确。接收站通过CRC可判断报文是否有错。
2 ,帧检查
这种方法通过位场检查帧的格式和大小来确定报文的正确性,用于检查格式上的错误。
3 ,应答错误
如前所述,被接收到的帧由接收站通过明确的应答来确认。如果发送站未收到应答,那么表明接收站发现帧中有
错误,也就是说,ACK场已损坏或网络中的报文无站接收。CAN协议也可通过位检查的方法探测错误。
4,总线检测
有时,CAN中的一个节点可监测自己发出的信号。因此,发送报文的站可以观测总线电平并探测发送位和接收位的差异。
5,位填充
一帧报文中的每一位都由不归零码表示,可保证位编码的最大效率。然而,如果在一帧报文中有太多相同电平的
位,就有可能失去同步。为保证同步,同步沿用位填充产生。在五个连续相等位后,发送站自动插入一个与之互
补的补码位;接收时,这个填充位被自动丢掉。例如,五个连续的低电平位后,CAN自动插入一个高电平位。CAN
通过这种编码规则检查错误,如果在一帧报文中有6个相同位,CAN就知道发生了错误。
如果至少有一个站通过以上方法探测到 一个或多个错误,它将发送出错标志终止当前的发送。这可以阻止其它
站接收错误的报文,并保证网络上报文的一致性。当大量发送数据被终止后,发送站会自动地重新发送数据。作
为规则,在探测到错误后23个位周期内重新开始发送。在特殊场合,系统的恢复时间为31个位周期。
但这种方法存在一个问题,即一个发生错误的站将导致所有数据被终止,其中也包括正确的数据。因此,如果不
采取自监测措施,总线系统应采用模块化设计。为此,CAN协议提供一种将偶然错误从永久错误和局部站失败中
区别出来的办法。这种方法可以通过对出错站统计评估来确定一个站本身的错误并进入一种不会对其它站产生不
良影响的运行方法来实现,即站可以通过关闭自己来阻止正常数据因被错误地当成不正确的数据而被终止。
----------------------------------------------------------------------------------------------------------------------------------------
错误处理
在CAN总线中存在5种错误类型,它们互相并不排斥,下面简单介绍一下它们的区别、产生的原因及处理方法。
位错误:向总线送出一位的某个节点同时也在监视总线,当监视到总线位的电平和送出的电平不同时,则在该位时刻检测到一个位错误。但是在仲裁区的填充位流期间或应答间隙送出隐性位而检测到显性位时,不认为是错误位。送出认可错误标注的发送器,在检测到显性位时也不认为是错误位。
填充错误:在使用位填充方法进行编码的报文中,出现了第6个连续相同的位电平时,将检 测出一个填充错误。
CRC错误:CRC序列是由发送器CRC计算的结果组成的。接收器以和发送器相同的方法计算CRC。如果计算的结果和接收到的CRC序列不同,则检测出一个CRC错误。
形式错误: 当固定形式的位区中出现一个或多个非法位时,则检测到一个形式错误。
应答错误:在应答间隙,发送器未检测到显性位时,则由它检测出一个应答错误。
检测到出错条件的节点通过发送错误标志进行标定。当任何节点检测出位错误、填充错误、形式错误或应答错误时,由该节点在下一位开始发送出错误标志。
当检测到CRC错误时。出错标志在应答界定符后面那一位开始发送.除非其他出错条件的错误标志已经开始发送。
在CAN总线中,任何一个单元可能处于下列3种故障状态之一:错误激活状态(Error Active 主动报错)、错误认可状态(Error Passitive 被动报错)和总线关闭状态(Bus off)。
主动报错单元可以照常参与总线通信,并且当检测到错误时,送出一个活动错误标志。被动报错节点可参和总线通信,但是不允许送出活动错误标志。当其检测到错误时,只能送出被动报错标志,并且发送后仍为被动报错状态,直到下一次发送初始化。总线关闭状态不允许单元对总线有任何影响。
为了界定故障,在每个总线单元中都设有2个计数:发送出错计数和接收出错计数。这些 计数按照下列规则进行。
(1)接收器检查出错误时,接收器错误计数器加1,除非所有检测错误是发送主动报错标志或超载标志期间的位错误。
(2)接收器在送出错误标志后的第一位检查出显性位时,错误计数器加8。
(3)发送器送出一个错误标志时,发送器错误计数器加8。有两种情况例外:其一是如果发送器为被动报错,由于未检测到显性位应答或检测到应答错误,并且在送出其被动报错标志时,未检测到显性位;另外一种情况是如果仲裁器件产生填充错误,发送器送出一个隐性位错误标志,而检测到的是显性位。除以上两种情况外,发送器错误计数器计数不改
变。
(4)发送器送出一个主动报错标志或超载标志时,检测到位错误,则发送器错误计数器加8。
(5)在送出主动报错标志、被动报错标志或超载错误标志后,任何节点都最多允许连续7个显性位。在检测到第11个连续显性位后,或紧随被动报错标志检测到第8个连续的显性位,以及附加的8个连续的显性位的每个序列后,每个发送器的发送错误计数都加8,并且每个接收器的接收错误计数也加8。
(6)报文成功发送后,发送错误计数减1,除非计数值已经为0。
(7)报文成功发送后,如果接收错误计数处于1~197之间,则其值减1;如果接收错误计数为0,则仍保持为0;如果大于127,则将其值记为119~127之间的某个数值。
(8)当发送错误计数等于或大于128,或接收错误汁数等于或大于128时,节点进人被动报错状态,节点送出一个活动错误标志。
(9)当发送错误计数器大于或等于256时,节点进人总线关闭状态。
(1O)当发送错误计数和接收错误计数均小于或等于127时,被动报错节点再次变为主动报错节点。
(11)在检测到总线上11个连续的隐性位发送128次后,总线关闭节点将变为2个错误计数器均为0的主动报错节点。
(12)当错误计数器数值大于96时,说明总线被严重干扰。
如果系统启动期间仅有1个节点挂在总线上,此节点发出报文后,将得不到应答,检查出错误并重复该报文,此时该节点可以变为被动报错节点,但不会因此关闭总线。
----------------------------------------------------------------------------------------------------------------------------------------
CAN协议的错误检测机制:
•所有的单元都可以检测错误(错误检测功能)。
•检测出错误的单元会立即同时通知其他所有单元(错误通知功能)。
•正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送
•此消息直到成功发送为止(错误恢复功能)。
•单元始终处于 3 种状态之一:
主动错误状态、被动错误状态、总线关闭态
•位填充机制:在一帧的帧起始、仲裁段、控制段、数据段、CRC段中,如果出现5个连续的相同数值的位时,将在这5个连续位后插入一个补码位。发送节点自动添加此位,接收节点在接收时自动去除此位。此方法可避免同步错误,同时为错误帧的启动提供了机制。
CAN总线错误的种类CAN总线上的错误种类如下:
检测到错误的节点输出错误标志,发送完错误标志后,将继续输出数据帧与遥控帧。错误标志的输出时序如下: