首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【干货】CAN报文传输过程解析

CAN报文的基本认知

CAN报文的定义

CAN报文是指发送单元向接收单元传送数据的帧。我们通常所说的CAN报文是指在CAN线(内部CAN、整车CAN、充电CAN)上利用ECU和CAN卡接收到的十六进制报文。

CAN报文的格式

在总线中传送的报文,每帧由7部分组成。CAN协议支持两种报文格式,其唯一的不同是标识符(ID)长度不同,标准格式为11位,扩展格式为29位。

在标准格式中,报文的起始位称为帧起始(SOF),然后是由11位标识符和远程发送请求位(RTR)组成的仲裁场。RTR位标明是数据帧还是请求帧,在请求帧中没有数据字节。

控制场包括标识符扩展位,指出是标准格式还是扩展格式。它还包括一个保留位(RB,Reservation Bit),为将来扩展使用。它的最后四个位用来指明数据场中数据的长度。数据场范围为0~8个字节,其后有一个检测数据错误的循环冗余检查(CRC,Cyclic Redundancy Check)。

应答场包括应答位和应答分隔符。发送站发送的这两位均为隐性电平(逻辑1),这时正确接收报文的接收站发送主控电平(逻辑0)覆盖它。用这种方法,发送站可以保证网络中至少有一个站能正确接收报文。

报文的尾部由帧结束标出。在相邻的两条报文间有一很短的间隔位,如果这时没有站进行总线存取,总线将处于空闲状态。如图所示为CAN总线报文结构。

CAN报文的组成

通常接收到的CAN报文由很多部分组成,解析报文时用到的主要是帧ID和数据两部分。 CAN报文的组成表如下:

帧ID的组成

接收到的十六进制的ID实际上是由29位标识符转换而来,目前大多数的通信协议中都直接给出了相应的帧ID,不需要换算。如下表所示

P为优先级,有3位,可以有8个优先级(0~7);R为保留位,有1位,固定为0;DP为数据页,有1位,固定为0;PF为报文的代码,有8位;PS为报文的目标地址(也就是报文的接收方),有8位;SA为报文的源地址(也就是报文的接收方),有8位。

根据通信协议换算一个帧ID。

以上就是29位标识符(ID)的由来。

数据段的组成

据段一般由1~8个字节(Byte)组成,来代表通信协议中相应的含义。每个字节有2个字符,分为高4位和低4位。有的数据需要相邻的2个字节组合才能表示,则需要分为高字节和低字节。

例如,收到帧ID的组成通信协议中需要的报文(ID:1818D0F3):1818D0F3ce0d007d006d1100。

其中,第1个字节ce中的c为高4位,e为低4位。第1、2字节表示总电压,而且注明Byte1为低字节,Byte2为高字节,那么解析时就应该为0dce。

CAN总线所传输的数据又称为报文,是一帧一帧地传送,每帧数据由一组二进制数或数字脉冲组成,这组二进制数按功能又分为一段一段的,每一段称为帧的域或场。

CAN总线所传输的数据有数据帧、远程帧、错误帧和过载帧4种类型。

CAN的帧有两种不同的帧格式,不同之处为识别符的长度不同:具有11位识别符的帧称为标准帧,而含有29位识别符的帧为扩展帧。

CAN总线的报文类型

数据帧

数据帧的功能是将数据从发送器传到接收器。数据帧由开始域、仲裁域、控制域、数据域、安全域、应答域和结束域7个不同的域组成,如图所示,为数据帧的组成。

开始域

无论是标准数据帧还是扩展数据帧都包含这两个段。帧起始标志着数据帧和远程帧的起始,由一个单独的显性位(逻辑0)组成。总线空闲时,发送节点发送帧起始,其他接收节点同步于该帧起始位。

如上图所示,标志数据帧的起始,仅由一个“显性”(即0)位组成,带有约5V的电压的1位被送入CAN高位传输线,带有约0V电压的1位被送入CAN低位传输线。开始域由控制芯片完成。

仲裁域

如下图所示,当多个节点同时发送数据,总线应该怎么处理呢?

仲裁段表示数据传输的优先级,作用就是根据报文ID来确定其发送优先级。标准格式和扩展格式在此的构成有所不同。

仲裁域包括标识符和远程发送请求位(RTR)。识别符代表数据的身份和优先权,标准格式下标识符的长度为11位,这些位按ID.10~ID.0的顺序发送,最低位是ID.0,7个高位(ID.10~ID.4)必须不能全是“隐性”。

在标准帧里,识别符后是远程发送请求位(RTR),该位若为“显性”(即0),代表发送的信息是数据;若为“隐性”(即1),代表发送的信息是数据请求。

只要总线空闲,各控制单元均可向总线发送数据,如果各个控制单元要同时发送各自的数据,那么系统必须决定哪一个控制单元先进行发送。系统规定具有最高优先权的数据先发送,标识符的二进制值越小,其优先权就越高。不同数据的优先权根据数据的重要性和紧迫性等因素由人为编程时确定。

例如,发动机电控单元、ABS电控单元和自动变速器电控单元相比较,制动信号的优先权最高,三者仲裁域的标识符如下:

0 1 0 1 000 0000(发动机电控单元标识符)

00 1 1 0 1 0 0000(ABS电控单元标识符)

1 00 0 1 00 0000(自动变速器电控单元标识符)

ABS电控单元的标识符数值设定得最小,优先权最高;

自动变速器电控单元标识符数值最大,优先权最低;发动机电控单元标识符数值居中。

当以上三个电控单元同时向总线发送数据时,系统就先发送ABS电控单元发送的数据,此时,发动机电控单元和自动变速器电控单元转化为接收器接收数据。总线一旦空闲,系统会发送其他电控单元的数据。

控制域

控制域由“6个位”组成。其中4位是数据长度代码,即数据的字节数量,另两位作为扩展用的保留位。所发送的保留位必须“显性”。控制域供接收器检查是否已经接收到所传来的所有信息。接收器接收和认可所有由“显性”和“隐性”的任意组合在一起的位。

数据长度代码见下表。其中,DLC3~DLC0代表数据长度代码的位,DLC0是最低位,DLC3是最高位。数据长度代码最大为8,表示数据帧允许的数据长度为0~8字节。表中“0”为“显性”,“1”为“隐性”。

数据域

数据域由数据帧发送的数据组成,数据段为数据帧的核心内容,可以为0~8个字节。每字节包含了8个位,所以数据帧最大为64位。从MSB(最高位)开始输出。

例如,要表达节气门开度信号,假如把节气门的开度按最大开度的百分数表示,每10%为一个等级,那么节气门开度信号在数据域的代码见下表中。其中,“0%”表示节气门关闭,发动机处于怠速状态,“100%”表示节气门全开,发动机处于全负荷状态。

安全域

安全域用来检测传递数据中的错误。CAN系统用于电噪声很大的环境,这个环境中的数据最容易丢失或破坏。

CAN协议提供了5种错误检测和修正的方法,因此如果数据被破坏,能够被检测出来,而且网络中的所有的电控单元都会忽略这个数据。

这5种错误检测类型分别为位错误、填充错误、校验(CRC)错误、形式错误和应答错误。

Byteflight协议

位错误

如果所发送的位值与所监视的位值不相符合,则在此位时间里检测到一个位错误。

填充错误

如果在使用位填充法进行编码的信息中,出现了第6个连续相同的位电平时,将检测到一个填充错误。

校验错误

如果接收器的计算结果与接收到校验序列的结果不相符,则检测到一个校验错误。

形式错误

当一个固定形式的域含有一个或多个非法位,则检测到一个形式错误。

应答错误

只要在应答间隙期间所监视的位不为“显性”,则发送器会检测到一个应答错误。

应答域

应答域用来反映接收器通知发送器是否已经正确接收到数据。

当接收器正确地接收到有效的数据,接收器就会在应答间隙期间内向发送器发送一个“显性”位以应答,而应答界定符始终是“隐性”位。

如果检查到错误,接收器立即通知发送器,然后发送器再发送一次数据,直到该数据被准确接收为止,但从检测出错误到下一数据的传送开始为止,发送时间最多为29个位的时间。应答域长度为2个位,包含应答间隙和应答界定符,常态下发送两个“隐性”位。

结束域

结束域标志着数据报告结束,由7个“隐性”位(1111111)组成。这是显示错误并重复发送数据的最后一次机会。如图所示为结束域。

远程帧

CAN总线上电控单元的数据发布,有两种基本形式。

第一种形式是按设定或需要主动发布。例如制动信号,当踩制动踏板时ABS电控单元就会主动发布,发动机电控单元接收后就会立即调控发动机转速由高速降为低速。

第二种形式是受请求后发布。例如A电控单元需要B电控单元的数据,A电控单元先发布请求信号,这个请求信号的数据形式就是远程帧。

远程帧由开始域、仲裁域、控制域、安全域、应答域和结束域6个不同的域组成。与数据帧相反,远程帧的远程发送请求位(RTR位)是“隐性”的(即逻辑“1”)。它没有数据域,数据长度代码的数值是不受制约的(可以标注为容许范围内0~8的任何数值)。其余域功能同数据帧。

错误帧

任何电控单元检测到总线错误就发出错误帧。错误帧的功能是对所发送的数据进行错误检测、错误标定及错误自检。错误帧由两个不同的域组成:第一个域为不同控制单元提供错误标志的叠加,第二个域是错误界定符。如下图所示。

错误标志

错误标志包括主动错误标志和被动错误标志两种形式。主动错误标志由6个连续显性位组成,检测到错误条件的“错误主动”控制单元通过发送主动错误标志以指示错误。被动错误标志由6个连续隐性位组成,除非被其他CAN控制器的显性位改写,检测到错误条件的“错误被动”控制单元通过发送被动错误标志以指示错误。如图所示。

错误界定

错误界定符由8个隐性位组成。传送了错误标志以后,每一节点就发送一个隐性位,并一直监视总线直到检测出一个隐性位为止,然后就开始发送其余7个隐性位。如图所示。

过载帧

过载帧用以在先行的和后续的数据帧(或远程帧)之间提供一附加的延时。

接收器在电路尚未准备好或在间歇域期间检测到一个“显性”位时,会发送过载帧,以延迟数据的传送。

过载帧包括过载标志和过载界定符两个域。

帧间空间

数据帧或远程帧与其前面帧的隔离是通过帧间空间实现的,无论其前面的帧为何类型。所不同的是过载帧与错误帧之前没有帧间空间,多个过载帧之间也不是由帧间空间隔离的。帧间空间包括间歇域和总线空闲域。

帧间隔用于将数据帧或远程帧和他们之前的帧分离开,但过载帧和错误帧前面不会插入帧间隔。;

帧间隔过后,如果无节点发送帧,则总线进入空闲;

帧间隔过后,如果被动错误节点要发送帧,则先发送8个隐性电平的传输延迟,再发送帧。

CAN总线的数据传输过程

信息格式的转换

首先是发动机控制单元的传感器接收到发动机转速信息(转速值)。该值以固定的周期(循环往复地)到达微控制器的输入存储器内。

由于瞬时转速值不仅用于发动机运转控制、变速器换档控制,还用于其他控制单元(如组合仪表),故该值通过CAN总线来传输,以实现信息共享。于是转速值就被复制到发动机控制单元的发送存储器内。该信息从发送存储器进入CAN构件的发送邮箱内。

如果发送邮箱内有一个发动机转速实时值,那么该值会由发送特征位显示出来。将发送任务委托给CAN构件,发动机控制单元就完成数据传输任务。

如图所示为发动机转速值按协议被转换成标准的CAN信息格式。

在本例中,状态区(标识符)=发动机1,数据区(信息内容)=发动机转速值(即发动机转速为×××r/min)。当然,CAN总线上传输的数据也可以是其他信息(如节气门开度、冷却液温度、发动机转矩等),具体内容取决于系统软件的设定。

请求发送信息——总线状态查询

如果发送邮箱内有一个发动机转速实时值,那么该值会由发送特征位显示出来——请求发送信息,相当于学生举手向老师示意,申请发言。

只有总线处于空闲状态时,控制单元才能向总线发送信息。如图所示,CAN构件通过RX线来检查总线是否有源(是否正在交换其他信息),必要时会等待,直至总线空闲下来为止。

如下图所示为信息发送过程,如果总线空闲下来,发动机信息就会被发送出去。

接收过程

如下图所示为信息接收过程,连接在CAN总线上的所有控制单元都接收发动机控制单元发送的信息,该信息通过RX线到达CAN构件各自的接收区。

接收过程分两步,首先检查信息是否正确(在监控层),然后检查信息是否可用(在接收层)。

(1)检查信息是否正确(在监控层)接收器接收发动机的所有信息,并且在相应的监控层检查这些信息是否正确。这样就可以识别出在某种情况下某一控制单元上出现的局部故障。按照CAN总线的信息广播原理,连接在CAN总线上的所有控制单元都接收发动机控制单元发送的信息。数据传输是否正确,可以通过监控层内的CRC校验和数来进行校验。CRC校验即为循环冗余码校验(CyclingRedundancy Check,CRC)。

如图所示监控层对信息进行监控,经监控层监控、确认无误后,已接收到的正确信息会到达相关CAN构件的接收区。

(2)检查信息是否可用(在接收层)CAN构件的接收层判断该信息是否可用。

如果该信息对本控制单元来说是有用的,则举起接收旗,予以放行,如图所示,该信息就会进入相应的接收邮箱;如果该信息对本控制单元来说是无用的,则可以拒绝接收。

上图中,连接在CAN总线上的组合仪表根据升起的“接收旗”就会知道,现在有一个信息(发动机转速)在排队等待处理。

组合仪表调出该信息并将相应的值复制到它的输入存储器内。通过CAN总线进行的数据传输(发送和接收信息)过程至此结束。

在组合仪表内部,发动机转速信息经微控制器处理后到达执行元件并最后到达发动机转速表,显示出发动机转速的具体数值。

冲突仲裁

如果多个控制单元同时发送信息,那么数据总线上就必然会发生数据冲突。

为了避免发生这种情况,CAN总线具有冲突仲裁机制。按照信息的重要程度分配优先权,紧急的信息(如事关汽车被动安全、汽车稳定性控制的信息)优先权高,不是特别紧急的信息(如车窗玻璃升降、车门锁止等)优先权低,确保优先权高的信息能够优先发送。

每个控制单元在发送信息时通过发送标识符来标识信息类别,信息优先权包含在标识符中。

每个控制单元的发射器都将TX线和RX线的状态一位一位地进行比较(它们可以不一致)。

所有控制单元都通过各自的RX线来跟踪总线上的一举一动并获知总线状态。

数据传输总线的调整规则:用标识符中位于前部的“0”的个数代表信息的重要程度,“0”的位数越多越优先,从而保证按重要程度的顺序来发送信息。越早出现“1”的控制单元,越早退出发送状态而转为接收状态。基于安全考虑,涉及安全系统的数据优先发送。

例如,由ABS/EDL电控单元提供的数据比自动变速器控制单元提供的数据(驾驶舒适)更重要,因此具有优先权。数据列的状态域是由11位组成的编码,其数据的组合形式决定了数据的优先权。

如上图所示,3个控制单元同时发送数据列,此时,在CAN-BUS数据传输线上进行一位一位的比较,如果1个控制单元发送了1个低电位而检测到1个高电位,那么该控制单元就停止发送数据列而转为接收器。

下表是3组不同数据列的优先权。

如下图所示,在数据列的状态域位1,ABS/EDL控制单元发送了1个高电位,发动机控制单元也发送了1个高电位,自动变速器控制单元发送了1个低电位而检测到1个高电位,那么自动变速器控制单元将失去优先权而转为接收器。在数据列的状态域位2,ABS/EDL控制单元发送了1个高电位,发动机控制单元发送了1个低电位并检测到1个高电位,那么,发动机控制单元也失去优先权而转为接收器。在数据列的状态域位3,ABS/EDL控制单元拥有最高优先权并接收分配的数据,该优先权保证其持续发送数据直至发送终了,ABS/EDL控制单元结束发送数据后,其他控制单元再发送各自的数据。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OYEV1Yb42xLmUOt3KIYnXg_A0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券