Introduction
随着汽车智能化发展,车辆开发的ECU数量不断增加,人们对汽车系统的各个性能方面提出了更高的需求,比如更多的数据交互,更高的传输带宽等。现如今人们广泛接受电子功能来提高驾驶安全性,像ABS防抱死系统,ASR驱动防滑系统,ESP电子稳定系统,但这类辅助驾驶功能涉及汽车主动被动安全领域,对汽车通信系统的可靠性,安全性和实时性提出了非常严格的需求,比如动力总成和底盘系统对数据传输的要求要达到2M/S,而当时传统的CAN总线已满足不了这些需求,而这些需求主要体现在以下四个方面,分别是通信速率(Transmission rate),可扩展性(Extendability),物理层(Physical Layer)及传输可靠性(Transmission reliability),才能适用于汽车主动被动安全功能领域。可扩展性呢体现在车上,增加减少节点时,不影响整车的效果,另外通信的物理连接保持简便并具备鲁棒性,同时通信系统需具备其容错性确定性,通过冗余备份等技术减少或避免出错,基于这些新的需求,因此需要一种具有可组合性的通信系统,其核心属性就是保证具有确定性和容错性的数据通信,不受总线负载的影响。
我们先看一下通信传输的方式,通信传输可以先结合实际生活的例子来理解,我们可以把每个人理解成是一条报文,报文发送到目标地址,相当于人们到达目的地,那人们出行可以有哪几种选择方式呢,主要像有打车,高铁飞机等,其中我们可以根据控制方式的不同分为两大类,第一类事件触发,比如我想去一个地方,通过打车软件打车,打车行为呢相当于触发事件,优点在于时间自由按需触发,缺点是每个人的打车时间是随机的,可能造成部分时段向早晚高峰时期路况拥堵,人们就无法及时到达目的地址,或想半夜时段或郊区地段,司机不能及时响应,其所花费的时间是不可预测的,第二类时间触发,根据时间表来执行,像飞机的航班表,高铁的时刻表,到点起飞或行驶,优点在于所花费的时间是可预测的,不会因交通拥堵而造成延迟的情况,缺点是不合理的,交通资源分配,像交通工具的早晚班机或特殊时期,比如目前的疫情期间,严格的人员流动限制,从而造成交通资源的浪费,
了解了两种通信传输的类型之后,包括CSMA和TDMA访问方式,其中CSMA全称载波监听多路访问方式,基于事件触发,事件出发后,节点尝试往总线上发送报文,比如传统汽车总线CAN就是此类访问方式。TDMA 时分多路访问方式,相当于发送节点的时间都是确定好的,按照时间片为单位划分并周期性发送,比如图中通信时间轴上以时间片段t cycle为单位,逐期发送,一个t cycle可分为四块,每个时间片段里指定一条报文发送,可以理解成高铁的一节车厢,车厢内的座位都是确定好的,每位上车乘客对应自己的座位并前往目的地,FlexRay总线就是基于时间触发的TDMA访问方式。
在传统CAN总线基础上,为满足更高的需求,因此有宝马,戴姆勒等oem和博士,恩智浦等供应商共同成立了FlexRay联盟,该联盟已在开发出具有确定性和容错性的FlexRay通信标准,于2005年推出FlexRay 2.1版本,随后2009年推出FlexRay为3.0版本,并提交为iso标准,iso 17458,该协议描述了FlexRay及其物理层和相应的一致性测试。
FlexRay和CAN一样均参考了iso模型,并定义了物理层和数据链路层规范,其中FlexRay的协议规范定义数据链路层,电气物理层规范定义物理层,另外FlexRay不同层对应的物理器件分别为数据链路层对应通信控制器,简称CC,CC主要任务包括组织总线访问错误检测,对收发报文的解码编码操作和同步总线,物理层对应总线驱动器简称BD, BD主要进行信号转换,包括模数数模转换,目前FlexRay规范仅涵盖iso模型的前两层及物理层和数据链路层,高层协议则由oto萨联盟和assum组织制定。
FlexRay物理层
首先介绍下拓扑结构,FlexRay总线支持多种不同类型的拓扑结构,即不限于任何特定的物理拓扑,先从最简单的拓扑说起,及点对点方式(peer-to-peer),其中FlexRay跟CAN一样,节点1通过两根信号线Bus Plus(BP)和Bus Minus(BM)与节点2连接,两个节点终端分别接了终端电阻,阻值范围是80~110欧姆,其作用过滤高频信号的干扰,另外任意两个节点之间的线长不得超过24米,其目的是为了保持信号完整性,因为随信号长度增加,会导致信号衰减,失真等信号质量变差的情况,从而影响节点通信,当FlexRay网络中存在四个或以上节点时,拓扑结构可选择被动星型和总线型两种拓扑结构中,均在两个相距最远的节点添加终端电阻,并限制节点间的线长不得超过24米。
为避免或减少影响通信情况的出现,FlexRay节点可通过采用主动星型耦合器互联的主动星型拓扑结构,其被动星型节点替换为主动星型节点,该节点与其他ECU节点连接处均添加终端电阻,通过主动星型拓扑结构可提高信号质量以及补偿信号失真,但同时成本价格也会较贵。
而在实际项目中,FlexRay的拓扑结构不会单独仅应用总线型,被动星型,主动星型的某一种,而是通过以组合的形式使用,即混合拓扑结构应用
FlexRay的数据转换,其物理信号基于差分信号传输,前面也提到FlexRay节点是通过BP BM进行数据通信,电气物理层规范定义了四种总线电平,分别为总线空闲电平,总线空闲低功耗电平,Data_1和Data_0电平,其中总线空闲和空闲低功耗的差分电平为零,即隐性电平,两者区别在于空闲低功耗的bp bm电平值均为零,Data_0和Data_1总线电平为显性电平,当节点发送数据至总线上时,Data_0转化为物理电平值,bp 1.5v,bm 3.5v,Data_1转换为物理电平值,bp 3.5v,bm 1.5v,当节点采集总线上数据时,同样也是通过bp bm采集总线物理电平,并求取bp减bm的差分电压值,当差分电压值范围大于600毫伏时,转化为Data_1,当差分电压值范围小于负的600毫伏时,转化为Data_0。
介绍下FlexRay节点的网络组件,包括μC主机,CC通信控制器以及BD总线驱动,其中CC服务mc间数据通信包括组织总线访问和收发报文,BD主要任务是进行信号转换及物理电平和逻辑信号间转换,此外BD除了作为CC接口外,还有一个mc主机接口,该接口主要跟io控制信号有关,除了基本结构外,FlexRay还存在扩展结构,即在CC和BD间添加了总线监控器,简称bg,其作用是为了防止故障节点在未分配给他们的实习内,出现未经授权的传输,简单的说就是防止故障节点在错误时间访问总线。
FlexRay 通信周期
FlexRay以通信周期为一个循环发送指定的数据,其中一个通讯周期中又划分为64cycle,cycle从零开始计数至63,每个cycle中可包含以下四个时间段,静态段,动态段,符号窗口及网络空闲时段。静态段用于确定性的传输报文,动态段用于传输事件驱动的报文,符号窗口传输特殊符号,网络空闲时段,即NIT段期间不会进行数据通信,需要注意的是,在一个周期中,仅静态段和NIT段是必须的,而动态段符号窗口是可选的。因此通讯周期的组合形式一共有四种,分别为静态段加网络空闲段,静态段加动态段加网络空弦段,静态段加符号窗口加网络空闲段,以及四个时段均包含,
首先静态段,静态段基于我们前面提到的TDMA 时分多路访问方式,通信提供确定性的数据传输,发送节点被指定分配到特定的静态slot中,发送静态帧在静态段中可划分为若干个等长的静态slot,可平均划分为2~1023个,静态slot的个数长度,分别由全局变量及number of static slots和gd static slot定义,另外静态段中的静态sd从一开始计数sd范围为2~1023之间,一条静态帧分为三部分,帧头有效负载帧位在静态段中,每条静态报文的长度均是固定等长的静态帧,尾部是CID通信空闲界定符,用于表示静态帧的结束,通俗的理解就是,静态段可以想象成一节火车车厢划分为若干个静态slot,静态slot相当于车厢的座位,座位大小都是相同的,并没有区别对待,每个座位分配给不同的乘客,静态报文可以理解成乘客静态段,发送静态报文则为乘客乘坐火车的过程。
接着动态段,动态段位于静态段之后,用于传输事件驱动报文及动态帧,动态段可分为若干个动态slot,由于动态段基于事件触发,主要用于刷写诊断功能,故长度不一,所以用于存放动态段的动态slot也均不相同,其中每个动态slot最小单位为一个动态mini slot,动态slot可由一到多个mini组成,在动态段中最多可包含2047个动态slot,且最多可划分为7986个mini slot,另外动态mini slot的个数和长度分别由全局变量,the number of mini slot和gd mini slot决定,通俗的理解就是动态段可以想象成火车的货物车厢用于运输货物,但货物的大小不一,动态真相当于货物,动态帧长度越长,所占用的车厢空间就越长,即动态slot越长,要确保放下最大的货物,即动态帧,所以要事先规定好车厢的大小,也就是动态段的长度。
然后FlexRay帧的符号窗口段和网络空闲段,FlexRay符号窗口的长度是固定的,用于传输符号,而非传输报文,数据符号包括三种类型,分别为冲突避免符号,用于表示第一个通讯周期的开始介质,测试符号用于测试总线监控器,唤醒符号用于唤醒FlexRay,网络通信中期的末尾部分是网络空闲段,简称NIT段,用于同步本地时钟,另外NIT段期间不进行数据通信。
FlexRay 帧结构
FlexRay帧的组成部分,分为帧头,有效负载及帧尾,其中帧头存放FlexRay帧的特定属性信息,一共40位,帧尾存放CRC校验求得的校验结果,有效负载Payload最多可支持254个字节的数据内容。首先我们看一下帧头部分,帧头的首位是保留位,默认发送零,第二到第五位是指示位,目的是更加精确的指示报文,根据动态静态报文类型的不同,其含义也随之变化,然后第三位空针指示位用于指示披露的部分是正常的还是无效的,第四位及第五位分别是同步帧指十位和启动针指十位,用于判断该针是否为同步帧。
启动针标示位后面是Frame ID,即表示报文id一共11位。Payload Length为七位,用于表示有效负载的大小,其范围大小是0~127,简单的通过payload length表示报文长度是不可取的,所以FlexRay规定用word为单位表示有效负载的大小,word为单位,1word等于2Byte,127word等于254Byte。Byte后面紧跟着是11位的Header CRC,即帧头CRC序列,只对帧头的同步帧指示位,启动针指示位,Frame ID, Payload length进行CRC校验,帧头的末尾是Cycle Count即周期计数器,由六个位构成,表示报文发送的周期数,范围大小为0~63。
一条FlexRay报文Payload的部分最多传输254个数据字节,数据字节命名从Data_0开始,最大数据字节为Data_253,通过设置帧头的有效负载指示位,在静态动态报文中所表现的作用也是不一样的,在静态报文中,通过设置有效负载指示位,可以将披露的部分前12个字节作为传输网络管理向量,the network management vector,网络管理向量可用于在FlexRay 网络中实现网络管理,而动态报文中设置有效负载指示位,表示payload的部分,前两个字节为报文标识符,即message id,其作用是为了更加精确的指示,有效负载可在接收过滤器中用于实现更精细的区分依据。
最后FlexRay中尾部分是CRC段,一共24位,使用CRC循环冗余校验保护有效负载,校验范围是FlexRay帧头加有效负载区域,CC 即 FlexRay 通信控制器,会根据帧头,有效负载以及FlexRay规定生成的多项式,来计算CRC序列,求得checksum,并在FlexRay报文发送前与接收后将其作为帧尾追加到帧头和有效负载之后。
FlexRay 总线访问
FlexRay总线访问,包括总线访问机制介绍,来自通信调度表,图示为一个FlexRay总线拓扑结构,FlexRay可支持单双通道,即Channel a和Channel b,其中节点K节点L均连接两路通道,节点M节点N节点连接Channel a单通道,节点O连接Channel b单通道,我们以该拓扑结构为例,介绍FlexRay在不同数据时段,即静态段,动态段的总线访问机制,
首先介绍FlexRay ,图示将静态段分为三个静态slot,静态slot id为1,2,3,每个静态slot分配给特定的节点。其中 slot1 分配给节点K,slot2分配给节点M,slot3分配给节点L,节点K同时连接Channel a和Channel b,并在静态 slot1 中分配静态帧b,节点M仅连接单通道Channel a,并在静态slot 2中分配静态帧c,节点L同时连接Channel a和Channel b,分别在两路通道分配静态帧a和d。如果想提高FlexRay的容错性,可以让发送节点在同一静态slot内的两路通道发送两条相同的静态帧,如节点K如果想提高FlexRay的传输带宽,可以让发送节点在同静态slot中发送两条不同的静态帧,如节电l通信速率可实现从10M/S增至20M/S以上,为静态段的总线访问方式。
动态段总线访问方式,其特点是发送节点给予事件驱动发送动态帧,且动态针长度不一。从图示了解到,动态段报文通信较静态段更加灵活,根据事件触发,尝试在总线上发送动态帧,Channel a和Channel b通道相互独立,所以在不同通道的相同slot内可对应不同的发送节点发送动态帧,比如动态slot4 中Channel a节点L发送动态帧n,而Channel b上节点O发送动态帧m。另外存在事件驱动后不能发送动态帧的情况,比如动态帧p,即节点M尝试在动态slot7发送报文,但明显动态段剩余的部分不够容纳该动态帧的长度,所以这条报文不能在该周期内发送,这里就涉及到最迟发送时间的概念。什么是最迟发送时间,它是针对每个发送节点,用于在动态slot内是否允许发送节点发送报文,如果发送节点因事件触发,尝试在动态段发送动态帧时,则需考虑该节点的最迟发送时间,仅当此时动态minislot的id小于或等于支持最迟发送时间点,才允许拥有传输权限。比如说节点M设定它最迟可以在minislot 8 的位置发送,若他尝试在minislot 9的位置发送时,则无法成功,只能等待下一个cycle发送。
根据上述FlexRay总线访问的特点,一个cycle内通过调度表的形式通信,依据调度表的内容分为静态段,动态段不同的slotslot分配给指定的发送节点,发送节点发送报文帧,严格按照调度表发送数据,但实际情况中,为了更加有效地利用带宽,FlexRay可能在不同的cycle中通过复核调度表发送报文,通过这种复合调度表的方式,将更加有效地利用FlexRay带宽,增加了数据吞吐量,并允许每个时间段传输更多的信号值。例如图示,静态段的静态slot 2分配给发送节点M该节点在Channel a通道中,根据复合调度表在不同的cycle中发送不同的静态帧。另外复合调度表对静态段和动态段的影响作用也是不一样的。
静态段内,每个cycle的相同slot中可发送同一节点的不同静态帧,如图所示,Channel a中静态段slot2分配给发送节点M发送静态帧,第n至n+2的三个cycle中,分别发送静态帧c,静态帧x,和静态帧y。
而动态段可实现的复合调度表会有所不同,动态段总线访问方式会更加灵活,每个cycle的相同slot中可分配给不同节点来发送不同的动态帧,动态帧的长度也可以不一样,如图所示,动态slot 7在第n至n+2的三个cycle中分配给发送节点L,发送节点M,以动态帧u,动态帧t,以及动态帧p的顺序发送。