AUTOSAR J1939Tp 传输方式详解
1. Overview
J1939Tp在autosar中的位置如下:

1939Tp的目的是重新分解和组装超过8 byte的PGNs (N-SDUs),发送和接收过程如下所示。只要PDU最大字节数配置超过8byte, 但是运行过程中没有超过8byte, 同样会通过J1939传输。1939Tp应该支持两种传输模式, 即BAM(广播模式)和CMDT(点对点传输模式)。

2. Initialization and Shutdown

如果development error detection (DET) 使能,除了J1939Tp_GetVersionInfo,其他函数在J1939Tp_Init()之前调度将报错(J1939TP_E_UNINIT)。
3. Sequence
3.1 直接传输模式(Direct PG)
3.1.1 Direct PG DATA Flow
当数据长度小于8byte,采用直接发送方式

3.1.2 PG报文接收过程
PDUR、J1939Tp、CanIf之间的函数调度关系如下图:

3.1.3 PG报文发送过程
PDUR、J1939Tp、CanIf之间的函数调度关系如下图:

3.2 点对点传输模式(CMDT)
3.2.1 CMDT data flow
传输PGN超过8byte, 点对点传输模式, J1939Tp应执行所有与CMDT相关的时序约束(Tr, Th, T1, T2, T3, T4)

3.2.2 CMDT报文接收过程
PDUR、J1939Tp、CanIf之间的函数调度关系如下图:

部分函数说明:
1)J1939Tp_RxIndication:CANIF接收报文时在中断中调度,通知J1939
2)当接收到一个TP.CM_RTS应该先通过PduR_J1939TpStartOfReception通知上层PDUR,返回可用buffer,使用它来计算TP的包数字段。 J1939Tp不应有内部PDU buffer,它请求数据,通过PduR_J1939TpCopyTxData()发送给上层,并提供接收到的数据,或者通过PduR_J1939TpCopyRxData()直接接收数据。为了保证数据连续性,此时整个上层buffer必须锁定。
4)PduR_J1939TpStartOfReception or PduR_J1939TpCopyRxData返回没有足够的buffer时,应调度PduR_J1939TpCopyRxData将info->SduLength设置为0,直到有足够的buffer或者超时。J1939Tp应发送TP.CM_CTS等待报文(packets number设置为0)
7) call J1939Tp_TxConfirmation() 用于CANIF通知j1939tp传输是否成功。
10) call PduR_J1939TpRxIndication() 接收完成后通知PDUR,此时整个上层buffer解锁。

3.2.3 CMDT报文发送过程
PDUR、J1939Tp、CanIf之间的函数调度关系如下图:

部分函数说明:
1)Pdur层请求发送J1939Tp_Transmit()(参数:ID / data length/ payload N-SDU,可能包含SA DA和优先级)
2)当配置好BAM.CMDT和SA/DA,报文会按照协议传输;
3)对于带有metainfo的N-SDUs来说,这些参数是可选择的,如果没有配置SA或者DA,metadata中的数据将被使用。如果传输协议没有配置,将根据DA选择:DA为0xff是BAM, 其他则是CMDT.
4)J1939Tp_Transmit()只能用ID / data length, 不能用payload N-SDU,只有MetaData
5)在PDUR请求之后,J1939Tp模块应该初始化发送:a TP.CM_RTS frame
6)对于CMDT:当发送、接收失败时,应该给其他ECU发送TP.Conn_Abort报文
J1939TpTxDynamicBlockCalculation:
J1939TpTxMaxPacketsPerBlock:
J1939TpRxPacketsPerBlock
3.3 Handling of Retry during CMDT Transmission

1) PDUR_1939TpStartOfReception or PduR_J1939TpCopyRxData返回没有足够的buffer时,应调度PduR_J1939TpCopyRxData将info->SduLength设置为0,直到有足够的buffer或者超时。J1939Tp应发送TP.CM_CTS等待报文(packets number设置为0)
- J1939TpRxRetrySupport使能,J1939Tp根据J1939TpRxDynamicBufferRatio将PduR_J1939TpStartOfReception返回的值适配为可用缓冲区大小,然后使用它来计算TP的包数字段
- J1939TpTxRetrySupport使能,J1939Tp应调度PduR_J1939TpCopyTxData
- 当接收到TP.CM_CTS等待报文时,J1939Tp应等待下一个TP.CM_CTS报文。
- J1939TpRxRetrySupport使能,当J1939Tp接收到一个TP.CM_CTS报文已经发送过的数据,应调度PduR_J1939TpCopyTxData将TpDataState设置为TP_DATARETRY,TxTpDataCnt设置为将要发送的byte数。需要重传的字节数是从请求包相对于当前包的位置计算出来的
- J1939TpTxRetrySupport不使能,当J1939Tp接收到一个TP.CM_CTS报文已经发送过的数据,应停止发送(PduR_J1939TpTxConfirmation with E_NOT_OK.⌋或者发送TP.Conn_Abort报文)
- J1939TpRxRetrySupport使能,当接收到一系列错误时,J1939Tp应该在发送完最后TP.DT报文后,发送一个TP.CM_CTS报文请求当前block中最后一个正确发送的包。
- 带有一系列错误报文的TP.DT或者同一block中TP.DT后面有一系列错误报文都应该被丢弃。这种情况PduR_J1939TpCopyRxData不被调度
- J1939TpRxRetrySupport不使能,当接收到一系列错误时,应退出接收模式
3.4 广播发送模式(BAM)
3.4.1 BAM Data Flow
J1939Tp应用BAM相关时序约束(50ms, Tr, T1), BAM接收超时,J1939Tp应退出接收会话(PduR_J1939TpRxIndication() with state E_NOT_OK)。BAM传输协议用于广播通信(即1对n通信,如诊断中的功能寻址)。在本例中,传输的PG的总长度为3个7字节的block,必须依次传输。

3.4.2 BAM报文接收过程

3.4.3 BAM报文发送过程

3.5 接收失败情况
3.5.1 停止接收,不做任何反应的情况
1)PduR_J1939TpStartOfReception 返回BUFREQ_E_NOT_OK or BUFREQ_E_OVFL
2)协议不对应,(BAM与CMDT)
3)SA/DA与配置不对应
4)对于CMDT类型,发送TP.Conn_Abort报文,错误原因返回1
3.5.2 接收失败需要发送通知的情况
PduR_J1939TpRxIndication()返回E_NOT_OK时:
1)PduR_J1939TpStartOfReception 的bufferSizePtr小于该N-SDU需要的数据长度
2)PduR_J1939TpCopyRxData 返回BUFREQ_E_NOT_OK,
3)J1939Tp_CancelReceive 被调度
4)对于CMDT类型,发送TP.Conn_Abort报文,调度完PduR_J1939TpStartOfReception后错误原因返回1(已经有一个或以上connection managed sessions,不能支持另一个),或返回2(系统资源被其他任务需要,所以这个connection managed sessions被终止。)
3.6 N-SDU Buffer Management
J1939Tp不应有内部PDU buffer。它请求数据,通过PduR_J1939TpCopyTxData()发送给上层,并提供接收到的数据,或者通过PduR_J1939TpCopyRxData()直接接收数据。
为了保证数据连续性,整个上层buffer在发送和接收过程中必须锁定。
PDUR调度J1939Tp_Transmit()时发送被初始化,调度PduR_J1939TpTxConfirmation时解锁。

J1939调度PduR_J1939TpStartOfReception()时接收报文被初始化,调度PduR_J1939TpRxIndication()时解锁。

4. Relationship between N-SDU and N-PDU in J1939Tp

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
