天天看点

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

与时俱进,我也开始写博客了。

记忆自己历史的痕迹!

今天,分配到我手下的新来毕业生向我请教can bus问题,他表示canbus很难理解。我将讲解的部分内容放置到网上,也算方便不懂的新手朋友了解了解,当然大神看了,请勿见怪。

第一、can bus的历时、渊源,在这里我不讲述了。网上大把文章了。

第二、为什么要有can bus,它有优点?

can bus由传统的mod bus改版而来的,但跟mobus又不一样。

can bus 要求是 两条通信线;两根线都是通信线;并且通讯线没有TX/RX之分。只有两根线组合在一起,才是一条总线。既是TX线,也是RX线。

canbus必须采用双绞线(一般双绞线要求是20mm绞距)。如下图。

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

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

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

为什么在双线交互缠绕时,会减少外部干扰呢?上图中,电磁场不也是对两个信息线各自有干扰吗?

在讲到,必须要回转头跟大家讲讲can bus 总线的识别信号了。

我们遇到的大部分电子环境中,都是默认为+5V或者+3V为高电平,代表通信数值1;0V或者-5V为低电平,代表通信数值0。我想大部分有软件或者硬件功底的朋友估计都能轻易理解吧!(如果这句话都理解不了,证明你的技术水平实在太低了,建议你自己去看看的技术书籍)。

一般的串行总线,都有两根信号线(例如,比较好理解的I2C有一根SDA,一根SCL)。 但是can bus不一样了,虽然也有两根总线(can_H和can_L),但是它要两根总线组合在一起,才能区分逻辑信号。

can bus ,它的逻辑0,为两根总线的电压差=2V;它的逻辑1,为两根总线的电压差=0v。如下图,

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

当有外部磁场干扰时,因为can-H和can-L是紧密的缠绕在一起,所以干扰脉冲总是有规律的同时作用在两条线上,让传输的逻辑数值不会发生变化。

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

因此,看到这里我不由想到,金庸的名著,“他强由他强,清风拂山岗;他横由他横,明月照大江”。不管你外界环境多恶劣,通信信号不管历尽千辛万苦,数值依然保持忠贞不变,可谓惊叹绝伦。这种设定,会让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在逻辑信号方面是“弱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的网络

深入浅出、通俗易懂的讲解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校验域+结束域

如下图,为标准帧的结构:

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

这里提到的域,其实可以理解某一段(field),没有其他含义,就是好听一点。

仲裁域 Arbitration Field就是 节点序号(别人叫标识符,我觉得不直观,其实就是节点设备的序号。序号越小,优先级越高)+RTR.

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

can的帧大致有五种:数据帧、远程帧、错误帧、过载帧、 帧间隔。首先,我们要理解它们各自的概念和应用

什么是数据帧?

发送帧的节点设备,发送这个帧的目的是为了将某些消息传递给其他节点设备(最常用的帧类型)(帧中的仲裁域中的节点序号,是发送帧的节点设备本身的ID号。)

什么是远程帧?

发送帧的节点设备,发送这个帧的目的是呼叫其他节点设备发送数据(较为常用的帧类型)(帧中的仲裁域的节点序号,是呼叫节点设备的ID号。数据域无内容。)

什么是错误帧?

因为通信中,因为各种因素干扰太多了,总会有可能产生错误,那么出现错误怎么办?

发送帧的节点设备,发送这个帧的目的是发现总线上的帧有错误,提醒总线上的其他设备。(比较少用,但是要掌握)

什么是过载帧?

因为通信时,总是两方或者多方通信,所以,发送数据的那一方不知道接收的那一方准备好了没有,所以,过载帧的作用就是接收方(接收节点设备)告诉发送方,我还没有准备好接收下一帧的工作,请缓一会。

什么是帧间隔?

帧间隔就是上述四种帧的中间,都要有这个帧间隔,去隔离。以达到容易每个帧的类型。如果每个帧都直接连接在一起,变成一坨一坨的数据堆,接收方会非常难解读的。所以帧间隔好比我们文字中的标点符号中的句号一样,起到让通信密文更加易懂。

经过上面的几行解析,相信大家对canbus 的帧有个大概的认识,直观感觉舒服很多,不再是很干涩难懂的“甲骨文”了。

下面,我再深入的讲解各个帧的具体格式和应用场景(部分截图来源其他博客的图片:https://www.cnblogs.com/pejoicen/p/3986587.html)。

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

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

远程帧的详解:

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

错误帧的详解:

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

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

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

过载帧的详解:

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

帧间隔的详解:

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

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

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

继续阅读