AUTOSAR J1939Tp 传输方式详解

1. Overview

J1939Tp在autosar中的位置如下:

0e01e5f5b1864444a2d438ceef73f023.png

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

3951de7077154396a3eba73d14d9eb8b.png

2. Initialization and Shutdown

c1e3927a24af4230905831dc9897244d.png

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

e21a5faf534640d686481e697dabfd6c.png

3.1.2 PG报文接收过程

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

086b92d08d7b4e51ac37599c1c91225c.png

3.1.3 PG报文发送过程

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

252843f5ff3d4e38a86c006cb6435ac1.png

3.2 点对点传输模式(CMDT)

3.2.1 CMDT data flow

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

180d6127e52c4206bcc0843fb5616be6.png

3.2.2 CMDT报文接收过程

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

73093c4b1fc34c1ba1fe8cd13e667ecc.png

部分函数说明:

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

662d974912de4e538ce4065ac1930c9c.png

 

 

3.2.3 CMDT报文发送过程

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

01fbfc448cd7429bb0cb720199bfeee9.png

部分函数说明:

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

81bbe2c072bf4501a72ac7a65c322ec7.png

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,必须依次传输。

e7235490fe0c4265ab66ae0b594bdaee.png

3.4.2 BAM报文接收过程

832e7ab72f75414a905f002098799af5.png

 

3.4.3 BAM报文发送过程

87d1b6c6bc0844399aa3cd021cffe572.png

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

20f3bc1ad85e4da6b47da6d6245bcce1.png

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

b5221b4975e34110bec39dd9c676061a.png

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

 

1318bbdbc1e44e4cb7def307a3cf26ef.png

 


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

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部