XCP协议和A2L文件 – XCP协议解析 Part2

在上一篇文章中,我们解析了XCP协议中一些宏观的概念,在本篇文章中,我们将会利用CAN传输层来展示具体到XCP消息结构。我们将首先从一个通用的角度来看XCP的消息结构,这里的通用指的是既针对CTO又针对DTO,然后我们会对基于CAN传输层的CTO和DTO的消息结构分别进行讲解。注:文章中所使用到的DTO概念适用于DAQ和STIM,但是举例和描述中都默认使用DAQ。

  • 通用消息结构

通用的消息结构既适用于CTO也适用于DTO,通用的消息结构既适用于CAN传输层也适用于其他传输层,在构造不同命令的时候,通用结构里边的某些字段的含义不同或者是字段的长度不同。

XCP_Message_Format_General

一个完整的XCP消息(也可以说一帧XCP消息)由三部分组成,它们是XCP Header(XCP消息头),XCP Packet(XCP消息体),XCP Tail(XCP消息尾),Header和Tail的存在是依赖于具体的传输层的,而Packet在不同的传输层上都是必须的。Packet又有3个组成部分,分别是标识区(Identification Field),时间戳区(Timestamp Field),数据区(Data Field)。

对于CAN传输层来说,Header是不存在的,因此实际的XCP消息帧就是消息体加Tail,而Tail又于DLC的设置相关,如果DLC=8,但是消息体的长度又不够8个字节的时候,Tail的大小就是8减去消息体字节长度,Tail的内容就是CAN消息的填充(0xFF,0x00或者其它指定的值),而如果DLC是根据消息长度设置的,那么Tail长度就始终是0。

  1. 标识区:标识区用来标识该帧消息,用以和别的消息帧进行区分,告诉接收方现在这条消息是什么类型,里边的数据代表什么意义。从CTO的角度举例的话,它可以连接命令,可以是断开连接命令,也可以是标定页切换命令,这些命令在CAN消息层面来说,都是几个字节的数,那么接收方如何知道现在这条命令是什么命令呢,接收方就是通过标识区来识别的,不同的标识区对应不同作用的命令。从DTO的角度举例来说,现在发送出来的ECU内部数据到底是哪部分的数据,对应于ECU中的哪个或哪几个变量,这些信息又是怎么同别的信息区分开来的呢,也是通过标识区。
  2. 时间戳:时间戳用来反映本帧数据的时刻,它只有在DTO中是有效的,也就是说在CTO中时间戳的长度是0即不存在。跟标识区不同的是,标识区在DTO的每一帧中都存在,用以区别本帧和其他帧的所代表的意义,而时间戳仅仅出现在一个DAQ中所有的DTO消息中的第一条。这是因为DTO都是通过块传输模式通讯的,通过前边的文章,我们知道了ECU向上位机上传变量信息数据的时候通过DAQ,而DAQ反应在消息层面就是很多条DTO消息,对于同一个DAQ里边的DTO消息他们所代表的是同一时刻的不同数据,因此只要第一条消息中含有时间戳就可以代表整个DAQ消息块中所有消息的时刻。如果大家对前边的概念有些遗忘,可以再去回顾一下DAQ同步数据传输详解这篇文章。
  3. 数据区:顾名思义,数据区包含了XCP消息的真正数据内容。从CTO的角度来看,数据区里边的数据代表着命令的参数,用来告诉接收方怎么去执行标识区标识的命令。而从DTO的角度来看,数据区里边就是实际的ECU当中的变量的值或者内存里边的值。
  • CTO消息结构

CTO的消息包含了一个BYTE的标识区(PID),时间戳长度为0,剩下的都是数据区,因此消息结构就退化成了以下这样。

XCP_Message_Format_CTO

针对不同的CTO命令,PID和DATA的数据格式都不同,具体的信息在XCP标准Part2中可以查到。这里我们仅对PID部分做个简单的说明:

CMD:  PID的范围是 0xC0 — 0xFF,不同的PID代表不同的命令

RES:PID是0xFF,代表对于CMD的肯定响应

ERR:PID是0xFE,代表对于CMD的否定响应

EV: PID是0xFD,用于向上位机报告事件

SERV:PID是0xFC,用于请求上位机做某些动作

  • DTO消息结构

DTO的消息结构略微复杂一点,可以根据实际的ECU资源和应用情况选择使用不同的结构。如下图所示,标识区和时间戳都有多种长度可以选择,不同标识区和时间戳格式是可以随便组合使用的。

  1. 标识区:PID就是DAQ块通讯时候的DTO消息的编号,从0x00到0xFB,用来识别消息中数据所代表的意义(类似于UDS连续帧中的消息计数),同时标识区可以最大扩充到4个Byte,后边可以放置目前数据所处的DAQ编号。为什么要有这样的扩充呢。利用CAN传输层举例来看,在XCP实施中,可以选取不同的CAN ID来标识不同的DAQ,这种情况下DAQ的标号对于接收方来说是可以通过CAN ID来区分出来的,另外一种方式是使用相同的CAN ID来处理不同的DAQ,这个时候接受方就无法从CAN ID来区别不同的DAQ,那么就可以在标识区中增加DAQ编号来达到这个目的。
  2. 时间戳:根据实际的资源情况,时间戳可以从1、2、4字节的长度中来选择

XCP_Message_Format_DTO

PID的范围:

DAQ: PID的范围是0x00 — 0xFB

STIM:PID的范围是0x00 — 0xBF

  • PID范围总结

最后我们一目了然的看一下整个XCP通信中的PID取值分布情况:

XCP_Message_PID_List

 

发表评论

电子邮件地址不会被公开。