文章包含了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规范解析
概述
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.
欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。