AUTOSAR J1939Tp 传输方式详解

1. Overview

J1939Tp在autosar中的位置如下:

AUTOSAR J1939Tp 传输方式详解_第1张图片

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

AUTOSAR J1939Tp 传输方式详解_第2张图片

2. Initialization and Shutdown

AUTOSAR J1939Tp 传输方式详解_第3张图片

如果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,采用直接发送方式

AUTOSAR J1939Tp 传输方式详解_第4张图片

3.1.2 PG报文接收过程

PDUR、J1939Tp、CanIf之间的函数调度关系如下图:

AUTOSAR J1939Tp 传输方式详解_第5张图片

3.1.3 PG报文发送过程

PDUR、J1939Tp、CanIf之间的函数调度关系如下图:

AUTOSAR J1939Tp 传输方式详解_第6张图片

3.2 点对点传输模式(CMDT)

3.2.1 CMDT data flow

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

AUTOSAR J1939Tp 传输方式详解_第7张图片

3.2.2 CMDT报文接收过程

PDUR、J1939Tp、CanIf之间的函数调度关系如下图:

AUTOSAR J1939Tp 传输方式详解_第8张图片

部分函数说明:

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解锁。

AUTOSAR J1939Tp 传输方式详解_第9张图片

 

 

3.2.3 CMDT报文发送过程

PDUR、J1939Tp、CanIf之间的函数调度关系如下图:

AUTOSAR J1939Tp 传输方式详解_第10张图片

部分函数说明:

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

AUTOSAR J1939Tp 传输方式详解_第11张图片

1) PDUR_1939TpStartOfReception or PduR_J1939TpCopyRxData返回没有足够的buffer时,应调度PduR_J1939TpCopyRxData将info->SduLength设置为0,直到有足够的buffer或者超时。J1939Tp应发送TP.CM_CTS等待报文(packets number设置为0)

  1. J1939TpRxRetrySupport使能,J1939Tp根据J1939TpRxDynamicBufferRatio将PduR_J1939TpStartOfReception返回的值适配为可用缓冲区大小,然后使用它来计算TP的包数字段
  2. J1939TpTxRetrySupport使能,J1939Tp应调度PduR_J1939TpCopyTxData
  3. 当接收到TP.CM_CTS等待报文时,J1939Tp应等待下一个TP.CM_CTS报文。
  4. J1939TpRxRetrySupport使能,当J1939Tp接收到一个TP.CM_CTS报文已经发送过的数据,应调度PduR_J1939TpCopyTxData将TpDataState设置为TP_DATARETRY,TxTpDataCnt设置为将要发送的byte数。需要重传的字节数是从请求包相对于当前包的位置计算出来的
  5. J1939TpTxRetrySupport不使能,当J1939Tp接收到一个TP.CM_CTS报文已经发送过的数据,应停止发送(PduR_J1939TpTxConfirmation with E_NOT_OK.⌋或者发送TP.Conn_Abort报文)
  6. J1939TpRxRetrySupport使能,当接收到一系列错误时,J1939Tp应该在发送完最后TP.DT报文后,发送一个TP.CM_CTS报文请求当前block中最后一个正确发送的包。
  7. 带有一系列错误报文的TP.DT或者同一block中TP.DT后面有一系列错误报文都应该被丢弃。这种情况PduR_J1939TpCopyRxData不被调度
  8. 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,必须依次传输。

AUTOSAR J1939Tp 传输方式详解_第12张图片

3.4.2 BAM报文接收过程

AUTOSAR J1939Tp 传输方式详解_第13张图片

 

3.4.3 BAM报文发送过程

AUTOSAR J1939Tp 传输方式详解_第14张图片

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时解锁。

AUTOSAR J1939Tp 传输方式详解_第15张图片

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

AUTOSAR J1939Tp 传输方式详解_第16张图片

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

 

AUTOSAR J1939Tp 传输方式详解_第17张图片

 

你可能感兴趣的:(AUTOSAR,COM,J1939Tp,AUTOSAR,嵌入式硬件,单片机)