雨滴科技技术论坛

 找回密码
 立即注册
查看: 1638|回复: 0

CAN总线基础知识总结2——个人总结,写到哪算哪

[复制链接]

238

主题

1132

帖子

4829

积分

论坛元老

Rank: 8Rank: 8

积分
4829
扫一扫,手机访问本帖
发表于 2016-6-23 09:33:36 | 显示全部楼层 |阅读模式
本帖最后由 南方的风 于 2016-6-23 14:29 编辑

       本来我只是想讲清楚CAN的错误管理机制,因为在学习的时候这个地方特别难于理解,但是若要讲清CAN的错误管理,有需要其它知识作支撑,所以还是老老实实地把一些基础知识总结出来。里边的内容大多从网上得来,我只是根据我的理解重新叙述了一遍。      
       昨天讲了CAN总线的非破坏性位仲裁技术,漏了一些内容,对于非破坏性没有给出明确的说明。较真的人可能已经看出来了,多个节点同时往总线上发送数据,获得优先权的报文从一开始到发送结束并没有停下来做什么事,这就是报文的传输时间没有被破坏。今天我把那些内容重新读了一遍,感觉如果不把那四个帧结构讲清楚,看起来还是会云里雾里。所以这第二篇帖子主要介绍数据帧、远程帧、错误帧以及过载帧的帧结构。下文可能会用到接收器和发送器的概念,简单的理解就是出于发送数据的节点就是发送器,否则是接收器。
       1、数据帧
       数据帧由7个不同的位场组成,如下图所示。
                                                     

数据帧

数据帧

       帧起始:数据帧和远程帧有帧起始,错误帧和过载帧没有。帧起始由一个显性位构成,芯片自动填充。总线上的节点只有等到总线空闲时才能往总线上发送数据,所有节点必须同步于首先开始发送报文的节点的帧起始前沿,即总线逻辑值从隐性跳变为显性。那么总线上的节点是如何判断总线是否为空闲的呢?我猜测节点要么一直在检测总线上的状态,要么在有报文要发送的时候检测总线状态,连续检测到多个隐性位就判断总线位空闲状态,否则总线被占用。为什么是隐性而不是显性呢,因为总线总得有一个是不工作状态,也就是默认状态,所以猜隐性是合理的。网上有人说CAN总线在出现连续11个位的隐性位时表示总线空闲。
      仲裁场:标准格式帧和扩展格式帧的仲裁场格式不一样。标准帧有11位标识符和一位RTR位(远程发送请求位),在数据帧里RTR位必须为显性,在远程帧里必须为隐性,我感觉仅通过这一位是无法区分数据帧和远程帧的。在扩展帧里RTR位被SRR位替代(起始就是换个名字而已),SRR叫做替代远程请求位,顾名思义,SRR就是在扩展帧来替换标准帧的RTR位,扩展帧的RTR位放到别的位置了。SRR是一隐性位,该位用来区别标准帧和扩展帧。数据帧的标准格式和扩展格式如下图所示。                                                                                                           

数据帧标准格式和扩展格式

数据帧标准格式和扩展格式


      控制场:控制场有6个位,高2位是保留位,低4位指示后面的数据场有多少个数据(字节数),只能指示0~8个字节。控制场结构如下图所示。
                                                      

控制场

控制场

       数据场:有0~8字节的数据构成。
       CRC场:把前面的几场数据计算出校验码放在这里。
       应答场:应答场由2个位构成,应答间隙和应答界定符,应答间隙是发送报文的节点送出的一个隐性位,需要等待别的节点在接收到数据后在该位的时间点上送出一个显性应答,发送报文的节点检测该位,判断报文是否有应答(报文是否被正确接收)。
       帧结束:该场由7个隐性位组成。
       2、远程帧
       远程帧与数据帧基本一样,只是远程帧里没有数据场,另外远程帧的控制场里的数据数据可以是0~8的任意值。
       3、错误帧       错误帧由两个不同的错误帧组成。第一个场是由不同节点提供的错误标志的叠加,第二个场是错误界定符。错误帧如下图所示。
                                                      

错误帧

错误帧

       错误标志有两种形式:主动错误标志和被动错误标志,主动错误标志由6个连续的显性位组成,而被动错误标志由6个连续的隐性位组成(除非被其他节点发出的显性位覆盖)。错误界定符由8个隐性位组成。错误处理比较复杂,后面会有更为详细的描述。
       4、过载帧
       过载帧由过载标志的过载界定符组成,如下图所示。
                                                        

过载帧

过载帧

       存在下面3中情况会引起节点发送过载标志:
       1、接收器要求延迟下一数据帧或远程帧的到达;
       2、在帧间间隔间歇场的第一和第二位检测到显性位;
       3、如果一个CAN节点在错误界定符或过载界定符的第8位(最后一位)采样到一个显性位(我也不知道这是谁发出的),则节点会发送一个过载帧。
       最多可以产生两个过载帧来延迟下一数据帧或远程帧。过载标志由6个显性位组成,其形式与主动错误标志一样。
       从目前掌握的信息来看,节点并不会专门去检测过载帧并处理,我觉得这是把发送错误信息和过载信息综合起来了,在非常有限的资源下,非常漂亮滴完成了发送错误和发送过载的目的。那么一个节点是怎么让其它节点暂停发送报文的呢?我的理解是,通过发送过载帧(这会引起其它节点检测到错误,从而发送错误标志,具体的内容我后面再讲)来使总线处于忙(非空闲状态)状态,因为节点只有在总线空闲的时候才能发送报文(这个前面着重提到),这样就能延迟别的节点发送报文。这样有一个好处那就是接收器不需要额外发送信息通知别的节点可以发送数据了,总线一空闲,节点就可以发送数据。虽然延时时间有限制,但我想这是人家CAN协议制定者经过深思熟虑的决定,比如他们知道这样设计的CAN协议发送一两个过载帧,数据就能处理完。当我认识到这一点的时候,我觉得制定CAN协议的人是非常牛掰的。
       另外除了上面说到的4中报文,还有一点需要说明,那就是帧间隔。数据帧和远程帧通过插入帧间隔与前面的任何帧(数据帧、远程帧、错误帧和过载帧)分开。过载帧和错误帧之前没有帧间隔,多个过载帧之间也不是通过帧间隔分开的。







回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
在线咨询
咨询热线
0755-26787502-8006/8016
扫一扫二维码
直接访问本站

QQ|Archiver|手机版|小黑屋|雨滴科技  

GMT+8, 2021-12-1 20:32 , Processed in 0.061173 second(s), 15 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表