CAN总线的远程、错误帧的作用!

转自:http://m.blog.csdn.net/blog/whw8007/38351721#

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个连续位后插入一个补码位。发送节点自动添加此位,接收节点在接收时自动去除此位。此方法可避免同步错误,同时为错误帧的启动提供了机制。

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Verilog语言是一种硬件描述语言,用于电子系统的设计和验证。在使用Verilog实现CAN总线时,我们可以通过以下步骤进行设计和编码: 1. 确定系统需求:首先,我们需要明确CAN总线的功能和特性,包括最大传输速率、消息的结构和格式、错误检测和纠正等。 2. 定义模块结构:根据CAN总线的特性,我们可以将其分为多个模块,例如消息发送模块、消息接收模块、错误检测模块等。 3. 编写Verilog代码:根据模块结构,我们可以编写相应的Verilog代码。对于消息发送模块,我们可以定义输入端口包括消息ID、数据以及控制信号,输出端口为CAN总线物理线路;对于消息接收模块,输入端口为CAN总线物理线路,输出端口为消息ID、数据以及状态信号等。 4. 实现总线控制:在CAN总线中,还需要实现一些总线控制机制,例如仲裁机制、消息优先级等。我们可以使用Verilog代码实现这些机制,确保多个节点之间的通信和数据传输的可靠性和顺序性。 5. 进行仿真和验证:在编写完Verilog代码后,我们可以使用Verilog仿真工具,如ModelSim等,进行仿真和验证。通过针对不同的输入和场景进行仿真,我们可以确保CAN总线在各种情况下的正确性和稳定性。 总的来说,使用Verilog实现CAN总线需要明确系统需求,根据模块结构编写相应的Verilog代码,实现总线控制机制,并进行仿真和验证。通过这些步骤,我们可以成功地将CAN总线功能集成到Verilog设计中。 ### 回答2: Verilog可以用于实现CAN总线协议,CAN(Controller Area Network)是一种广泛应用于汽车电子系统和其他工业领域的串行总线通信协议。 首先,Verilog可以用于设计CAN控制器模块。CAN控制器负责管理数据的发送和接收,以及CAN总线错误检测和处理。控制器的设计包括位定时分析、发送和接收状态机、错误检测和错误处理等功能。 其次,Verilog还可以实现CAN的发送和接收功能。CAN总线使用标准或扩展进行数据传输。Verilog可以设计发送模块,包括标识符、控制位、数据位和CRC等字段的生成和发送。同时,还可以设计接收模块,对接收到的CAN进行解析和处理。 另外,Verilog还可以实现CAN总线错误检测和错误处理功能。CAN总线错误检测机制包括CRC校验和奇偶校验等。Verilog可以设计相应的模块来实现这些校验功能,并在数据传输过程中对错误进行检测和处理。 最后,通过使用Verilog语言,在CAN控制器模块、发送和接收模块,以及错误检测和处理模块的基础上,可以构建一个完整的CAN总线通信系统。 总而言之,借助Verilog语言,可以实现CAN总线的控制器设计、发送和接收功能,以及错误检测和处理功能。使用Verilog可以简化CAN总线的设计过程,确保数据的准确和可靠传输。 ### 回答3: CAN总线是一种常用的串行通信协议,用于在汽车电子、工业控制等领域传输数据。要在Verilog中实现CAN总线,需要以下几个步骤: 首先,定义CAN总线的物理层接口。CAN总线的物理层是基于差分信号的,因此需要定义差分发送和接收引脚。可以使用Verilog中的电气双模(TE)和远程RF(远程)来实现差分发送和接收。发送器和接收器之间的差分信号也需要进行电平转换和差动电阻匹配以保证信号质量。 其次,定义CAN总线的控制层协议。CAN总线的控制层协议包括格式、传输速率、差错检测等。格式主要分为数据远程,其中数据用于传输实际数据,远程用于请求数据。传输速率可以根据需求选择不同的波特率。差错检测可以使用循环冗余检测(CRC)等技术进行。 然后,实现的发送和接收功能。在发送方,需要将待发送的数据按照格式进行封装,并通过物理层接口发送差分信号。在接收方,需要解析接收到的差分信号,并根据格式解析出数据内容。 最后,验证和仿真。为了验证CAN总线的功能和正确性,可以使用Verilog的仿真工具进行验证。通过编写测试用例,模拟实际通信场景,测试CAN总线的性能和稳定性。 总之,通过逐步定义物理层接口、控制层协议,实现的发送和接收功能,以及进行验证和仿真,就可以在Verilog中实现CAN总线。这样就可以在Verilog中模拟和调试CAN总线通信的逻辑和功能,以便实现在汽车电子和工业控制等领域中的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值