01 首语
随着人们对汽车功能需求越来越多样化、智能化,汽车的零部件(ECU,Electronic Control Unit)的数量也越来越多、越来越复杂,像自动驾驶、主动安全等功能加入,普通汽车搭载ECU数量大约为50-100个,而豪华智能汽车的ECU数量平均可达到300个以上。在如此庞大数量的ECU的汽车中,各个ECU之间是如何进行信息交换、共同协作,以及ECU是如何完成在线升级(OTA,On The Air)的呢?本文将介绍汽车电子中常用的通信协议——控制器局部网(CAN,Controller Area Network)。
02 CAN基础概念介绍
CAN通信技术是由博世(BOSCH)公司于1986 年开发出面向汽车的一种通信协议,随后通过ISO-11898和ISO-11519对其进行标准化:
1、ISO-11898:定义了通信速率为 125 kbps~1 Mbps 的高速 CAN 通信标准,属于闭环总线,传输速率可达1Mbps,总线长度 ≤ 40米。
2、ISO-11519:定义了通信速率为 10~125 kbps 的低速 CAN 通信标准,属于开环总线,传输速率为40kbps时,总线长度可达1000米。
CAN通信网络是欧洲汽车网络的标准协议,在发展过程中,其高性能和可靠性被广泛认可,所以也会被使用在工业自动化、船舶、医疗设备、工业设备中。
CAN是异步通信,与I2C、SPI这类具有时钟信号线的同步通信协议不同,CAN通信只有两根信号线CAN_HIGH和CAN_LOW来组成一对差分信号线,下图是在汽车电子中常见的ECU在CAN网络的连接图:
图1 ECU连接图
差分信号
差分信号又称差模信号,与传统使用单根信号线电压表示逻辑的方式有区别,晶体管-晶体管逻辑电平(TTL)信号就是用的单根信号线的电压值来表示逻辑值,其电平信号规定:+5V等价于逻辑1,0V等价于逻辑0。而使用差分信号传输时,需要两根信号线,这两个信号线的振幅相等,相位相反,通过两根信号线的电压差值(Vdiff,Voltage Difference)来表示逻辑0和逻辑1,Vdiff=CAN_H-CAN_L。CAN差分信号如下图所示。
图2 差分信号
CAN总线为隐性电平时代表逻辑1,CAN_H和CAN_L的电平为2.5V(电位差Vdiff为0V);
CAN总线为显性电平时代表逻辑0,CAN_H和CAN_L的电平分别是3.5V和1.5V(电位差Vdiff为2.0V左右)。
位时序
前面提到CAN是一种异步通信,没有时钟信号线,其通信过程类似串口通信(Serial Communications),CAN控制器之间通过事先约定好的时序进行通信,但CAN通信还会采用位同步(Bit Synchronization)的方式来抗干扰、吸收误差,从而使得CAN控制器可以对总线信号进行正确采样,保证正常通信。
CAN 协议把每一个数据位的时序分解成如图3所示的 Sync_Seg 段、Prop_Seg 段、Phase_Seg1 段、Phase_Seg2 段,这四段的长度加起来为一个 CAN 数据位的长度。最小的时间单位是 Tq(Time Quantum),一个完整的位由 8-25 个 Tq 组成。
图3 位时间
Sync_Seg(同步段)
若通讯节点检测到总线上信号的跳变沿被包含在 Sync_Seg段的范围之内,则表示节点与总线的时序是同步的,当节点与总线同步时,采样点(Sampling Point)采集到的总线电平可被认为该位的电平。Sync_Seg的大小固定为 1Tq。
Prop_Seg(传播时间段)
这个时间段是用于补偿网络的物理延时时间。是总线上输入比较器延时和输出驱动器延时总和的两倍。Prop_Seg段的大小可以为 1-8Tq。
Phase_Seg1(相位缓冲段1)
这个时间段主要用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加长。Phase_Seg1段的初始大小可以为 1-8Tq。
Phase_Seg2(相位缓冲段2)
这个时间段也是用来补偿边沿阶段误差的,它的时间长度在重新同步时可以缩短。Phase_Seg2段的初始大小可以为 2-8Tq。
CAN收发器
ECU需要从总线中获取CAN帧中的信号电平,转化为逻辑电平,也就是将图2 差分信号中的显性电平和隐性电平转换为对应的逻辑电平0和逻辑电平1,这样在总线中的CAN帧就被转换成程序中使用的CAN报文了。
这个步骤就是由CAN收发器(CAN Transceiver)来完成的,如图1 ECU连接图所示,其位于MCU和CAN Network之间,接收CAN总线上的CAN帧相关的信号电平并将其转化为逻辑信息电平转发给CAN控制器,并且也接收从CAN控制器传输过来的逻辑电平信息并将其转化为信号电平传从到CAN总线上。
03 CAN帧
CAN有五种帧的类型:数据帧(Data Frame)、远程帧(Remote Frame)、错误帧(Error Frame)、间隔帧(Can Interval Frame)和过载帧(Overload Frame) ,其中最复杂的帧类型为数据帧,其作用是传输数据,数据长度是可变的,一个经典CAN(Classical CAN)数据帧可传输0-8个字节的数据(数据内容长度,不含CAN帧的控制信息),而一个CAN FD(CAN with Flexible Data rate)的可传输的数据长度可达64个字节,后文提到的CAN为经典CAN。CAN帧会因其ID位数的不同而不同,以ID位数分为两类:标准帧(11位CAN Identifier)和扩展帧(29位CAN Identifier)。
标准帧
如图4所示,一个带有11位CAN Identifier的帧以SOF(Start Of Frame)开始,以EOF(End Of Frame)结束,其中包含五个区域,分别为仲裁区(Arbitration Field)、控制区(Control Field)、数据区(Data Field)、校验区(CRC Field)、应答区(ACK Field)。
图4 标准数据帧
仲裁区
这个区域包含CAN Identifier的[28:18],总共11位,其范围为0x000-0x7FF,CAN Identifier的值越小会在CAN总线仲裁时拥有更高的优先级(Priority)。RTR位用来指示该帧是否位远程帧(用来区分没有数据的数据帧和远程帧)。
控制区
IDE位用来指示该帧是否为扩展帧;r0为保留位;DLC指示该帧数据区的长度。
数据区
这里放着0-8个字节需要传输的数据。
校验区
CRC(Cyclic Redundancy Check):循环冗余校验;Delimiter:分隔符。
应答区
ACK SLOT:应答槽,发送方会将此位作为隐性电平发送,接收方成功接收后会将此位重写,以此来让发送方知道此帧是否被成功发送。
扩展帧
设计扩展帧的目的是为了完成对更长的CAN Identifier的传输,所以扩展帧中的CAN Identifier使用到了ID[28:0],一共是29位,如图5所示,扩展帧和标准帧大致相同,只有几个地方有一些小的区别。
图5 扩展数据帧
SRR位(Substitute Remote Request):替代远程请求位
r0/r1位:保留位
04 CAN控制器
虽然有相应的标准来规范CAN通信,但是不同的芯片厂商对其功能的具体实现却各不相同,不同点主要在CAN外设在芯片中的寄存器设计,各自驱动程序自然也有区别,但在CAN总线上发出和接收的CAN帧都和标准规定的一致。下面是一些具体的例子来描述CAN控制器的大致工作机制。
Cypress Traveo II系列芯片是英飞凌专为汽车应用设计的32位MCU,其CAN控制器支持经典CAN和CAN FD(ISO 11898-1:2015)。收发CAN帧时支持多种模式,给应用带来更多可能,方便实现不同的场景需要。
消息区
Traveo II系列MCU的CAN控制器具有一块消息区(MRAM,Message RAM),其地址范围与程序运行时使用的RAM地址范围是隔离的,也就是说CAN控制器用来存储接收/发送的CAN帧以及自身的配置信息的MRAM和程序规定的堆、栈等RAM区域是不冲突的,这样也可以有效避免程序的可能存在的错误导致CAN帧的数据被篡改。图6是Trave II MRAM中关于CAN的配置。
图6 MRAM包含的区域
从图中可以看出,Traveo II 的CAN控制器的MRAM的地址是以32位对齐的,从上向下看,首先是CAN ID的配置信息,根据配置CAN控制器中相关寄存器,可将CAN ID初始化为11位或29位,并将不同的CAN ID写入不同的区域。
接下来是存储CAN帧的关键区域,这里存着CAN控制器从总线接收到符合上面已经配置好的CAN ID的CAN帧、即将要发送的CAN帧,从图中可以看出接收/发送时可以使用FIFO(实际也有Queue)模式和Buffer模式,后面会详细介绍不同的模式的工作方式以及CAN帧的内部构造。
接收
前面提到接收有两种工作模式,分别是FIFO(Queue)和Buffer,Buffer模式工作过程简单,一旦有CAN帧被CAN控制器存入Buffer内,相应的中断处理函数就会被触发来处理对应的CAN帧。而FIFO和Queue模式就复杂一些,如图7所示,这是一个拥有8个Rx CAN帧块(英飞凌Traveo II官方手册中称为Rx Element)的FIFO区域,不难看出,有两个关键的标志Get Pos和Put Pos,分别用来指示当前CAN帧获取位置和下一个CAN帧存放位置。此时FIFO区域中已经存在了3个CAN帧等待读取,当驱动程序将CAN帧从MRAM中读取完毕时,会设置对应寄存器来通知CAN控制器,然后Get Pos和Put Pos会指向同一个CAN帧块(为空状态)。
图7RxFIFO
如图8所示,这是一个由CAN控制器从CAN收发器上传来的CAN帧的内部构造,这里还是把它称作Rx CAN帧块,其内容包含了一些前面讲到的CAN数据帧的一些控制位、数据位,还有一些是为了兼容CAN FD所预留的,这里只介绍和经典CAN的相关内容,CAN FD的大同小异。
图8 Rx CAN帧块
XTD位:指示该帧为标准帧还是扩展帧,若此位为0则该帧是标准帧,ID中[28:18]是有效CAN ID,即该帧CAN ID为11位;若此位为1则该帧是扩展帧,ID中[28:0]全部是有效CAN ID内容,即该帧CAN ID为29位。
RTR位:用来区分该帧为远程请求帧还是数据帧,若此位为0则该帧是数据帧,若此位为1则该帧是远程请求帧。
DLC[3:0]:此4位数据用来指示该帧含有的数据的字节数,本文只讨论经典CAN,所以DLC规定的范围应该在0-8字节。
R2-R3:这两行数据就是数据帧中的数据域中的内容,经典CAN最多传输8个字节数据,从图中可以看出,这样一个CAN帧块最大支持8个字节的数据,DB0-DB7。
发送
CAN控制发送过程就相对复杂一些,因为上层应用可能需要发多种CAN ID报文,其报文优先级有高有低,高优先级需要尽快发出,低优先级则可以在缓冲区中等待优先级更高的CAN帧发送完,再发出。
图9 同时使用Tx Buffer和Tx FIFO
如图9所示,当同时使用Tx Buffer和Tx FIFO时,CAN控制器每次都会扫描这些区域,当前状态下,Tx Buffer中一个CAN ID为2的CAN帧等待发送,因为它是Tx Buffer区域中CAN ID最小的,并且比Tx FIFO中处于Get Pos的这一帧(CAN ID为4)小,所以它拥有最高优先级,这一帧将会最先被发出去,第二次CAN控制器再次扫描这些区域,发现处于Tx FIFO中Get Pos的这一帧(CAN ID为4)是这些区域中最小的(包括Tx Buffer),所以第二次将会发送CAN ID为4的这一帧,如此往复,直到这些区域内的所有Tx CAN帧块被全部通过CAN收发器转换为信号电平发送到总线上。
图10 Tx Element
如图10所示,与Rx Element类似,XTD、RTR、ID、DLC以及DB0-DB7的用法与Rx Element一致,只有部分内容有不同。
MM[7:0]:Message Marker,这是一个与发送事件(Tx Event)相关的信息。
EFC(Event FIFO Control)位:该位表示该帧是否有将发送事件存在对应的MRAM中。
FDF位:此位用来标识该帧是否为一个CAN FD帧。
BRS(Bit Rate Switching)位:当该帧位CAN FD帧(即FDF为1时),此位才有效,决定该帧在发送时是否启用速率切换(Rate Switching),以更高的速度传输。
更多与Traveo II发送和接收CAN帧相关的细节,大家可以去查阅英飞凌提供的技术手册TRM。
05 总结
CAN通信已经存在了相当长的时间了,其强大的性能和相对高的稳定性让其不仅在汽车领域大显身手,还被广泛用在各种有性能和稳定性有要求的领域,但在人民日益增长的需求下,其缺点被逐渐放大,例如其每一帧的数据负载量较小(每一帧都需要带有CANID和一些控制信息)、速率有限,好在CANFD的出现,将每一帧可传输的字节数增加至64字节,并增加了波特率,极大的改进了经典CAN通信。
随着时代的变化,大家对新能源车的要求越来越高,更复杂的娱乐功能、高级辅助驾驶、自动驾驶功能等等,CAN通信在这些功能的就有点力不从心了,现在出现FlexRay、车载以太网等一些新的通信技术,随着这些有趣的技术快速发展,让我们来看看会发生什么。