前言
CAN通信模块对于汽车ECU来讲,算是最基本的模块了。与CAN通信模块同样基本的模块还有:基于CAN通信的UDS诊断模块、基于CAN通信的BootLoader刷写模块、基于CAN通信的EOL/Service/Online标定模块等。注意限定词“基于CAN通信的XXX”。
记得在德尔福工作时,问软件工程师都做什么样的高端编程工作,对方吐槽曰:“汽车软件三件套:诊断、标定、PBL”。一时语塞。冷静下来想想,其实也对。在外企上班,国内引用的技术都是在国外开发,到了国内都是平台化的技术,改的最多的也就剩诊断、标定、PBL了。注:PBL - Primary Bootloader,对应的还有SBL - Second BootLoader。
CAN通信
CAN的通信是通过CAN总线实现的。老东家博世公司发明的(PS:汽车工业哪都有他)。CAN通信都是以广播的形式发送接收消息的。不面向连接,不握手。
a. CAN总线中的OSI层:
按照OSI的七层架构物理层、数据链路层、网络层、传输层、会话层、表示层和应用层来分配的话,CAN总线只实现了物理层、数据链路层和应用层3层。原因是:CAN总线作为工业测控的底层网络,其信息传输量相对较少,网络连接方式相对简单,但是信息传输的实时性和可靠性非常高。
数据链路层在CAN总线中有分为逻辑链路控制(LLC)子层,和媒体访问控制(MAC)子层。逻辑链路控制子层的功能主要是报文滤波、超载通知和reset管理。媒体访问控制子层功能主要是传送规则,即控制帧结构、执行仲裁、错误检测、出错标定和故障界定。物理层功能主要定义信号传输方式、完成电气连接、实现收发器特性。
b. CAN总线的硬件:
CAN总线的硬件主要由MCU(单片机)、CAN控制器、CAN收发器(也叫CAN驱动器)、CAN高CAN低双绞线构成。其中,MCU负责实现应用层、CAN控制器实现数据链路层、CAN收发器和双绞线实现物理层。实际产品中,一般的车用MCU中会集成CAN控制器模块。所以实际上只有带CAN控制器的MCU+CAN收发器+双绞线三种物理实体(如果你非要把连接双绞线与ECU主板之间的连接器也作为CAN总线实体的一部分,那就算四种物理实体吧...)。注意,这里的MCU就是前面系统架构和软件架构中提到的那个单片机(Host)哦!车载MCU里能放代码的芯片也就那几种,MCU是主要类型之一。
其中,CAN控制器主要用于生成CAN帧,并以二进制码流的方式发送;在此过程中进行位填充、添加CRC校验、应答检测等操作;将将接收到的二进制码流进行解析并存储,在此过程中进行收发对比、去位填充、执行CRC校验等操作。此外,还需要进行冲突判断、错误处理等诸多任务。
CAN收发器则主要将来自CAN控制器的二进制码流转换为差分信号,向CAN高CAN低双绞线上发送;也将双绞线上的差分信号转换为二进制码流接收,并转给CAN控制器。
最后是CAN高和CAN低这对双绞线。一般CAN高这条线是黄色的,CAN低这条线是绿色的。CAN高和CAN低这两条线的电平在静止状态(default状态)时都为2.5V,这个电平也叫作隐性电平。当发送信号时,CAN高会产生电平跳变,往高了跳,这个高电平一般为3.5V;而CAN低则会非常对称、互补的(要不然怎么叫差分信号呢!)往低了跳,这个低电平一般为1.5V。
c. 数据链路层的CAN报文(也叫“CAN帧”):
先捋下对应关系:CAN帧-对应-数据链路层-对应-CAN控制器。
CAN帧有两种格式,标准的和长的。也叫标准帧(11位识别符)和扩展帧(对应29位识别符)。
CAN帧除了格式不同,还分为4中不同用途的帧类型:分别是数据帧、远程帧、错误帧和过载帧。其中数据帧负责传输数据;远程帧一般用于连接不同CAN网络的网关,在接收某个网络的消息后,再指定打包成另一个CAN网络上的消息转发出去;错误帧,任何节点检测到总线错误就发出错误帧;过载帧,用于已在先行的后续数据帧(或远程帧)之间提供一个附加的延时。
每个帧的结构一般是由以下几各段构成的:
1) 帧起始。表示数据帧开始的段;
2) 仲裁段。表示该帧的优先级的段;
3) 控制段。表示数据的字节数及保留位信息的段;
4) 数据段。数据的内容,一帧可发送0到8个字节的数据;
5) CRC段。检查帧的传输错误的段;
6) ACK段。表示确认正常接收的段;
7) 帧结束。 表示数据帧结束的段。
CAN帧的位时序。位速率:由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。一个位可分为 4 段,包括同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1)和相位缓冲段2(PBS2)。这些段又由可称为 Time Quantum(以下称为Tq)的最小时间单位构成。1 位分为4 个段,每个段又由若干个Tq 构成,称为位时序。
d. 应用层的CAN消息(CAN Message,简写Msg):
实际上,对于大部分汽车工程师,日常工作中接触最多的关于CAN的内容,就属于CAN Message了,纯代码实现的一种数据结构。底层的东西,看一遍熟悉下就够了。CAN消息一般都是在MCU等芯片中实现的,其实就实现在Host应用软件中,是Host-SW中的一部分(可以参考前面关于软件架构的文章)。
既然CAN消息大家都用,那一定就不是简单的理论知识了,必须要有工具才能讲“使用”。在汽车行业,工程师接触到最多的CAN工具就是Vector的CANoe。本章节就结合CANoe的使用,来直观的介绍应用层的CAN消息。
CAN消息矩阵一般是主机厂的网络架构组来负责,是一个巨大的Excel文件,里面的各种sheet定义了不同的CAN消息列表,便于更新维护,类似于图1。
图1 某主机厂某款车型的AD_CAN矩阵中名字为“ACC1”的CAN消息截图
dbc是按照CAN矩阵创建的可以作为CANoe软件的CAN消息数据库使用的一种文件,所谓的dbc其实也就是DataBase of CAN的意思,如图2。
图2 一些dbc文件
所谓的CAN消息是怎样一种存在呢?如图3所示。
实际上每个CAN消息都对应一个本CAN网络内的唯一ID,如下图中的ABM2消息,对应的ID就是小括号内的0x245,。需要说明一点,ABM2其实就是整车上ABM安全气囊控制器ECU发的一个消息,且消息ID是16进制的,0x代表16进制,245是ID号。里面有一堆的信号,其中的Checksum信号、RollingCounter信号为ABM2这个消息的安全相关信号,其他的信号为代表不同实际意义的信号。
图3 某主机厂某款车型的dbc的CAN消息和消息内承载的信号
需要注意的是,这里的消息(Message)其实只是一艘船,一个载体;里面承载的信号(Signals)才是真正有意义的信息。那么消息(Message)与信号(Signal)的关系是什么呢?请看下图。
图4 信号在消息中的layout
一条消息一般有8个Byte字节(0~7byte),每个Byte又有8个bit位(0~7bit)。就这样形成一个8x8的矩阵,每个矩阵小框代表一个bit。每个信号占用多少bit(位),占用了8*8矩阵(消息的layout矩阵)的哪几个bit,通过上图,可以看得清清楚楚。上图中不同颜色的条状物,即代表一个信号(signal)。例如,蓝色部分,代表Checksum信号,它占用了整个Byte0(0~7位)的空间;橘色部分,代表WehDynYawRateValid信号,它占用了第7个byte的第5位(bit)的空间,也就是说,ABM2这条消息的第7Byte的第5bit,表示WehDynYawRateValid信号。WehDynYawRateValid实际是车辆动态Yawrate有效性的意思,是个bool值。Yawrate搞自动驾驶的都知道,是车辆偏航角速率的意思。
e. 整车CAN网络架构
整车一般不止一个CAN网络,一般会分为动力CAN、车身CAN、底盘CAN、舒适CAN、多媒体CAN、诊断CAN等等。CAN网络里有各种各样的ECU节点,例如上文提到的ABM安全气囊控制器模块,就属于动力CAN(当然,这完全有OEM根据自身架构自己定义的)网络上,而IFC智能前视摄像头模块,就在AD_CAN上。CAN网络与CAN网络之间如果需要通信,就需要搞一个网关(Gateway)来转发信号,当然这个网关,你可以专门搞一个控制器做网关,也可以拿其他有既有功能的ECU做网关(只要实现网关的功能,硬件上也有两路CAN的收发器,两路CAN也都接线接好了),比如说BCM车身控制器,经常就充当网关使用。再提一点,在这里,远程帧的意义就在于此了。为什么有远程帧,就是因为多个CAN网络的存在,网关需要转发message。假设A网络有个a控制器,B网络有个b控制器,a控制器想联系b控制器,就需要发个远程帧给网关,告诉网关在B网络里b的ID,网关会按照a发的远程帧的信息,将消息向B网络转发(这次转发就是普通的数据帧,不再是远程帧了),传递给b控制器。最后,贴一张某主机厂某个车型的CAN网络拓扑图,自己体会吧~
图5 网络拓扑图
f. CAN通信常见配置参数汇总:
总结
综上,介绍CAN通信最主要的意义,其实是为了引出CAN消息和信号,这些消息和信号才是ADAS/AD开发人员感兴趣的领域。本文主要是写给一些对车辆不太了解的人,每当讨论到自动驾驶系统从车上获取相关信号、并发出相关信号的时候,让人能够有一定画面感,即这个信号到底是以哪种方式进行传播的。