首页 > 编程知识 正文

深入浅出通俗易懂的讲解CAN bus

时间:2023-05-05 02:33:21 阅读:223793 作者:3008

与时俱进,我也开始写博客了。
记忆自己历史的痕迹!
今天,分配到我手下的新来毕业生向我请教can bus问题,他表示canbus很难理解。我将讲解的部分内容放置到网上,也算方便不懂的新手朋友了解了解,当然大神看了,请勿见怪。
第一、can bus的历时、渊源,在这里我不讲述了。网上大把文章了。
第二、为什么要有can bus,它有优点?
can bus由传统的mod bus改版而来的,但跟mobus又不一样。
can bus 要求是 两条通信线;两根线都是通信线;并且通讯线没有TX/RX之分。只有两根线组合在一起,才是一条总线。既是TX线,也是RX线。
canbus必须采用双绞线(一般双绞线要求是20mm绞距)。如下图。

上面这要绞线有什么好处呢?为了减少外部电磁场对信息内部电平的干扰。

为什么在双线交互缠绕时,会减少外部干扰呢?上图中,电磁场不也是对两个信息线各自有干扰吗?
在讲到,必须要回转头跟大家讲讲can bus 总线的识别信号了。
我们遇到的大部分电子环境中,都是默认为+5V或者+3V为高电平,代表通信数值1;0V或者-5V为低电平,代表通信数值0。我想大部分有软件或者硬件功底的朋友估计都能轻易理解吧!(如果这句话都理解不了,证明你的技术水平实在太低了,建议你自己去看看的技术书籍)。
一般的串行总线,都有两根信号线(例如,比较好理解的I2C有一根SDA,一根SCL)。 但是can bus不一样了,虽然也有两根总线(can_H和can_L),但是它要两根总线组合在一起,才能区分逻辑信号。
can bus ,它的逻辑0,为两根总线的电压差=2V;它的逻辑1,为两根总线的电压差=0v。如下图,

当有外部磁场干扰时,因为can-H和can-L是紧密的缠绕在一起,所以干扰脉冲总是有规律的同时作用在两条线上,让传输的逻辑数值不会发生变化。
因此,看到这里我不由想到,丰富的仙人掌的名著,“他强由他强,清风拂山岗;他横由他横,明月照大江”。不管你外界环境多恶劣,通信信号不管历尽千辛万苦,数值依然保持忠贞不变,可谓惊叹绝伦。这种设定,会让can bus对外界的电磁干扰的抵抗力大大增强,是一个通信技术的突破(由衷为技术前辈的智慧结晶而感叹!!!)
上面也讲述的部分,下面来个总结:
在高速canbus中(因为我用到的是高速canbus,不是低速canbus。两者在电平变化是差别的) 在硬件层面上:
1)CAN-H比CAN-L高2V, 为逻辑0。
2)CAN-H比CAN-L高0V,为逻辑1。
同时,can bus撰写协会,多了个显性和隐性的定义。
1)CAN-H比CAN-L高2V, 为逻辑0,为显性。
2)CAN-H比CAN-L高0V,为逻辑1,为隐性。
在can bus硬件层面上,对于初学者来说,可以理解为输出1为弱(弱上拉),输出0为强(强下拉)。假设,有两个节点设备(设备A和设备B)同时接到can总线上,那么A设备输出逻辑1,但是B设备输出逻辑0时,因为A设备为弱上拉,B为强下拉,那么can-l最终表现为拉低,为1.5V;can-h最终表现为拉高,为3.5V。
/********************************************************************************************************* 下面的一堆文字和图片是讲解为什么canbus是弱上拉,强下拉的含义。如果理解不了,可以不看
下图是某一个常用CAN bus驱动器的框图。当can收发器芯片是5V供电时,并输出0时,那么它的CANH 和 CANL输出电压大致为 3.5V和1.5V;当输出为1时 ,实际两根信号线的上拉下拉三极管都是关闭的,两根线就是浮地的高阻状态,通过外界的端接电阻将电压拉到相等大致为2.5V。

所以,看到这里读者应该有清楚认识到,can收发器输出1时,是浮空的高阻态,驱动能力远不如输出0的驱动力,所以,为什么我把它们讲述为“弱上拉,强下拉”或者叫“弱1,强0”。

*********************************************************************************/
上面讲述到canbus在逻辑信号方面是“弱1,强0”。当大家理解这个概念之后,大家需要记住canbus的三关键点:
第一,can bus是两根总线;两根线都是信号线,并且通过两根线组合的电压差,才能分辨通信信号的逻辑0(can-H与can-L的压差为2V),和逻辑1(can-H与can-L的压差为0V);
第二、因为第一点,和can必须是双绞线,所以can bus抗干扰能力非常强;
第三、can bus中,是“弱上拉,强下拉”或者叫“弱1,强0”。(这个也是为什么在节点设备抢占总线资源时,节点设定为设备序号越小,优先级反而越高的原因)

突然冒出“节点设备抢占总线资源时,节点设定为序号越小,优先级反而越高”这句话,多了几个不明的术语(例如,节点设备、总线资源、设备序号、优先级),可能还是很多读者都不能理解,下面我详细讲讲。
什么是节点设备和设备序号?
例如,下图中为一个can bus的网络

canbus网络是一个总线型的网络,所有的设备都直接挂在can bus的一根总线上。不是手拉手,也不是点对点。那么,每个挂在网络的设备,都成为一个节点,或者叫节点设备。
正因为他们所有设备都挂在一条总线上,那么总线只有一条,使用者有很多个。 很多时候,如果同一时间,两个节点设备同时发出数据帧,那么,这里就涉及到抢占式的分配。例如,分配A节点设备的序号为00000 00100,分配B节点设备的序号为00000 00010,那么,因为B节点设备的序号低于A的,所以同一时间,B的优先级更高,B可继续发送数据。A检测到后自动取消发送,等待空闲时间。
如果同一时间,三个节点设备同时发出数据帧。。例如,分配A节点设备的序号为00000 00100,分配B节点设备的序号为00000 00010,分配C节点设备的序号为00000 00001,那么,因为C节点设备的序号最低,所以同一时间,C的优先级更高,C可继续发送数据。A/B检测到后自动取消发送,等待空闲时间。
讲到这里,必须讲到can bus的帧的构成,由几部分(域)构成:
起始标识符SOF+仲裁域+控制域+数据域+CRC校验域+结束域
如下图,为标准帧的结构:

这里提到的域,其实可以理解某一段(field),没有其他含义,就是好听一点。
仲裁域 Arbitration Field就是 节点序号(别人叫标识符,我觉得不直观,其实就是节点设备的序号。序号越小,优先级越高)+RTR.

can的帧大致有五种:数据帧、远程帧、错误帧、过载帧、 帧间隔。首先,我们要理解它们各自的概念和应用
什么是数据帧?
发送帧的节点设备,发送这个帧的目的是为了将某些消息传递给其他节点设备(最常用的帧类型)(帧中的仲裁域中的节点序号,是发送帧的节点设备本身的ID号。)
什么是远程帧?
发送帧的节点设备,发送这个帧的目的是呼叫其他节点设备发送数据(较为常用的帧类型)(帧中的仲裁域的节点序号,是呼叫节点设备的ID号。数据域无内容。)
什么是错误帧?
因为通信中,因为各种因素干扰太多了,总会有可能产生错误,那么出现错误怎么办?
发送帧的节点设备,发送这个帧的目的是发现总线上的帧有错误,提醒总线上的其他设备。(比较少用,但是要掌握)
什么是过载帧?
因为通信时,总是两方或者多方通信,所以,发送数据的那一方不知道接收的那一方准备好了没有,所以,过载帧的作用就是接收方(接收节点设备)告诉发送方,我还没有准备好接收下一帧的工作,请缓一会。
什么是帧间隔?
帧间隔就是上述四种帧的中间,都要有这个帧间隔,去隔离。以达到容易每个帧的类型。如果每个帧都直接连接在一起,变成一坨一坨的数据堆,接收方会非常难解读的。所以帧间隔好比我们文字中的标点符号中的句号一样,起到让通信密文更加易懂。
经过上面的几行解析,相信大家对canbus 的帧有个大概的认识,直观感觉舒服很多,不再是很干涩难懂的“甲骨文”了。
下面,我再深入的讲解各个帧的具体格式和应用场景(部分截图来源其他博客的图片:https://www.cnblogs.com/pejoicen/p/3986587.html)。

数据帧又可以具体分为标准帧(设备序号是11个位)和扩展帧(设备序号为29个位)两种。






远程帧的详解:

错误帧的详解:

当发送方或者接收节点检测到以上5种错误时,就会发送错误帧,提醒对方。错误帧又可以分成两种,一个是主动错误帧(主动错误标识),一个是被动错误帧(被动错误标识)。

过载帧的详解:

帧间隔的详解:

最后,是can bus链路流程示意图。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。