01 引 言
J1939Tp是我学习AUTOSAR CP诸多BSW模块的起点,其分层架构完美体现了AUTOSAR规范的精髓,掌握J1939Tp有助于深入理解通信(COM)相关模块的程序执行过程。
本文依旧从传统的手工编程入手,讲述J1939Tp工具链编程的操作步骤,对模块的内部机理仅做简单介绍,感兴趣的读者可参考相应AUTOSAR规范。
02 J1939Tp模块介绍
J1939协议是由美国汽车工程师协会(SAE)制定的主要针对商用车的CAN总线通讯协议,其基于CAN 2.0B协议。
表2-1列出了J1939协议的主要内容和对应文档。
表中的“SAE J1939-21”描述了数据链路和传输层,包括2种传输协议类型:BAM用于广播消息,CMDT用于点对点连接。
J1939Tp为“SAE J1939-21”在AUTOSAR架构中的实现,主要完成下列功能。
(1)直接或分段发送数据
(2)直接或重组接收数据
(3)数据流控制
(4)超时管理
(5)分段和组包过程中的错误检测
2.1 数据链路层
数据链路层为物理连接之间提供可靠的数据传输,包括发送CAN数据帧所必须的同步、顺序控制、出错控制和流控制。本节主要介绍数据分段收发过程。
传输多于8字节的数据须采用多帧传输机制,即采用多包报文,在连接管理报文的协调下进行多帧传输。
长度大于8字节的报文无法用单个CAN数据帧来装载。因此,它们必须被拆分为若干个小的数据包,然后使用单个的数据帧对其逐一传送。而接收方必须能够接收这些单个的数据帧,然后解析各个数据包并重组成原始的信息。
CAN数据帧包含一个8字节的数据域。由于组成长信息的单个数据包必须能被识别出来以便正确重组,因此把数据域的首字节定义为数据包的序列编号。每个数据包都会被分配到一个从1到255的序列编号。由此可知,多帧传输最大的数据长度是(255包×7字节/包=)1785字节(虽然协议理论上支持1785 字节,但大多数 ECU 实际不会发送如此大长度,可能因内存或总线负载需限制更小最大长度)。
序列编号是在数据拆装时分配给每个数据包,然后通过网络传送给接收方。接收方接收后,利用这些编号把数据包重组成原始信息。
序列编号从1开始,依次分配给每个数据包,直到整个数据都被拆装和传送完毕。这些数据包从编号为1的数据包开始按编号的递增顺序发送。
第一个数据传送包包含序列编号1 和字符串的头7个字节,其后的7个字节跟随序列编号2存放在另一个CAN数据帧中,再随后的7个字节与编号3一起,直到原始信息中所有的字节都被存放到CAN数据帧中并被传送。
传送的每个数据包(除了传送队列中的最后一个数据包)都装载着原始数据中的7个字节。而最后一个数据包的数据域的8个字节包含:数据包的序列编号和参数组至少一个字节的数据,余下未使用的字节全部设置为“0xFF”。
数据包被顺序接收。按照序列编号的顺序把多包消息的数据包重新组合成一多字节字符串。这个字符串被作为长信息的应答传送给应用程序模块。
2.2 协议数据单元
协议数据单元由七部分组成,分别是优先级、保留位、数据页、PDU格式、PDU特定域(可作为目标地址、组扩展或专用)、源地址和数据域。PDU被封装在一个或多个CAN数据帧中,通过物理介质传送到其他网络设备。每个CAN数据帧只能有一个PDU。
其中,优先权、扩展数据页、数据页、PDU格式、PDU特定域和源地址构成29位标志符;扩展数据页、数据页、PDU格式和PDU特定域构成参数组编号PGN;整体构成协议数据单元PDU。
2.2.1 请求PGN报文
定义:用于从一个或多个网络设备请求参数组
传输速率:用户子定义,推荐每秒请求不多于2或3次
数据长度:3字节
数据页:0
PDU格式:0xEA
PDU特定域:目标地址(全局或特定)
缺省优先级:0x06
参数组编号:0xEA00
参数定义:
0-2字节:被请求的参数组编号
对于特定目标地址的请求,目标地址必须做出响应。如果目标地址不支持请求的PGN,也必须发出一个NACK的响应以表明它不支持该PGN。有些PGN是多包的,因此一个单帧请求的响应可能有多个CAN数据帧。如果是全局请求,当一个节点不支持某个PGN时,不能发出NACK响应。
2.2.2 确认报文
定义:用来提供发送方与接收方之间的握手机制
传输速率:收到需要此类型的确认的PGN时
数据长度:8字节
数据页:0
PDU格式:0xE8
PDU特定域:目标地址 = 全局(0xFF)
缺省优先级:0x06
参数组编号:0xE800
参数定义:
0字节:控制字节。0表示肯定确认(ACK);1表示否定确认(NACK);2表示拒绝访问;3表示无法响应
1字节:组功能值(若适用)
2-4字节:0xFF
5-7字节:被请求报文的参数组编号
2.2.3 连接管理报文(TP.CM)
定义:用于9字节及以上数据参数组的传输
传输速度:由传送的参数组编号决定
数据长度:8字节
数据页:0
PDU格式:0xEC
PDU特定域:目标地址
缺省优先级:0x07
参数组编号:0xEC00
参数定义:第0字节为控制字,其它字节的定义依赖于第0字节控制字的值
(1)连接模式下的请求发送(TP.CM_RTS):指定目标地址
0字节:0x10,指定目标地址的请求发送(RTS)
1-2字节:整个报文大小的字节数
3字节:全部数据包数
4字节:每次CTS 中允许发送的最大帧数(Packets per block)
5-7字节:PGN(Parameter Group Number)
打包报文的参数组编号
(2)连接模式下的准许发送(TP.CM\_CTS):指定目标地址
0字节:0x11,指定目标地址的准许发送(CTS)
1字节:可发送的数据包数
2字节:下一个要发送的数据包编号
3-4字节:保留 (通常 0xFF)
5-7字节:PGN打包报文的参数组编号
(3)报文结束应答(TP.CM\_EndofMsgAck):指定目标地址
0字节:0x13,报文结束应答
1-2字节:整个报文的字节数
3字节:全部数据包个数
4字节:0xFF
5-7字节:打包报文的参数组编号
(4)放弃连接(TP.CM\_Abort):指定目标地址
0字节:0xFF,放弃连接
1-4字节:0xFF
5-7字节:打包报文的参数组编号
(5)广播公告报文(TP.CM\_BAM):全局目标地址
0字节:0x20,广播公告报文(BAM)
1-2字节:整个报文的字节数
3字节:全部数据包数
4字节:0xFF
5-7字节:打包报文的参数组编号
2.2.4 数据发送报文
定义:用于9字节及以上数据参数组的传输
传输速度:由传送的参数组编号决定
数据长度:8字节
数据页:0
PDU格式:0xEB
PDU特定域:目标地址
缺省优先级:0x07
参数组编号:0xEB00
参数定义:
0字节:数据包编号
1-7字节:报文数据
03 手写代码实现方法
下面简要介绍J1939数据链路层手工编程的实现要点。
3.1 多帧传输机制—接收
接收多于8字节的数据流有单播(特定目标地址)和广播(全局目标地址)两种情况,下面分别进行说明。
3.1.1 单播方式
单播方式接收多于8字节的数据流按照下列步骤进行。
(1)接收发送方的“连接模式下的请求发送(TP.CM_RTS):指定目标地址”报文
收到这类报文后,首先检查其是否同时满足下面两个条件,若满足继续下面的操作。
- 参数组编号为0xD700或符合本地指定CA的要求(参数组编号、发送CA的地址或名字)
- 接收到的“整个报文的字节数”和“全部数据包数”匹配
该检查通过后,获取CAN接收控制节点并对其初始化,再将该节点设置为“分段接收起始状态”。
若在上述过程中出现了任何异常,发送“放弃连接(TP.CM\_Abort):指定目标地址”报文。
(2)回发“连接模式下的准许发送(TP.CM_CTS):指定目标地址”报文
在接收并处理RTS报文之后进行,要求对方一次性将数据发完。报文发送成功后将对应CAN接收控制节点设置为“连续接收”状态。
(3)接收并整合数据
连续接收PGN为0xEB00的包并将有效数据依次存放到相应CAN接收控制节点中,待报文中的所有数据接收完毕后,发送“报文结束应答(TP.CM_EndofMsgAck):指定目标地址”并将对应CAN接收控制节点设置为“接收终止”状态。
数据接收过程中须满足以下几个要求,否则将发送“放弃连接(TP.CM_Abort):指定目标地址”报文并将对应CAN接收控制节点设置为“接收终止”状态。
- 数据包编号正确
- 收到相邻两个数据包的时间间隔小于750ms
- 发送CTS消息到收到第1个数据包的时间间隔小于1250ms
(4)处理接收到的报文
根据接收报文的参数组编号对其做出相应处理并将对应CAN接收控制节点还原。
3.1.2 广播方式
广播方式接收多于8字节的数据流按照下列步骤进行。
(1)接收发送方的“广播公告报文(TP.CM_BAM):全局目标地址”
收到这类报文后,首先检查其是否同时满足下面三个条件,若满足继续下面的操作。
- 参数组编号为0xFED8或符合本地任何一个CA的要求(参数组编号、发送CA的地址或名字)
- 目标地址为0xFF且源地址与接收报文匹配的CAN接收控制节点不存在
- 接收到的“整个报文的字节数”和“全部数据包数”匹配
该检查通过后,获取CAN接收控制节点并对其初始化,再将该节点设置为“连续接收”状态。
(2)接收并整合数据
连续接收PGN为0xEB00的包并将有效数据依次存放到相应CAN接收控制节点中,待报文中的所有数据接收完毕后,将对应CAN接收控制节点设置为“接收终止”状态。
数据接收过程中须满足以下几个要求,否则将对应CAN接收控制节点设置为“接收终止”状态。
- 数据包编号正确
- 收到相邻两帧数据的时间间隔小于750ms
(3)处理接收到的报文
根据接收报文的参数组编号对其做出相应处理并将对应CAN接收控制节点还原。
3.2 多帧传输机制-发送
发送多于8字节的数据流有单播(特定目标地址)和广播(全局目标地址)两种情况,下面分别进行说明。
3.2.1 单播方式
单播方式发送多于8字节的数据流按照下列步骤进行。
(1)准备工作
获取一个CAN发送控制节点,将其初始化并设置为“初始状态”。
(2)发送“连接模式下的请求发送(TP.CM_RTS):指定目标地址”报文
该报文发送成功后将对应CAN发送控制节点设置为“准许发送等待状态”。
(3)接收“连接模式下的准许发送(TP.CM_CTS):指定目标地址”报文
发送RTS后的1250ms内必须收到此报文,否则将发送“放弃连接(TP.CM_Abort):指定目标地址”报文并将对应CAN发送控制节点设置为“发送终止”状态。
这里称“可发送的数据包数”为0的CTS为“保持连接报文”,接收到此类报文后的1050ms内必须再次收到CTS,否则也将发送Abort报文并将对应CAN发送控制节点设置为“发送终止”状态。
注意:如果Abort报文发送失败,须将对应CAN发送控制节点设置为“放弃连接报文发送”状态,这样下一个周期将再次发送Abort报文。
如果在规定的时间内收到正确的CTS且其“可发送的数据包数”不为0,则发送第一个数据帧,同时将对应CAN发送控制节点设置为“连续发送”状态。
(4)连续发送数据
程序将每个发出的数据帧添加至CAN接收处理缓冲区,该操作完成后才继续发送下一个数据帧,直到本次CTS要求的数据包全部发完为止。在此过程中连续两个数据帧的发送时间间隔不能超过750ms,否则将发送Abort报文并将对应CAN发送控制节点设置为“发送终止”状态。
在连续发送数据的过程中不允许接收到除“保持连接报文”之外的CTS(收到此类报文后应停止数据帧的发送转而等待下一个CTS),否则也将发送Abort报文并将对应CAN发送控制节点设置为“发送终止”状态。
本次CTS要求的数据包发送完毕后,将对应CAN发送控制节点设置为“准许发送等待状态”,然后重复(3)和(4)的步骤,直到所有数据发送完成。这时将对应CAN发送控制节点设置为“报文结束应答等待状态”。
(5)接收“报文结束应答(TP.CM_EndofMsgAck):指定目标地址”
发送最后一个数据帧后的1250ms内必须收到此报文,否则将发送Abort报文并将对应CAN发送控制节点设置为“发送终止”状态。如果EndofMsgAck的“整个报文大小的字节数”和“全部数据包数”匹配,说明发送圆满完成,此时将对应CAN发送控制节点设置为“发送终止”状态并还原该节点。
3.2.2 广播方式
广播方式发送多于8字节的数据流按照下列步骤进行。
(1)准备工作
获取一个CAN发送控制节点,将其初始化并设置为“初始状态”。
(2)自发自收“广播公告报文(TP.CM_BAM):全局目标地址”
发送BAM并将对应CAN发送控制节点设置为“广播公告报文等待状态”。如果在之后的750ms内接收到自发的BAM,将节点设置为“连续发送”状态,并在50ms后启动数据帧发送;否则将节点设置为“发送终止”状态。
(3)连续发送数据
每个发出的数据帧都将被接收并添加至CAN接收处理缓冲区,该操作完成后延时50ms才继续发送下一个数据帧,直到全部数据包发完为止。每个数据帧发送和接收的时间间隔不能超过750ms,在此过程中对应CAN发送控制节点处于“数据报文等待状态”。
当所有数据包发送完成或出现任何异常时,将对应CAN发送控制节点设置为“发送终止”状态并还原该节点。
3.3 请求PGN报文
这里主要介绍接收到“请求PGN”报文时的处理方式,被请求的参数组编号分为“0xEE00”和“其它”两类。
3.3.1 请求PGN为0xEE00的参数组
收到此种报文后将对本地所有CA的状态进行判断,对于已经成功声明过地址的CA,立即发送“地址声明报文”;对于状态异常的CA,在0-153ms的随机时间后发送“不能声明地址报文”。
3.3.2 请求PGN为非0xEE00的参数组
如果请求参数组的PGN和SA满足本地CA的要求,发送“肯定确认”报文;否则发送“拒绝访问”报文(仅限于特定目标地址)。
04 AUTOSAR工具链实现方法
下面描述J1939数据链路层工具链实现的基本步骤,整个过程在ETAS的ISOLAR_AB 4.0和EB公司的EB Tresos工具下完成。
4.1 模块介绍
下面介绍J1939Tp的设计步骤和目标。
4.1.1 设计步骤
J1939Tp设计主要在ISOLAR-AB环境下进行。
(1)ARXML创建
在ISOLAR-AB中创建J1939Tp_EcucValues.arxml文件,再在其中创建如表4-1所示的AR Package。
(2)模块配置
依次配置Can、EcuC、J1939DcmCDD、PduR、CanIf、J1939Tp模块(如表4-2所列),图4-1为不同模块间的层级关系。
图 4-1: J1939Tp相关模块层级关系
4.1.2 设计目标
本文实现符合J1939协议的多字节发送和接收的协议栈。
(1)数据发送
发送一帧18字节的数据,如图4-2所示。
图 4-2: 多字节数据发送执行结果
(2)数据接收
实时接收一帧数据并将其存储至缓冲区中,如图4-3所示。
图 4-3: 多字节数据接收执行结果
4.2 J1939Tp模块创建和通用配置
首先需要在ISOLAR-B中创建J1939Tp模块及其ARXML文件,再对其进行“通用配置”,这是后续一系列配置操作的基础。
4.2.1 J1939Tp模块创建
按照图4-4和图4-5所示的步骤创建J1939Tp模块。
图 4-4: J1939Tp模块创建启动
图 4-5: J1939Tp模块创建操作
下面对J1939Tp模块创建过程做几点说明。
(1)AR Package路径现阶段必须为“/ETAS_Project/...”,否则在生成“RTA-BSW”后程序工程的许多配置项需要手动修改;后续新建ISOLAR-AB项目可尝试将该路径改为“/Foton_Project/...”。
(2)新建的ARXML文件存储至“StaticCfg”文件夹下,图3-2中步骤④和⑤的次序不能改变。
4.2.2 J1939Tp通用配置
按照图4-6所示进入J1939Tp通用配置界面,表4-3为其配置情况。
图 4-6: J1939Tp通用配置界面进入
4.3 Can配置
Can模块执行硬件操作并为上层模块提供与硬件无关的API接口。唯一一个能访问Can模块的上层模块是CanIf模块。
4.3.1 Can模块创建
按照图4-7和图4-8所示创建Can模块,用于J1939Tp模块相关报文的配置。
图 4-7: Can模块创建启动
图 4-8: Can模块创建配置
这样在ISOLAR-B中出现了2个Can模块(可能需要刷新操作),如图4-9所示。
图 4-9: Can模块创建后的效果
(1)统一路径操作
从图4-9可以看出,CanEcucValues.arxml和J1939Tp_EcucValues.arxml中各有一个Can模块,为统一配置,须将两者的路径设定为一致,这个操作在“AUTOSAR Explorer”中完成,具体参见图4-10和图4-11。
图 4-10: 进入”AUTOSAR Explorer”的操作
图 4-11: 在J1939Tp_EcucValues.arxml中创建Ar Package
将新建的“Ar Package”命名为“Can”,并将前面创建的Can模块拖入其中,执行效果如图4-12所示。
图 4-12: Can模块路径更改执行效果
(2)多余配置项删除
原有Can模块的配置参数存放在CanEcucValues.arxml中,新创建Can模块的配置参数存放在J1939Tp_EcucValues.arxml中,它们分别为Can模块的一部分。为防止BSW代码生成时产生重复性错误,需要把新创建Can模块下的“CanConfigSet”和“CanGeneral”删除,如图4-13所示。
图 4-13: Can模块多余配置项删除
(3)配置文件选择
在配置Can模块的参数时,双击“Can “Can” [CanEcucValues.arxml]”配置将改变CanEcucValues.arxml的内容,双击“Can “Can” [J1939Tp_EcucValues.arxml]”配置将改变J1939Tp_EcucValues.arxml的内容。由于本文希望将J1939Tp相关的配置存放在J1939Tp_EcucValues.arxml中,故需要双击“Can “Can” [J1939Tp_EcucValues.arxml]”来配置Can模块。
4.3.2 添加和配置硬件对象
添加J1939通信所需的3个“CanHardwareObjects”,如表4-4所列。
图4-14为添加Can硬件对象的方法,表4-5、表4-6和表4-7分别列出各硬件对象的配置参数。
图 4-14: Can硬件对象添加方法
4.4 Ecuc配置
在ECU配置时有一些信息需要多个BSW模块共享,在不好确定这些共享信息属于哪个模块的情况下,使用虚拟Ecuc模块来进行ECU配置参数定义。
4.4.1 Ecuc模块创建
按照图4-15和图4-16所示创建Ecuc模块,用于添加和配置J1939通信所用到的协议数据单元。
图 4-15: Ecuc模块创建启动
图 4-16: Ecuc模块创建配置
后续需要依次进行Ecuc模块的多余配置项删除和配置文件选择(无需统一路径操作),这些步骤与前文的Can模块操作基本相同。
4.4.2 添加和配置协议数据单元
添加J1939通信所需的8个“Pdus”,如表4-8所列。图4-17绘制出这些协议数据单元的功用。
表 4-8: Ecuc模块须添加的协议数据单元
图 4-17: Ecuc创建协议数据单元功用示意图
图4-18为添加Pdus的方法,表4-9、表4-10、表4-11、表4-12、表4-13、表4-14、表4-15和表4-16分别列出各协议数据单元的配置参数。
图 4-18: Ecuc协议数据单元添加方法
4.5 J1939DcmCDD配置
J1939DcmCDD模块用于测试J1939协议栈,即多于8字节数据的收发。
4.5.1 Cdd模块创建
按照图4-19和图4-20所示创建Cdd模块,并将其更名为J1939DcmCDD。
图 4-19: Cdd模块创建启动
图 4-20: Cdd模块创建配置
为刚刚创建的Cdd模块添加“CddComStackContribution -> CddPduRUpperLayerContribution”,再配置RxPdu和TxPdu各1个。
4.5.2 通信栈分配配置
Cdd模块的配置参数如表4-17所列。
4.6 PduR配置
PDU路由器模块为I-PDUs的路由提供服务。
4.6.1 PduR模块创建
按照图4-21和图4-22所示创建PduR模块。
图 4-21: PduR模块创建启动
图 4-22: PduR模块创建配置
后续需要依次进行PduR模块的多余配置项删除和配置文件选择(无需统一路径操作),这些步骤与前文的Can模块操作基本相同。
4.6.2 Bsw模块配置
需要对PduR上层或下层的BSW模块(与PduR有接口)进行配置,这里添加J1939Tp和J1939DcmCDD两个模块,图4-23为BSW模块的添加方法。
图 4-23: PduR相关BSW模块添加
J1939Tp和J1939DcmCDD模块的配置方法如表4-18和表4-19所列。
表 4-18: J1939Tp模块配置
表4-19: J1939DcmCDD模块配置
4.6.3 PduR路由路径配置
这里配置J1939DcmCDD和J1939Tp收发2个路由路径,如图4-24所示。
图 4-24: J1939DcmCDD和J1939Tp路由路径
图4-25为PduR添加路由路径的方法,表4-20和表4-21为收发2个方向的路由配置参数。
图 4-25: PduR路由路径添加
4.7 CanIf配置
CanIf模块位于底层CAN设备驱动和上层通信服务层之间,提供CAN驱动服务向上层通信层的接口。
4.7.1 CanIf模块创建
按照图4-26和图4-27所示创建CanIf模块。
图 4-26: CanIf模块创建启动
图 4-27: CanIf模块创建配置
后续需要依次进行CanIf模块的多余配置项删除和配置文件选择(无需统一路径操作),这些步骤与前文的Can模块操作基本相同。
表4-22列出了CanIf模块包含的配置箱。
4.7.2 CanIf私有配置
这个配置箱包含了CanIf的私有配置参数,如表4-23所列。
4.7.3 CanIf公有配置
这个配置箱包含了CanIf的公共配置参数,如表4-24所列。
①在重新生成RTA-BSW后可能需要手动重配
4.7.4 CanIf初始化配置
表4-25列出了CanIf初始化包含的子配置箱。
(1)CanIf初始化硬件对象句柄配置
添加2个接收句柄和1个发送句柄,如表4-26、表4-27和表4-28所列。
(2)CanIf缓冲区配置
(3)CanIf接收Pdu配置
添加2个接收Pdu,如表4-30和表4-31所列。
(4)CanIf发送Pdu配置
添加2个发送Pdu,如表4-32和表4-33所列。
表4-33: CanIf发送数据传输Pdu配置
4.7.5 CanIf控制驱动配置
无需配置。
4.7.6 CanIf处理配置
无需配置。
4.8 J1939Tp配置
前文已经进行了J1939Tp模块的创建和通用配置,下面进行其收发通道的配置。
4.8.1 J1939Tp接收通道配置
按照图4-28和图4-29所示进入J1939Tp接收通道配置界面,可以配置1个或多个接收通道。
图 4-28: J1939Tp配置界面进入
图 4-29: J1939Tp接收通道或发送通道添加
(1)接收通道通用配置
(2)接收连接管理报文
配置J1939传输协议的TP.CM帧,用于BAM和CMDT初始化连接,配置参数如表4-35所列。
表 4-35: J1939Tp接收通道接收连接管理报文参数配置
(3)接收数据报文
配置J1939传输协议的TP.DT帧,用于BAM和CMDT数据传输,配置参数如表4-36所列。
(4)接收参数组
配置被J1939传输层接收的参数组,配置参数如表4-37、表4-38和表4-39所列。
(5)发送连接管理报文
配置使用CMDT协议类型时接收方发送的TP.CM帧,配置参数如表4-40所列。
4.8.2 J1939Tp发送通道配置
可以配置1个或多个发送通道。
(1)发送通道通用配置
表4-41列出J1939Tp发送通道通用配置参数。
(2)接收连接管理报文
配置J1939传输协议的TP.CM帧,仅适用于CMDT协议类型(J1939TpTxProtocolType配置为“J1939TP_PROTOCOL_CMDT”或不配置),配置参数如表4-42所列。
(3)发送连接管理报文
配置J1939传输协议的TP.CM帧,用于BAM和CMDT初始化连接,配置参数如表4-43所列。
(4)发送数据报文
配置J1939传输协议的TP.DT帧,用于BAM和CMDT数据传输,配置参数如表4-44所列。
(5)发送参数组
配置被J1939传输层发送的参数组,配置参数如表4-45、表4-46和表4-47所列。
4.9.1 BswM
J1939Tp模块的初始化函数是J1939Tp_Init,其调用在BswM中配置。
(1)BswM行为创建
新建1个名为“BswM_AI_J1939TpInit”的行为,再为其添加1个“BswMUserCallOut”,在其中调用J1939Tp_Init()函数。
(2)BswM行为列表添加
将“BswM_AI_J1939TpInit”添加到“BswM_AL_BswMSwitchRun”行为列表中。
4.9.2 任务调度
须以10ms为周期循环调用J1939Tp_MainFunction,图4-30为其操作方法。
图 4-30: J1939Tp主函数周期性调用配置
CanIf
每次生成RTA-BSW后,需按照表4-48所列配置CanIf。
4.10 MCAL配置
由于J1939Tp新增了3个CAN硬件对象,故需要配置MCAL的CAN模块。
4.10.1 CAN过滤掩码增加
在CAN4通道增加1路过滤掩码,如图4-31所示。
图 4-31: CAN4通道过滤掩码添加
4.10.2 CAN硬件对象配置
手动添加3路“CanHardwareObject”,如图4-32所示;注意更改2个接收硬件对象的“CanFilterMaskRef”。
图 4-32: CAN硬件对象添加
4.11 软件集成
下面列出软件集成和代码编写的步骤。
4.11.1 静态代码移植
在ISOLAR-AB环境下生成J1939Tp模块的静态代码并将其拷贝到“...\src\BSW\src\BSW\Gen\J1939Tp”路径下,如图4-33所示。
图4-33: BSW静态代码生成
4.11.2 集成文件移植
在ISOLAR-AB环境下生成J1939Tp模块的集成代码并将J1939Tp_Cfg_SchM.h文件拷贝到“...\src\INFRA\schm\inc”路径下。
4.11.3 内存映射文件移植
将J1939Tp_MemMap.h和J1939Tp_Cfg_MemMap.h内存映射头文件拷贝到“...\src\INFRA\memmap”文件夹下,这类文件在生成RTE时输出程序文件模板,需要手动优化。
4.11.4 生成操作系统代码
在“RTA-OS”工具中重新生成OS代码。
4.11.5 J1939DcmCDD代码实现
创建J1939DcmCDD.c和J1939DcmCDD.h程序文件并在其中完成下列函数的实现:
J1939DcmCDD_StartOfReception;J1939DcmCDD_CopyRxData;
J1939DcmCDD_CopyTxData;J1939DcmCDD_TpRxIndication;J1939DcmCDD_TpTxConfirmation。
4.11.6 Hightec配置
在Hightec中添加下列头文件路径。
4.12软件调试
这里记录J1939Tp协议栈的调试过程,调试环境为PCAN,CAN通道为CAN4,波特率250K。
4.12.1 调试代码编写
数据发送:在J1939DcmCDD.c中编写J1939DcmCDD_MainFunction函数,实现18字节数据的CAN发送;再在Os_SWC中以500ms为周期调用之。
数据接收:禁止上述18字节数据的周期性发送。
4.12.2 J1939发送调试
图4-34为J1939数据发送调试截图。VCU以500ms为周期发送18字节数据,包括1个连接管理报文和3个数据报文,这4个报文之间的发送间隔为60ms(这个时间间隔没有搞明白原因)。
图 4-34: J1939发送调试截图
尽管多于8字节数据的报文发送正确,但在调试少于或等于8字节报文的发送时出现了问题,数据无法发出。
经过研读AUTOSAR规范和分析静态代码,找到了出现上述问题的原因,是由于J1939Tp_Transmit函数的缺陷导致的,如图4-35所示。
图 4-35: J1939Tp发送函数问题分析
经过进一步分析,发现J1939TpTxPgDynLength配置项的功用并没有体现在J1939Tp的静态代码中,故对J1939Tp\_Transmit函数进行了如下改动(见图4-36)。
图 4-36: J1939Tp发送函数修改后的代码
4.13 J1939接收调试
图4-37为J1939数据接收调试截图,第1、3、4、5个报文为PC机发送,第2、6个报文为VCU回馈。
图 4-37: J1939接收调试截图
修改静态代码前后,VCU均能正确接收到多于8字节和少于或等于8字节报文的数据。
05 下期预告
在AUTOSAR规范中,内存映射(Memory Map)似乎是非核心的模块,但在解决各类工程问题(如数据标定区增加了几个标定量就越界)的过程中,往往发挥着至关重要的作用。
在下期中,我们讨论下内存映射的功用和实现方法,着重分享内存映射在AUTOSAR CP工程实践中的妙用。
END
作者:李漠尘
来源:汽车电子与软件
推荐阅读:
- 车身座椅调节功能软件组件设计
- AP AUTOSAR中的传输层安全协议(TLS)技术详解
- 英飞凌Aurix™ TC3xx 芯片内核详解——TriCore™上下文机制
- AP AUTOSAR R24-11与R21-11的主要差异分析
更多汽车电子干货请关注汽车电子与软件专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。