汽车电子与软件

汽车电子与软件

关注

技术科普:控制器局域网-CAN

环形隧道

2023-08-25

作者:Neo

首语

随着人们对汽车功能需求越来越多样化、智能化,汽车的零部件(ECU,Electronic Control Unit)的数量也越来越多、越来越复杂,像自动驾驶、主动安全等功能加入,普通汽车搭载 ECU 数量大约为 50-100 个,而豪华智能汽车的 ECU 数量平均可达到 300 个以上。在如此庞大数量的 ECU 的汽车中,各个 ECU 之间是如何进行信息交换、共同协作,以及 ECU 是如何完成在线升级(OTA,On The Air)的呢?本文将介绍汽车电子中常用的通信协议——控制器局部网(CAN,Controller Area Network)。

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 总线上。

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 位:保留位

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 帧块(为空状态)。

图 7  Rx  FIFO

如图 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。

总结

CAN 通信已经存在了相当长的时间了,其强大的性能和相对高的稳定性让其不仅在汽车领域大显身手,还被广泛用在各种有性能和稳定性有要求的领域,但在人民日益增长的需求下,其缺点被逐渐放大,例如其每一帧的数据负载量较小(每一帧都需要带有 CAN  ID 和一些控制信息)、速率有限,好在 CAN  FD 的出现,将每一帧可传输的字节数增加至 6 4 字节,并增加了波特率,极大的改进了经典 CAN 通信。

随着时代的变化,大家对新能源车的要求越来越高,更复杂的娱乐功能、高级辅助驾驶、自动驾驶功能等等,CAN 通信在这些功能的就有点力不从心了,现在出现 FlexRay、车载以太网等一些新的通信技术,随着这些有趣的技术快速发展,让我们来看看会发生什么。

本文著作权归作者所有,并授权 42 号车库独家使用,未经 42 号车库许可,不得转载使用。

评论 · 0

0/3
大胆发表你的想法~
评论