J1939Tp在autosar中的位置如下:
1939Tp的目的是重新分解和组装超过8 byte的PGNs (N-SDUs),发送和接收过程如下所示。只要PDU最大字节数配置超过8byte, 但是运行过程中没有超过8byte, 同样会通过J1939传输。1939Tp应该支持两种传输模式, 即BAM(广播模式)和CMDT(点对点传输模式)。
如果development error detection (DET) 使能,除了J1939Tp_GetVersionInfo,其他函数在J1939Tp_Init()之前调度将报错(J1939TP_E_UNINIT)。
当数据长度小于8byte,采用直接发送方式
PDUR、J1939Tp、CanIf之间的函数调度关系如下图:
PDUR、J1939Tp、CanIf之间的函数调度关系如下图:
传输PGN超过8byte, 点对点传输模式, J1939Tp应执行所有与CMDT相关的时序约束(Tr, Th, T1, T2, T3, T4)
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解锁。
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
1) PDUR_1939TpStartOfReception or PduR_J1939TpCopyRxData返回没有足够的buffer时,应调度PduR_J1939TpCopyRxData将info->SduLength设置为0,直到有足够的buffer或者超时。J1939Tp应发送TP.CM_CTS等待报文(packets number设置为0)
J1939Tp应用BAM相关时序约束(50ms, Tr, T1), BAM接收超时,J1939Tp应退出接收会话(PduR_J1939TpRxIndication() with state E_NOT_OK)。BAM传输协议用于广播通信(即1对n通信,如诊断中的功能寻址)。在本例中,传输的PG的总长度为3个7字节的block,必须依次传输。
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被终止。)
J1939Tp不应有内部PDU buffer。它请求数据,通过PduR_J1939TpCopyTxData()发送给上层,并提供接收到的数据,或者通过PduR_J1939TpCopyRxData()直接接收数据。
为了保证数据连续性,整个上层buffer在发送和接收过程中必须锁定。
PDUR调度J1939Tp_Transmit()时发送被初始化,调度PduR_J1939TpTxConfirmation时解锁。
J1939调度PduR_J1939TpStartOfReception()时接收报文被初始化,调度PduR_J1939TpRxIndication()时解锁。