在【CAN通讯系列3】如何学习CAN通讯?中举了一个例子:新能源汽车要实现驱动功能,先需要整车控制器VCU计算目标转速或扭矩请求等信号,再通过CAN通讯传递给电机控制器MCU,就这个例子继续探讨CAN通讯的基础问题。
1 CAN数据帧的数据段
VCU需要MCU传递(发送)一些信号,假设有:
-
信号1:目标转速请求信号
-
信号2:目标转矩请求信号
-
信号3:目标转速请求有效标志信号
-
……
-
信号x:目标转矩请求有效标志信号
VCU是将这些信号一个接一个使用CAN通讯发送给MCU?还是将它们打包或捆绑到一起,再使用CAN通讯发送给MCU?
这个答案较明显,肯定不希望一个接一个形式发送,你想象一下,如果VCU有上百个信号要发送,这样效率太低,实时性也会有问题。选择捆绑到一起,即多个信号绑在一起,面临2个问题:
-
信号如何绑到一起?比如谁接着谁
-
信号捆绑有大小限制吗?是一下子能捆10个还是捆100个?
针对这2个问题,在CAN数据帧中,定义一个数据段,用来放信号,如下示意的红圈部分:
该数据段的大小有8个字节,即64位。这是怎样个概念?比如目标转速请求信号通常占用16位,那就意味着数据段最多能放4个这样的信号。
当然并不是每个信号都会占用16位,比如目标转速请求有效标志信号只占用1位,油门踏板深度信号占用8位,油门踏板深度有效标志信号占用2位。这时将如何将这些信号塞进到数据段呢?
首先,按最小单位为位,对该数据段做了规定,如下表所示:
列向表示字节序号,从上往下,第0个字节到第7个字节;
行向表示每个字节的位,从右往左,bit0到bit7。
然后,把上述VCU的信号排入到这个表,如下所示。
可以看到数据段还是可以装入很多信号,但是如果除了表中的这些信号,VCU还有更多的信号需要发送,那又将如何处理呢?
显然,还需要额外的数据段来装剩下的信号,一个数据段不够,那就再用一个数据段,直到够用为止。此时,又一个问题产生了,怎么区别这些数据段呢?
2 CAN数据帧的仲裁段
自然地,当然希望每一个数据段都有一个标识或者记号。因此在CAN数据帧中,定义一个仲裁段,其中就包含ID(标识)信息。就好比如上图数据段对应仲裁段的ID为001,额外添加的一个数据段给它定义ID为002, 以此类推,不难理解,可以根据需要先定义多个ID,然后在对应该ID的数据段去部署信号,如下所示:
3 CAN数据帧的控制段
理论上,我们是可以给数据段装满信号,但是VCU信号如果不够,必然有些ID的数据段装不满,这时为了让接收方MCU更准确地获取信息,在CAN数据帧中,定义一个控制段,其中包含数据段的长度信息(以字节为单位)。比如在控制段定义了长度为6个字节,那么MCU收到这条报文时,能够明确知道有效数据长度是6个字节,后2字节就可以忽略。因此,除了定义仲裁段的报文ID,数据段的信号排列关系,还需要在控制段定义的长度信息,如下示意:
4 小结
本着从实际问题出发,信号如何从一个控制器传递到另一个控制器,本文展现了这么一个自然的思考过程,我想应该对本文的例子(VCU如何通过CAN通讯发送给MCU信号)有了一个初步的认识,当然,其中也引入CAN数据帧定义的相关内容,我想通过理论与实际相结合的方式,更有助于理解CAN标准或协议这些相对抽象的内容,甚至会发现这些标准或协议是如何精妙。
为了深入了解CAN协议,下篇文章将对CAN数据帧的定义做详细的介绍,敬请关注。
source: vector learning