【CAN通讯系列4】CAN通讯如何传递信号?

【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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值