CAN总线通信原理

        

        CAN总线的仲裁是基于“线与原理(有一个0则为0,全部为1才为1,这和IIC总线的仲裁方式如出一辙)”,也即,总线上连接多个设备(或者叫单元),只要有一个设备输出低电平,那么总线上的电平就为低(这一现象在CAN领域称为“显性=0”,CAN_H和CAN_L电平分别为3.5V和1.5V,电位差=2V);只有全部设备均输出高电平,总线才能呈现为高电平(称为“隐性=1”,此时CAN_H和CAN_L的电平都为2.5V,电位差=0V)。可见,只要有一个设备电平显性,那么他就可以覆盖其他所有设备的电平隐性。CAN控制器在发送报文的同时会监听总线状态与自己发送的电平是否一致,如果不一致发生在ID段则会发生仲裁,如果发生在其他区域则会触发相应错误。基于这一原理,如果自己在发送报文时,别的设备也在发送报文,必然(注)会导致自己发送的内容与监听的内容不一致,这样自己就知道了总线上有冲突。

        注:这里这个“必然”,并不是完全的必然,如果总线上有2个设备,在同一时刻,发送完全相同的CAN报文,那么“自己”是监听不到错误的。

        注:由上文可见,电位差与值,为负逻辑关系:有电位差=0,无电位差=1。(类似的TTL为正逻辑)

        CAN总线采用的是一种叫做“载波监测,多主掌控/冲突避免”(CSMA/CA)的通信模式。这种总线仲裁方式允许总线上的任何一个设各都有机会取得总线的控制权并向外发送数据。如果在同一时刻有2个或2个以上的设各要求发送数据,就会产生总线冲突,CAN总线能够实时地检测这些冲突并对其进行仲裁,从而使具有高优先级的数据不受任何损坏地传输。

  当总线处于空闲状态时呈隐性电平,此时任何节点都可以向总线发送显性电平作为帧的开始。如果2个或2个以上同时发送就会产生竞争。CAN总线解决竞争的方法同以太网的CSMA/CD(Carrier Sense Multiple Access with Collislon Detection)方法基本相似,如图1所示。此外,CAN总线做了改进并采用CSMA/CA(Carrier Sense Multiple Access with Collision Avoidance)访问总线,按位对标识符进行仲裁。各节点在向总线发送电平的同时,也对总线上的电平读取,并与自身发送的电平进行比较,如果电平相同继续发送下一位,不同则停止发送退出总线竞争。剩余的节点继续上述过程,直到总线上只剩下1个节点发送的电平,总线竞争结束,优先级高的节点获得总线的控制权。

        显然,由这一仲裁原理来看,ID越小优先级越高。从硬件上看,也就是说,当自己向总线上发送的bit与监听的bit不一致时,自己就停止发送,也即自己认为自己的优先级比别人低,而且自己之前发送的所有bits,与高优先级设备发送的bits完全相同,并没有扰乱高优先级设备的数据。

        由于上述优先级仲裁过程,只发生在CAN报文结构体的“仲裁域”字段,所以,如果总线上有2个设备,仲裁字段相同时,会导致这2个设备都无法得知自己跟别人冲突了,2个设备都会认为自己获得了总线控制权,都会继续发送后续数据,不过在发送这些后续数据时,这2个设备仍然会自动监听,如果监听结果与发送的bit不一致,就会报错(对于单片机来说就是产生一个中断,程序员可以在中断中检测错误标志位,来观察到底是在哪个字段发生了冲突),但不会停止发送。

软件协议部分:参考 CAN报文格式 - yzl050819 - 博客园

CAN协议的报文传输过程中有:数据帧、远程帧、错误帧、过载帧和帧间隔。

        1.数据帧:用于发送节点向接收节点传送数据的帧。

        2.远程帧:用于接收节点向具有相同ID的发送节点传送数据的帧。

        3.错误帧:用于当检测出错误时向其他节点通知错误的帧。

        4.过载帧:用于接收节点通知其尚未做好准备的帧。

        5.帧间隔:用于将数据帧及远程帧与前面的帧分隔开来。

分为两种类型:标准帧,扩展帧。

数据帧和远程帧都可以使用标准帧格式或者扩展帧格式

        RTR:(Remote Transmission Request, 远程传输请求),该标志用于区分数据帧还是远程帧报文远程发送请求位,数据帧为显性0,远程帧为隐性1。

        SRR:代替远程请求位(在扩展格式中在RTR位置,所以得此名),该位为隐性位。在这个地方占个位以保持标准帧和扩展帧IDE对齐,便可以判断标准帧优先于扩展帧。

        IDE:Identifier Extension标识符扩展位,标准帧为显性0,扩展帧为隐性1。

        R0、R1:保留位。

        DLC:数据长度位。

        CRC:校验位。

        CRC分隔符:隐性位

        ACK:应答位和应答界定位。在应答域中,发送器发出两个隐性位。接收器接收到报文后,在应答位期间,用显性位填充应答位作为回应,应答界定则为保持隐性。

        帧结束:由7个隐性位组成。

数据帧:

        

        SOF帧起始:数据帧开始的段。

        仲裁场:该帧优先级的段。

        控制场:数据的字节数以及保留位。

        数据场:数据内容。

        CRC场:校验数据。

        应答场:确认正常接收的段。

        帧结尾:数据帧结束的段。

远程帧:

        

        通过发送远程帧,作为数据接收器的节点可以发起各自数据源的数据传送请求,即向数据发送器请求发送具有相同ID的数据帧。

        远程帧没有数据段。

错误帧:

        

        错误类型:应答错误,填充错误,CRC错误,格式错误

        错误帧由错误标志的叠加和结束符组成。错误标志有主动(积极)错误标志和被动(消极)错误标志。主动(积极)错误标志为6个显性位,被动(消极)错误标志为6个隐性位。

        错误积极节点:如果检测到一个错误条件,就会发送积极错误标志。这将引起其它节点检测到填充错误,并开始发送错误标志。因此错误标志叠加在6~12位之间。节点发送完错误标志之后就发送一个隐性位,并监控总线,直到总线上出现一个隐性位,然后再发送7个隐性位。这样一个错误帧就发送完毕了。

        消极错误节点:如果检测到一个错误条件,会试图发送一个消极错误标志进行指示。这个消极错误节点会一直等待6个具有相同极性的连续位,等待从消极错误标志起始开始,当检测到6个相同极性的连续位时,消极错误标志发送完成。

过载帧:

        

        过载条件:接收器要求延迟下一次数据帧或远程帧的到达;在帧间隔间歇场的第一位和第二位检测到显性位;如果CAN节点在错误界定符或过载界定符的第8位采样到一个显性位,则节点会发送一个过载帧,错误计数器不会增加。

帧间空间:

         

        

        数据帧和远程帧的前面必然有帧间空间。对于主动错误节点和被动错误节点,帧间空间的结构稍有不同。对于主动错误节点,帧空间由3个显性位的间歇字段和总线空闲组成。在间歇字段不允许发送数据帧和远程帧。总线空闲的长度任意,当有显性位时就被认为是帧起始。被动错误标志除了上边两部分外,在间歇字段后还有8个显性位的挂起传输。在挂起传输阶段被动错误节点不可以发送数据帧与远程帧。

 过滤器

过滤器不是CAN定义的内容,是CAN控制器厂商自己制定的,这东西可以实现让自己只接收指定ID设备发来的数据。不是指定ID发来的数据,直接无法通过过滤器,从而实现了硬件筛选,不想要的报文直接无法进入单片机内部,这样可以节省CPU开销。

  • 8
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值