【AUTOSAR 基础软件】J1939TP模块详解

文章包含了AUTOSAR基础软件(BSW)中J1939TP模块相关的内容详解。本文从AUTOSAR规范解析,ISOLAR-AB配置以及模块相关代码分析三个维度来帮读者清晰的认识和了解J1939TP这一基础软件模块。文中涉及的ISOLAR-AB配置以及模块相关代码都是依托于ETAS提供的工具链来配置与生成的,与AUTOSAR规范之间可能会有些许的出入,但总体的功能要点与处理流程都应该是一致的。

文中AUTOSAR规范解析章节主要来自AUTOSAR规范内容,而ISOLAR-AB的配置内容主要来自ETAS在哔哩哔哩网站中的ETAS易特驰账号。J1939TP模块实现了SAE-J1939-21传输协议,主要完成了J1939(包括超过8字节的)报文的传输,使应用组件访问不同长度J1939报文中的信号与普通CAN报文中的信号保持一致方式。

目录

AUTOSAR规范解析

概述

通信方式

时序图 

ISOLAR-AB配置 

系统描述

EcuC

COM 

ComSignal

ComIPdus

PduR

J1939TP

General

TxChannel

RxChannel

CanIf 

代码解析 

动态配置代码

集成代码 

静态代码


AUTOSAR规范解析

概述

AUTOSAR的传输协议(TP, Transport Protocal)模块是对某个传输协议国际标准的实现,如ISO15765-2(对应CANTP模块)或者J1939(对应J1939TP模块)。

我们都知道CAN2.0的一个CAN数据帧最多传输8字节数据,而在汽车电子领域有数据(或者参数组,也就是一组数据)可能需要超过8字节来传输。而TP模块正是可以实现多个CAN数据帧的组包,形成超过8字节的参数组。发送的时候,也会将超过8字节数据拆包发送。下面是J1939TP模块在AUTOSAR通信栈中的中的位置。

可以从上图看到,J1939TP模块联通PDUR和CANIF模块,实现PDUR到CANIF时的拆包和CANIF到PDUR时的组包功能。最终,J1939TP会将数据经过PDUR后依次存放到COM的Buffer中。


通信方式

J1939协议定义了三种通信方式:广播(BAM, Broadcast Announce Message)、基于连接的数据传输(Connection Mode Data Transfer)、直接数据传输(DIRECT)。如果数据多余8字节,则会通过BAM或者CMDT来发送,而小于等于8字节时,直接发送。

  • DIRECT:在AUTOSAR的J1939TP模块中,会判断需要发送的数据的长度,如果小于等于8字节,则会通过函数J1939Tp_Internal_DirectTransmit()直接发送。两台设备间没有多余的交互的过程,如下图所示。

  • BAM:字节数大于8字节的数据传输方式简单的实现是BAM,他是一种一对多的传输方式。BAM只有发送者向接收者的交互过程,第1帧数据是告诉接收者准备好开始接收,后面会逐个发送数据。第1帧包含PDU字节长度,数据帧个数,PGN(PGN1到3,分别是8位,PGN共24位)的信息。以下是BAM通信过程。

  • CMDT:另外一个大于8字节的数据传输方式是CMDT,这是一种需要接收者和发送者间进行交互的方式,是点对点的传输方式。下图介绍了一次CMDT传输方式,具体就不详述了,前文《【标准解析】商用车CAN网络通信标准(J1939)》包含了其中的介绍。

下图是J1939TP在AutoSAR框架下的数据流图,注意区分在J1939TP之上的数据传输命名为N-SDU,而在J1939TP之下为N-PDU,这里后边在配置的过程中会使用相关的概念来区分。


时序图 

下图为直接传输的时序动态图。

下图为BAM广播的时序动态图。 

下图为CMDT点对点通信时序动态图。


ISOLAR-AB配置 

你可以在后边发现,各个涉及的BSW模块的ISOLAR-B的配置都独立建立在一个arxml中,这是为了方便在不同工程中完成移植,减少重复的BSW手动配置操作。下面的整个配置按照从上到下的原则依次描述。


系统描述

首先,我们需要再ISOLAR-A中完成J1939系统信号的描述,我们既可以直接移植已完成项目的arxml中的package,或者通过导入DBC的方式,最后完成如下图的系统描述。

系统描述中既有J1939的网络节点和ECU之间的包含关系和各个收发报文的信息(Networks),用户还需要针对Ecus里的控制器以及连接器等信息、Pdus、Frames等内容进行检查,防止移植过程中某些命名不匹配的原因发生问题。


EcuC

手动配置J1939对应的Pdu数据描述,如前文所说,在CANTP上层的SDU描述了针对PG100~PG400在COM与PduR以及PduR与CANTP之间的pdu传输,共有4*2八个pdu的描述。

在CANTP下层NPDU针对J1939TP与CANIF之间两种通信方式(BAM和CMDT)的两种帧(CM、DT)的pdu描述,又因为这两种帧既需要收,又需要发,所以一共需要2*2*2八个pdu描述。

可以从下图看到,这些配置都是在独立的arxml进行配置,后续所有的配置均采用这种方式。


COM 

ComSignal

针对每个PGN,这里的示例都包含了一个Signal,这里我们建立四个ComSignal,并完成对ISOLAR-A的系统信号引用。


ComIPdus

针对每个PGN,完成对应IPdus的建立,并正确引用刚才在EcuC建立的COM与PDUR之间数据交互的引用和对系统信号的包含。


PduR

首先完成PduRBswModuless的建立,引用建立的J1939TP(若工程没有J1939TP模块,则新建此模块),并完成一些层级上的配置。

然后,完成PduRRoutingTable的配置,针对四个PGN,建立四条路由关系,每条路由关系包括在EcuC建立好PDU数据描述中,其中源为到PduR的数据描述,目的为从PduR出去的数据描述。


J1939TP

General

模块通用配置都比较寻常,这里就不一一描述了,


TxChannel

发送通道的配置分为BAM和CMDT两种方式,先介绍BAM的发送通道配置。

首先是发送通道的通用配置,包含最大的数据长度和使用协议的类型,这里类型选择BAM。

然后我们在这个发送通道对应的TxCmNpdu,引用之前在EcuC中建立的BAM对应的发送CM帧数据描述。

 再然后,我们在对应的TxDtNPdu,引用之前在EcuC中建立的BAM对应的发送DT帧数据描述。

最后,在J1939TpPgs中建立此通道发送的包属性,包括J1939TpTxPgPGN(100),还有这里是多包的发送,所以选择在J1939TpTxNSdu中正确引用之前EcuC建立的PG100由PduR到J1939TP的数据描述引用。

对于点对点的通信方式TxCmNpdu与TxDtNPdu和J1939TpPgs配置与BAM一致,选择对应使用的数据描述引用即可,发送通道的通用配置里记着选择协议是CMDT,还有一处不同的是因为CMDT需要接收CM帧作为流控帧的输入,所以需要配置J1939TpRxFcNPdu,选择CMDT对应的接收的CM帧数据描述。最后J1939TpPgs引用之前EcuC建立的PG300由PduR到J1939TP的数据描述引用。


RxChannel

接受通道同样分为BAM和CMDT两种通信方式建立两个通道。我们先以BAM为例,首先选择协议BAM,因为是BAM,所以Rx的DA填255,SA则给零即可,其仅适用于具有固定SA并使用带有MetaData的N-PDUs的通道。

然后,建立通道内的J1939TpRxCmNPdu,引用之前在EcuC中建立的BAM对应的接收CM帧数据描述。

再然后,建立通道内的J1939TpRxDtNPdu,引用之前在EcuC中建立的BAM对应的接收DT帧数据描述。

最后,在J1939TpPgs中建立此通道发送的包属性,包括J1939TpRxPgPGN(100),还有这里是多包的发送,所以选择在J1939TpTxNSdu中正确引用之前EcuC建立的PG200由J1939TP到PduR的数据描述引用。

对于点对点的通信方式RxCmNpdu与RxDtNPdu和J1939TpPgs配置与BAM一致,选择对应使用的数据描述引用即可,发送通道的通用配置里记着选择协议是CMDT,还有一处不同的是因为CMDT需要发送CM帧作为流控帧,所以需要配置J1939TpRxFcNPdu,选择CMDT对应的接收的CM帧数据描述。最后J1939TpPgs引用之前EcuC建立的PG400由J1939TP到PduR的数据描述引用。


CanIf 

本来还有CAN模块的mailbox配置,这里因为其不生成代码,只做CanIf的引用,这里就不赘述了。

CanIf针对BAM和CMDT两种通信方式分别针对CM与DT两帧建立TxPduCfg,正确配置CANID以及TxBuffer(Txbuffer也为手配,引用CAN模块mailbox,这里就不赘述了)的引用,并引用之前在EcuC对应的BAM/CMDT对应的发送CM/DT帧数据描述。

接收也需要按照BAM和CMDT两种通信方式分别针对CM与DT两帧建立RxPduCfg,并引用对应建立的HrhCfgs并对应到接收的MailBox,Canif里的配置跟普通由工具生成的CAN配置配置项都一致,这里就不赘述了。


代码解析 

动态配置代码

J1939TP生成的动态配置代码如下图所示。PduR生成的动态配置代码如下图所示。

  • J1939Tp_PBcfg.c:J1939Tp_TxChannelConfParam_cs与J1939Tp_RxChannelConfParam_cs结构体包含发送与接收相关通道配置。J1939Tp_TxPgConfigParam_cs与J1939Tp_RxPgConfigParam_cs结构体包含发送与接收通道内中的包信息。


集成代码 

MemMap与SchM等就不在这里赘述了。J1939TP提供了J1939Tp_RxIndication给CanIf模块用作接收回调函数,并提供J1939Tp_TxConfirmation给给CanIf模块用作成功发送回调函数。

 

#ifndef	J1939TP_CBK_H
#define J1939TP_CBK_H

#include "ComStack_Types.h"
#include "J1939Tp_Cfg.h"

/**
 * \defgroup J1939TP_CBK_H    J1939Tp - AUTOSAR interfaces to CanIf (Lower Layer)
 * This interface exports J1939Tp call-backs which are invoked from CanIf to Component J1939Tp\n
 * To use this interface include the header <b>J1939Tp_Cbk.h</b>
 */

/*
 ***************************************************************************************************
 *    Function prototypes
 ***************************************************************************************************
 */

/**
 * @ingroup J1939TP_CBK_H
 *
 * [J1939TP0108] Call-back function provided to CanIf, it shall call this function after a successful reception of a Rx Pdu meant for J1939Tp\n
 *\n
 * @param[in]         J1939TpRxPduId - Rx N-Pdu Id/ Rx FC N-Pdu Id on which the CAN message was received\n
 * @param[in]         J1939TpRxPduPtr - Pointer to Pdu Info Structure which contains the length (DLC) of the received CAN message and a pointer to the received data\n
 */

#define J1939TP_START_SEC_ROM_CODE
#include "J1939Tp_Cfg_MemMap.h"

extern FUNC( void, J1939TP_CODE ) J1939Tp_RxIndication(
                                                  VAR( PduIdType, AUTOMATIC )     J1939TpRxPduId,
                                                  P2VAR( PduInfoType, AUTOMATIC, J1939TP_APPL_DATA )  J1939TpRxPduPtr
                                                  );

/**
 * @ingroup J1939TP_CBK_H
 *
 * [J1939TP0112] Call-back function provided to CanIf, it shall call this function after a successful transmission of a Tx Pdu which was requested to be transmitted by J1939Tp\n
 *\n
 * @param[in]         J1939TpTxPduId - Confirmation Tx N-Pdu Id/ Confirmation Tx FC N-Pdu Id on which the CAN message was transmitted\n
 */

extern FUNC( void, J1939TP_CODE ) J1939Tp_TxConfirmation( VAR( PduIdType, AUTOMATIC ) J1939TpTxPduId );
#define J1939TP_STOP_SEC_ROM_CODE
#include "J1939Tp_Cfg_MemMap.h"

#endif
/*#ifndef _J1939TP_CBK_H*/

静态代码

主要介绍常见的静态代码涉及API说明,具体详细完整的介绍读者可以参考《AUTOSAR_CP_SWS_SAEJ1939TransportLayer.pdf》以及《RTA-BSWReferenceGuide.pdf》。

  • J1939Tp_Init:J1939TP模块初始化。
  • J1939Tp_Shutdown:停止J1939报文接收。
  • J1939Tp_Transmit:请求一个J1939报文的发送。

十六宿舍 原创作品,转载必须标注原文链接。

©2023 Yang Li. All rights reserved.

欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值