/****************************************************************************** | File Name : CanTp.c | Description: Manages segmenting of data in the send direction, | assembling of data in the receive direction, | and monitoring of the data stream. |------------------------------------------------------------------------------ | (c) This software is the proprietary of Wenzhou Changjiang AutoMobile (DAMING) | All rights are reserved by DAMING. |------------------------------------------------------------------------------ | Initials Name Company | -------- -------------------- ---------------------------------------- | DAMING |------------------------------------------------------------------------------ | R E V I S I O N H I S T O R Y |------------------------------------------------------------------------------ | Date Version Author Description | ---------- -------- ------ ---------------------------------------- | 2015-9-1 V1.0 LZY *****************************************************************************/ /* TP层理论上 可以以 500us 以内的间隔接收连续帧 但是考虑到APP层其他进程的进行 CAN中断太过频繁会造成时间片的偏移,所以流控帧 的 STmin定为5ms 诊断报文接收丢弃策略: 单帧 接收中 响应第一个单帧 响应超时前(1000 ms) 丢弃后来的所有帧 多帧 接收中 可被 (单帧) (多帧首帧) 打断 多帧 接受完毕后 响应超时前(1000 ms) 丢弃后来的所有帧 上层响应报文后,TP层开始接收新的一帧 上层通过TP层发送报文,则TP层认为已经响应当前报文。(除 负响应 78外,接收到78负响应 延长1个S3时间的响应时间 5S) S3 : 接收到报文 至 反馈完毕(以调用发送函数为标志) 读接口为 ACTIVE 否则为 INACTIVE 反馈响应时间:1S TP层占用10% APP层占用90% 即900ms APP层必须将反馈发送至 TP层 (无反馈发送DL = 0) APP层超时,TP层将中止该帧报文的响应流程 回到空闲状态 准备接受下一帧 78负响应 延长1个S3时间的响应时间 5S */ /****************************************************************************** * Description: : Include File Section ******************************************************************************/ //#include "global.h" #include "CanTp.h" /****************************************************************************** * Description: : Global Variable Definition Section ******************************************************************************/ /****************************************************************************** * Description: : Static Variable Definition Section ******************************************************************************/ #define DAMING_TRUE DCM_TRUE #define DAMING_FALSE DCM_FALSE #define DAMING_ACTIVE DCM_ACTIVE #define DAMING_INACTIVE DCM_INACTIVE static uint8 SaCanTp_u_RxSFBuffer[8]; /*单帧buffer*/ static TeCanTp_e_TpSts SeCanTp_e_TpSts;/*TP层工作状态*/ static uint8 SeCanTp_u_BS; static uint8 SeCanTp_u_STmin; static uint8 SaCanTp_u_RxMFBuffer[CANTP_MFLEN_MAX];/*多帧接收buffer*/ static uint16 SeCanTp_u_RxLen; static TeCanTp_e_AddrMethod SeCanTp_e_AddrMethod;/*寻址方式*/ static uint16 SeCanTp_u_RxMFDataCnt; static uint8 SeCanTp_u_LastSN; static uint16 SeCanTp_u_Timer; static TeCanTp_e_MFTimerSwitch SeCanTp_e_TimerSwitch; static TeCanTp_e_TxSts SeCanTp_e_TxSts;/*发送状态*/ static uint8 SaCanTp_u_TxDataBuffer[CANTP_MFLEN_MAX]; static uint8 SaCanTp_u_TxBuffer[8]; static uint16 SeCanTp_u_TxLen; static uint16 SeCanTp_u_TxMFIndex; static TeCanTp_e_MFTxSts SeCanTp_e_MFTxSts; static uint8 SeCanTp_u_MFTxSN; static uint8 SeCanTp_u_MFTxSpacing; static uint16 SeCanTp_w_RespTimer; /*反馈计时器*/ static uint8 SeCanTp_u_RespFlag; /****************************************************************************** * Description: : Static Function Prototype Declaration *****************************************************************************/ /****************************************************************************** * Description: : Write User Function Code *****************************************************************************/ /****************************************************************************** *函数名称 : *参数 : TeCanTp_e_AddrMethod* LeCanTp_p_AddrMethod , Addressing Method uint16* LeCanTp_p_DL , Data Length uint8* LeCanTp_p_DataAddr array of data pointer *返回值 : *描述 : get frame data *编辑时间 : *备注 : *****************************************************************************/ TeCanTp_e_RxBufferSts GetCanTp_e_RxBufferSts(uint8* LeCanTp_p_AddrMethod , uint16* LeCanTp_p_DL , uint8** LeCanTp_p_DataAddr) { TeCanTp_e_RxBufferSts LeCanTp_e_RxSts; if(SeCanTp_e_TpSts == CeCanTp_e_SF_Get) { SeCanTp_e_TpSts = CeCanTp_e_Answer; *LeCanTp_p_AddrMethod = SeCanTp_e_AddrMethod; *LeCanTp_p_DL = SeCanTp_u_RxLen; *LeCanTp_p_DataAddr = SaCanTp_u_RxSFBuffer; LeCanTp_e_RxSts = CeCanTp_e_Full; } else if(SeCanTp_e_TpSts == CeCanTp_e_MF_Get) { SeCanTp_e_TpSts = CeCanTp_e_Answer; *LeCanTp_p_AddrMethod = SeCanTp_e_AddrMethod; *LeCanTp_p_DL = SeCanTp_u_RxLen; *LeCanTp_p_DataAddr = SaCanTp_u_RxMFBuffer; LeCanTp_e_RxSts = CeCanTp_e_Full; } else { LeCanTp_e_RxSts = CeCanTp_e_Empty; } return LeCanTp_e_RxSts; } /****************************************************************************** *函数名称 : *参数 : *返回值 : *描述 : CanIf调用 给TP数据函数 物理寻址 *编辑时间 : *备注 : *****************************************************************************/ void RxIndicationCanTP_AddrPhy_Message(CanIf_HwHandleType LeCanTp_e_Hrh, CanIf_CanIdType LeCanTp_e_CanId, CanIf_CanDlcType LeCanTp_e_CanDlc, const CanIf_CanDataType LeCanTp_e_CanSduPtr[]) { uint8 LeCanTp_u_FrameInfo = 0; uint8 LeCanTp_u_DataIndex; (void)LeCanTp_e_Hrh; (void)LeCanTp_e_CanDlc; if(LeCanTp_e_CanId == CANTP_ADDR_PHY_REQ) { LeCanTp_u_FrameInfo = LeCanTp_e_CanSduPtr[0] >> 4; if((SeCanTp_e_TpSts == CeCanTp_e_SF_Get)/*已接收到单帧*/ ||(SeCanTp_e_TpSts == CeCanTp_e_MF_Get)/*已接收到多帧*/ ||(SeCanTp_e_TpSts == CeCanTp_e_Answer))/*当前正在响应*/ { if((SeCanTp_e_TpSts == CeCanTp_e_Answer) && (SeCanTp_e_MFTxSts == CeCanTp_e_TX_FCWaiting))/*反馈阶段 发送多帧数据*/ { if(LeCanTp_u_FrameInfo == 3)/*FC*/ { if((LeCanTp_e_CanSduPtr[0]&0x0F) == 0x00)/*FS判断 正常*/ { SeCanTp_e_MFTxSts = CeCanTp_e_TX_CFGaving; if(LeCanTp_e_CanSduPtr[1] == 0) { SeCanTp_u_BS = CANTP_MFLEN_MAX; } else { SeCanTp_u_BS = LeCanTp_e_CanSduPtr[1]; } if(SeCanTp_u_STmin < 0x7FU) { SeCanTp_u_STmin = ((LeCanTp_e_CanSduPtr[2]-1)/CANTP_TASK)+1; } else { SeCanTp_u_STmin = 0; } SeCanTp_u_MFTxSpacing = 0;/*开始最小间隔计时*/ SeCanTp_u_Timer = 0; } else if((LeCanTp_e_CanSduPtr[0]&0x0F) == 0x01)/*FS判断 等待*/ { /*等待 清空计时器 再等一个 bs*/ SeCanTp_u_Timer = 0; } else { /*过载丢帧*/ SeCanTp_e_MFTxSts = CeCanTp_e_TX_Idel; SeCanTp_e_TpSts = CeCanTp_e_Idel; SeCanTp_e_TxSts = CeCanTp_e_Tx_Idle; } } } else{/*丢帧*/} } else { if(LeCanTp_u_FrameInfo == 0)/*SF*/ { SeCanTp_u_RxLen = LeCanTp_e_CanSduPtr[0]&0x0f; if((SeCanTp_u_RxLen < 8) && (SeCanTp_u_RxLen > 0)) { SeCanTp_e_TpSts = CeCanTp_e_SF_Get;/*单帧接收*/ SeCanTp_e_AddrMethod = CeCanTp_e_Physical; for(LeCanTp_u_DataIndex = 0;LeCanTp_u_DataIndex < SeCanTp_u_RxLen;LeCanTp_u_DataIndex++) { SaCanTp_u_RxSFBuffer[LeCanTp_u_DataIndex] = LeCanTp_e_CanSduPtr[LeCanTp_u_DataIndex+1]; } SeCanTp_u_RespFlag = DAMING_TRUE; SeCanTp_w_RespTimer = 1000U; } else {/*丢帧*/} } else if(LeCanTp_u_FrameInfo == 1)/*FF*/ { SeCanTp_u_RxLen =(uint16)(((uint16)(LeCanTp_e_CanSduPtr[0] & 0x0f) << 8) + (uint16)LeCanTp_e_CanSduPtr[1]); if(SeCanTp_u_RxLen > CANTP_MFLEN_MAX) // add for 15765-2-6.5.2.2 { /*丢帧*/ /*直接回复过载流控帧*/ SaCanTp_u_TxBuffer[0] = 0x30; SaCanTp_u_TxBuffer[1] = 2; SaCanTp_u_TxBuffer[2] = CANTP_RX_STMIN; TransmitCanIf_Buffer(CANTP_RESP_CANID,8,SaCanTp_u_TxBuffer); } else if(SeCanTp_u_RxLen > 7) { SeCanTp_e_AddrMethod = CeCanTp_e_Physical; /*获得多帧长度*/ SeCanTp_u_RxMFDataCnt = 0; /*获得前6个数据*/ for(LeCanTp_u_DataIndex = 2;LeCanTp_u_DataIndex < 8;LeCanTp_u_DataIndex++) { SaCanTp_u_RxMFBuffer[SeCanTp_u_RxMFDataCnt] = LeCanTp_e_CanSduPtr[LeCanTp_u_DataIndex]; SeCanTp_u_RxMFDataCnt++; } SeCanTp_u_LastSN = 1; /*直接回复流控帧*/ SaCanTp_u_TxBuffer[0] = 0x30; SaCanTp_u_TxBuffer[1] = 0; SaCanTp_u_TxBuffer[2] = CANTP_RX_STMIN; TransmitCanIf_Buffer(CANTP_RESP_CANID,8,SaCanTp_u_TxBuffer); SeCanTp_e_TpSts = CeCanTp_e_MF_CFTakein;/*等待接收后续帧*/ SeCanTp_e_TimerSwitch = CeCanTp_e_Cr; SeCanTp_u_Timer = 0; } else {/*丢帧*/} } else if(LeCanTp_u_FrameInfo == 2)/*CF*/ { if(SeCanTp_e_TpSts == CeCanTp_e_MF_CFTakein) { /*检验SN*/ SeCanTp_u_Timer = 0; if((LeCanTp_e_CanSduPtr[0]&0x0F) == (SeCanTp_u_LastSN & 0x0F)) { /*获得数据*/ SeCanTp_u_LastSN++; if((LeCanTp_e_CanDlc < 8)&&(LeCanTp_e_CanDlc >0)&&(SeCanTp_u_RxMFDataCnt < (SeCanTp_u_RxLen - LeCanTp_e_CanDlc))) { SeCanTp_e_TpSts = CeCanTp_e_Idel; // 错误的DLC } else { for(LeCanTp_u_DataIndex = 1;LeCanTp_u_DataIndex < 8;LeCanTp_u_DataIndex++) { if(SeCanTp_u_RxMFDataCnt < SeCanTp_u_RxLen) { SaCanTp_u_RxMFBuffer[SeCanTp_u_RxMFDataCnt] = LeCanTp_e_CanSduPtr[LeCanTp_u_DataIndex]; SeCanTp_u_RxMFDataCnt++; } else { /*数据接收完毕*/ SeCanTp_e_TpSts = CeCanTp_e_MF_Get; SeCanTp_u_RespFlag = DAMING_TRUE; SeCanTp_w_RespTimer = 1000U; break; } if(SeCanTp_u_RxMFDataCnt == SeCanTp_u_RxLen) { /*数据接收完毕*/ SeCanTp_e_TpSts = CeCanTp_e_MF_Get; SeCanTp_u_RespFlag = DAMING_TRUE; SeCanTp_w_RespTimer = 1000U; break; } } } } else { /*SN错误 丢帧*/ SeCanTp_e_TpSts = CeCanTp_e_Idel; } } else { /*当前不是 多帧接受后续帧阶段 丢帧*/ } } else { /*不接受 流控帧 与 其他状态帧*/ } } } else { } } /****************************************************************************** *函数名称 : *参数 : *返回值 : *描述 : CanIf调用 给TP数据函数 功能寻址 *编辑时间 : *备注 : *****************************************************************************/ #if (CANTP_ADDRFUNC_MF_FORBID == DAMING_TRUE) void RxIndicationCanTP_AddrFunc_Message(CanIf_HwHandleType LeCanTp_e_Hrh, CanIf_CanIdType LeCanTp_e_CanId, CanIf_CanDlcType LeCanTp_e_CanDlc, const CanIf_CanDataType LeCanTp_e_CanSduPtr[]) { uint8 LeCanTp_u_FrameInfo = 0; uint8 LeCanTp_u_DataIndex; (void)LeCanTp_e_Hrh; (void)LeCanTp_e_CanDlc; if(LeCanTp_e_CanId == CANTP_ADDR_FUNC_REQ) { LeCanTp_u_FrameInfo = LeCanTp_e_CanSduPtr[0] >> 4; if((SeCanTp_e_TpSts == CeCanTp_e_SF_Get)/*已接收到单帧*/ ||(SeCanTp_e_TpSts == CeCanTp_e_MF_Get)/*已接收到多帧*/ ||(SeCanTp_e_TpSts == CeCanTp_e_Answer))/*当前正在响应*/ { if((SeCanTp_e_TpSts == CeCanTp_e_Answer) && (SeCanTp_e_MFTxSts == CeCanTp_e_TX_FCWaiting))/*反馈阶段 发送多帧数据*/ { if(LeCanTp_u_FrameInfo == 3)/*FC*/ { if((LeCanTp_e_CanSduPtr[0]&0x0F) == 0x00)/*FS判断 正常*/ { SeCanTp_e_MFTxSts = CeCanTp_e_TX_CFGaving; if(LeCanTp_e_CanSduPtr[1] == 0) { SeCanTp_u_BS = CANTP_MFLEN_MAX; } else { SeCanTp_u_BS = LeCanTp_e_CanSduPtr[1]; } if(SeCanTp_u_STmin < 0x7FU) { SeCanTp_u_STmin = ((LeCanTp_e_CanSduPtr[2]-1)/CANTP_TASK)+1; } else { SeCanTp_u_STmin = 0; } SeCanTp_u_MFTxSpacing = 0;/*开始最小间隔计时*/ } else if((LeCanTp_e_CanSduPtr[0]&0x0F) == 0x01)/*FS判断 等待*/ { /*等待 清空计时器 再等一个 bs*/ SeCanTp_u_Timer = 0; } else { /*过载丢帧*/ SeCanTp_e_MFTxSts = CeCanTp_e_TX_Idel; SeCanTp_e_TpSts = CeCanTp_e_Idel; SeCanTp_e_TxSts = CeCanTp_e_Tx_Idle; } } } } else { if(LeCanTp_u_FrameInfo == 0)/*SF*/ { SeCanTp_u_RxLen = LeCanTp_e_CanSduPtr[0]&0x0f; if((SeCanTp_u_RxLen < 8) && (SeCanTp_u_RxLen > 0)) { SeCanTp_e_TpSts = CeCanTp_e_SF_Get;/*单帧接收*/ SeCanTp_e_AddrMethod = CeCanTp_e_Functional; for(LeCanTp_u_DataIndex = 0;LeCanTp_u_DataIndex < SeCanTp_u_RxLen;LeCanTp_u_DataIndex++) { SaCanTp_u_RxSFBuffer[LeCanTp_u_DataIndex] = LeCanTp_e_CanSduPtr[LeCanTp_u_DataIndex+1]; } SeCanTp_u_RespFlag = DAMING_TRUE; SeCanTp_w_RespTimer = 1000U; } else {/*丢帧*/} } else if(LeCanTp_u_FrameInfo == 1)/*FF*/ { SeCanTp_u_RxLen =(uint16)(((uint16)(LeCanTp_e_CanSduPtr[0] & 0x0f) << 8) + (uint16)LeCanTp_e_CanSduPtr[1]); if(SeCanTp_u_RxLen > 7) { SeCanTp_e_AddrMethod = CeCanTp_e_Functional; /*获得多帧长度*/ //SeCanTp_u_RxLen =(uint16)(((uint16)(LeCanTp_e_CanSduPtr[0] & 0x0f) << 8) + (uint16)LeCanTp_e_CanSduPtr[1]); SeCanTp_u_RxMFDataCnt = 0; /*获得前6个数据*/ for(LeCanTp_u_DataIndex = 2;LeCanTp_u_DataIndex < 8;LeCanTp_u_DataIndex++) { SaCanTp_u_RxMFBuffer[SeCanTp_u_RxMFDataCnt] = LeCanTp_e_CanSduPtr[LeCanTp_u_DataIndex]; SeCanTp_u_RxMFDataCnt++; } SeCanTp_u_LastSN = 1; /*直接回复流控帧*/ SaCanTp_u_TxBuffer[0] = 0x30; SaCanTp_u_TxBuffer[1] = 0; SaCanTp_u_TxBuffer[2] = CANTP_RX_STMIN; TransmitCanIf_Buffer(CANTP_RESP_CANID,8,SaCanTp_u_TxBuffer); SeCanTp_e_TpSts = CeCanTp_e_MF_CFTakein;/*等待接收后续帧*/ SeCanTp_e_TimerSwitch = CeCanTp_e_Cr; SeCanTp_u_Timer = 0; } else {/*丢帧*/} } else if(LeCanTp_u_FrameInfo == 2)/*CF*/ { if(SeCanTp_e_TpSts == CeCanTp_e_MF_CFTakein) { /*检验SN*/ if((LeCanTp_e_CanSduPtr[0]&0x0F) == ((SeCanTp_u_LastSN+1)&0x0F)) { /*获得数据*/ SeCanTp_u_LastSN++; for(LeCanTp_u_DataIndex = 1;LeCanTp_u_DataIndex < 8;LeCanTp_u_DataIndex++) { if(SeCanTp_u_RxMFDataCnt < SeCanTp_u_RxLen) { SaCanTp_u_RxMFBuffer[SeCanTp_u_RxMFDataCnt] = LeCanTp_e_CanSduPtr[LeCanTp_u_DataIndex]; SeCanTp_u_RxMFDataCnt++; } else { /*数据接收完毕*/ SeCanTp_e_TpSts = CeCanTp_e_MF_Get; SeCanTp_u_RespFlag = DAMING_TRUE; SeCanTp_w_RespTimer = 1000U; break; } if(SeCanTp_u_RxMFDataCnt == SeCanTp_u_RxLen) { /*数据接收完毕*/ SeCanTp_e_TpSts = CeCanTp_e_MF_Get; SeCanTp_u_RespFlag = DAMING_TRUE; SeCanTp_w_RespTimer = 1000U; break; } } } else { /*SN错误 丢帧*/ SeCanTp_e_TpSts = CeCanTp_e_Idel; } } else { /*当前不是 多帧接受后续帧阶段 丢帧*/ } } else { /*不接受 流控帧 与 其他状态帧*/ } } } else {} } #else void RxIndicationCanTP_AddrFunc_Message(CanIf_HwHandleType LeCanTp_e_Hrh, CanIf_CanIdType LeCanTp_e_CanId, CanIf_CanDlcType LeCanTp_e_CanDlc, const CanIf_CanDataType LeCanTp_e_CanSduPtr[]) { uint8 LeCanTp_u_FrameInfo = 0; uint8 LeCanTp_u_DataIndex; (void)LeCanTp_e_Hrh; (void)LeCanTp_e_CanDlc; if(LeCanTp_e_CanId == CANTP_ADDR_FUNC_REQ) { LeCanTp_u_FrameInfo = LeCanTp_e_CanSduPtr[0] >> 4; if((SeCanTp_e_TpSts == CeCanTp_e_SF_Get)/*已接收到单帧*/ ||(SeCanTp_e_TpSts == CeCanTp_e_MF_Get)/*已接收到多帧*/ ||(SeCanTp_e_TpSts == CeCanTp_e_Answer))/*当前正在响应*/ { /*丢帧*/ } else { if(LeCanTp_u_FrameInfo == 0)/*SF*/ { SeCanTp_u_RxLen = LeCanTp_e_CanSduPtr[0]&0x0f; if(SeCanTp_u_RxLen < 8) { SeCanTp_e_TpSts = CeCanTp_e_SF_Get;/*单帧接收*/ SeCanTp_e_AddrMethod = CeCanTp_e_Functional; for(LeCanTp_u_DataIndex = 0;LeCanTp_u_DataIndex < SeCanTp_u_RxLen;LeCanTp_u_DataIndex++) { SaCanTp_u_RxSFBuffer[LeCanTp_u_DataIndex] = LeCanTp_e_CanSduPtr[LeCanTp_u_DataIndex+1]; } SeCanTp_u_RespFlag = DAMING_TRUE; SeCanTp_w_RespTimer = 1000U; } else {/*丢帧*/} } } } else {} } #endif /****************************************************************************** *函数名称 : *参数 : *返回值 : *描述 : 发送 *编辑时间 : *备注 : *****************************************************************************/ TeCanTp_e_TxResult SetCanTp_TxBuffer(uint16 LeCanTp_p_DL , const uint8 LeCanTp_p_DataAddr[]) { TeCanTp_e_TxResult LeCanTp_e_TxResult; uint16 LeCanTp_s_Index; /*只有在反馈阶段 可以发送数据*/ if ((SeCanTp_e_TpSts == CeCanTp_e_Answer) && (SeCanTp_e_TxSts == CeCanTp_e_Tx_Idle)) { SeCanTp_u_RespFlag = DAMING_FALSE; SeCanTp_w_RespTimer = 1000U; if(LeCanTp_p_DL == 0) { /*该报文无反馈*/ SeCanTp_e_TpSts = CeCanTp_e_Idel; } else if(LeCanTp_p_DL < 8) { /*单帧 直接发送*/ SaCanTp_u_TxBuffer[0] = (uint8)LeCanTp_p_DL; for(LeCanTp_s_Index = 1; LeCanTp_s_Index < 8; LeCanTp_s_Index++) { SaCanTp_u_TxBuffer[LeCanTp_s_Index] = 0x55; } for(LeCanTp_s_Index = 0; LeCanTp_s_Index < LeCanTp_p_DL; LeCanTp_s_Index++) { SaCanTp_u_TxBuffer[LeCanTp_s_Index + 1] = LeCanTp_p_DataAddr[LeCanTp_s_Index]; } TransmitCanIf_Buffer(CANTP_RESP_CANID,8,SaCanTp_u_TxBuffer); SeCanTp_e_TpSts = CeCanTp_e_Idel; } else { /*多帧报文*/ SeCanTp_e_TxSts = CeCanTp_e_Tx_Busy; /*数据提取*/ for(LeCanTp_s_Index = 0; LeCanTp_s_Index < LeCanTp_p_DL; LeCanTp_s_Index++) { SaCanTp_u_TxDataBuffer[LeCanTp_s_Index] = LeCanTp_p_DataAddr[LeCanTp_s_Index]; } SeCanTp_u_TxLen = LeCanTp_p_DL; /*发送首帧*/ SaCanTp_u_TxBuffer[0] = 0x10 + (uint8)(LeCanTp_p_DL >> 8); SaCanTp_u_TxBuffer[1] = (uint8)(LeCanTp_p_DL & 0x00ff); for(SeCanTp_u_TxMFIndex = 0; SeCanTp_u_TxMFIndex < 6; SeCanTp_u_TxMFIndex++) { SaCanTp_u_TxBuffer[SeCanTp_u_TxMFIndex+2] = SaCanTp_u_TxDataBuffer[SeCanTp_u_TxMFIndex]; } TransmitCanIf_Buffer(CANTP_RESP_CANID,8,SaCanTp_u_TxBuffer); SeCanTp_e_TimerSwitch = CeCanTp_e_Bs; SeCanTp_u_Timer = 0; SeCanTp_u_MFTxSN = 1; SeCanTp_e_MFTxSts = CeCanTp_e_TX_FCWaiting; } LeCanTp_e_TxResult = CeCanTp_e_Tx_Succeed; } else { LeCanTp_e_TxResult = CeCanTp_e_Tx_Wrong; } return LeCanTp_e_TxResult; } /****************************************************************************** *函数名称 : *参数 : *返回值 : *描述 : 78负响应 发送响应后 不中断当前 反馈流程 *编辑时间 : *备注 : *****************************************************************************/ TeCanTp_e_TxResult SetCanTp_Tx_78Neg(uint16 LeCanTp_p_DL , const uint8 LeCanTp_p_DataAddr[]) { TeCanTp_e_TxResult LeCanTp_e_TxResult; uint8 LeCanTp_u_Index; /*只有在反馈阶段 可以发送数据*/ if ((SeCanTp_e_TpSts == CeCanTp_e_Answer) && (SeCanTp_e_TxSts == CeCanTp_e_Tx_Idle)) { if(LeCanTp_p_DL < 8) { /*单帧 直接发送*/ SaCanTp_u_TxBuffer[0] = (uint8)LeCanTp_p_DL; for(LeCanTp_u_Index = 1; LeCanTp_u_Index < 8; LeCanTp_u_Index++) { SaCanTp_u_TxBuffer[LeCanTp_u_Index] = 0x55; } for(LeCanTp_u_Index = 0; LeCanTp_u_Index < LeCanTp_p_DL; LeCanTp_u_Index++) { SaCanTp_u_TxBuffer[LeCanTp_u_Index + 1] = LeCanTp_p_DataAddr[LeCanTp_u_Index]; } TransmitCanIf_Buffer(CANTP_RESP_CANID,8,SaCanTp_u_TxBuffer); LeCanTp_e_TxResult = CeCanTp_e_Tx_Succeed; SeCanTp_w_RespTimer = 0u; } else { LeCanTp_e_TxResult = CeCanTp_e_Tx_Wrong; } } else { LeCanTp_e_TxResult = CeCanTp_e_Tx_Wrong; } return LeCanTp_e_TxResult; } /****************************************************************************** *函数名称 : *参数 : *返回值 : *描述 : *编辑时间 : *备注 : *****************************************************************************/ void InitCanTp_Parameter(void) { uint8 LeCanTp_u_InitIndex; for(LeCanTp_u_InitIndex = 0; LeCanTp_u_InitIndex<8 ; LeCanTp_u_InitIndex++) { SaCanTp_u_RxSFBuffer[LeCanTp_u_InitIndex] = 0;/*单帧buffer*/ SaCanTp_u_TxBuffer[LeCanTp_u_InitIndex] = 0; SaCanTp_u_TxDataBuffer[LeCanTp_u_InitIndex] = 0; SaCanTp_u_RxMFBuffer[LeCanTp_u_InitIndex] = 0;/*多帧接收buffer*/ } SeCanTp_e_TpSts = CeCanTp_e_Idel;/*TP层工作状态*/ SeCanTp_u_BS = 0; SeCanTp_u_STmin = 10; SeCanTp_u_RxLen = 0; SeCanTp_e_AddrMethod = CeCanTp_e_Physical;/*寻址方式*/ SeCanTp_u_RxMFDataCnt = 0; SeCanTp_u_LastSN = 0; SeCanTp_u_Timer = 0; SeCanTp_e_TimerSwitch = 0; SeCanTp_e_TxSts = CeCanTp_e_Tx_Idle;/*发送状态*/ SeCanTp_u_TxLen = 0; SeCanTp_u_TxMFIndex = 0; SeCanTp_e_MFTxSts = CeCanTp_e_TX_Idel; SeCanTp_u_MFTxSN = 0; SeCanTp_u_MFTxSpacing = 0; SeCanTp_w_RespTimer = 1000U; /*反馈计时器*/ SeCanTp_u_RespFlag = DAMING_FALSE; } /****************************************************************************** *函数名称 : *参数 : *返回值 : *描述 : 主函数 用于发送 多帧 与 监控超时时间 *编辑时间 : *备注 : *****************************************************************************/ void MngCanTp_MainFunction(void) { uint8 LeCanTp_u_Index; if(SeCanTp_e_TpSts == CeCanTp_e_MF_CFTakein)/*超时*/ { if(SeCanTp_e_TimerSwitch == CeCanTp_e_Cr) { if(SeCanTp_u_Timer > CANTP_CR_TIMEOUT) { /*超时*/ SeCanTp_e_TpSts = CeCanTp_e_Idel; } else { SeCanTp_u_Timer++; } } else { SeCanTp_e_TimerSwitch = CeCanTp_e_Cr; SeCanTp_u_Timer = 0; } } else { } if(SeCanTp_u_RespFlag == DAMING_TRUE)/*APP反馈超时*/ { if(SeCanTp_w_RespTimer > CANTP_APP_RESP_78NEG) { /*超时*/ SeCanTp_e_TpSts = CeCanTp_e_Idel; SeCanTp_u_RespFlag = DAMING_FALSE; SeCanTp_w_RespTimer = 1000U; } else { SeCanTp_w_RespTimer++; } } else { SeCanTp_w_RespTimer = 1000U; } if(SeCanTp_e_TpSts == CeCanTp_e_Answer) { if(SeCanTp_e_MFTxSts == CeCanTp_e_TX_FCWaiting)/*FC等待超时*/ { if(SeCanTp_e_TimerSwitch == CeCanTp_e_Bs) { if(SeCanTp_u_Timer > CANTP_BS_TIMEOUT) { /*超时*/ SeCanTp_e_MFTxSts = CeCanTp_e_TX_Idel; SeCanTp_e_TpSts = CeCanTp_e_Idel; SeCanTp_e_TxSts = CeCanTp_e_Tx_Idle; } else { SeCanTp_u_Timer++; } } else { SeCanTp_e_TimerSwitch = CeCanTp_e_Bs; SeCanTp_u_Timer = 0; } } else {} if(SeCanTp_e_MFTxSts == CeCanTp_e_TX_CFGaving)/*发送*/ { /*CF*/ SeCanTp_u_MFTxSpacing++; if(SeCanTp_u_BS > 0) { if(SeCanTp_u_MFTxSpacing > SeCanTp_u_STmin) { SeCanTp_u_MFTxSpacing = 1; if(SeCanTp_u_TxMFIndex < (SeCanTp_u_TxLen-7)) { SaCanTp_u_TxBuffer[0] = 0x20 + SeCanTp_u_MFTxSN; for(LeCanTp_u_Index = 0; LeCanTp_u_Index < 7; LeCanTp_u_Index++) { SaCanTp_u_TxBuffer[LeCanTp_u_Index + 1] = SaCanTp_u_TxDataBuffer[SeCanTp_u_TxMFIndex++]; } TransmitCanIf_Buffer(CANTP_RESP_CANID,8,SaCanTp_u_TxBuffer); SeCanTp_u_MFTxSN += 1; SeCanTp_u_MFTxSN &= 0x0f; if(SeCanTp_u_BS == 1u) { SeCanTp_e_MFTxSts = CeCanTp_e_TX_FCWaiting;/*等流控帧*/ SeCanTp_u_Timer = 0; SeCanTp_e_TimerSwitch = CeCanTp_e_Bs; } else { SeCanTp_u_BS--; } } else { /*最后一帧*/ uint8 LeCanTp_u_Cnt = SeCanTp_u_TxLen - SeCanTp_u_TxMFIndex; SaCanTp_u_TxBuffer[0] = 0x20 + SeCanTp_u_MFTxSN; for(LeCanTp_u_Index = 1; LeCanTp_u_Index < 8; LeCanTp_u_Index++) { SaCanTp_u_TxBuffer[LeCanTp_u_Index] = 0x55; } for(LeCanTp_u_Index = 0; LeCanTp_u_Index < LeCanTp_u_Cnt; LeCanTp_u_Index++) { SaCanTp_u_TxBuffer[LeCanTp_u_Index + 1] = SaCanTp_u_TxDataBuffer[SeCanTp_u_TxMFIndex++]; } TransmitCanIf_Buffer(CANTP_RESP_CANID,8,SaCanTp_u_TxBuffer); SeCanTp_e_MFTxSts = CeCanTp_e_TX_Idel; SeCanTp_e_TpSts = CeCanTp_e_Idel; SeCanTp_e_TxSts = CeCanTp_e_Tx_Idle; SeCanTp_u_BS = 0; } } else {} } else { SeCanTp_e_MFTxSts = CeCanTp_e_TX_FCWaiting;/*等流控帧*/ SeCanTp_u_Timer = 0; SeCanTp_e_TimerSwitch = CeCanTp_e_Bs; } } else { } } else { } } /****************************************************************************** *函数名称 : *参数 : *返回值 : *描述 : S3 状态函数 S3 : 接收到报文 至 反馈完毕(以调用发送函数为标志) 读接口为 DAMING_ACTIVE 否则为 DAMING_INACTIVE *编辑时间 : *备注 : *****************************************************************************/ uint8 GetCanTp_u_S3Sts(void) { uint8 LeCanTp_u_Ret; if(SeCanTp_e_TpSts == CeCanTp_e_Idel) { LeCanTp_u_Ret = DAMING_ACTIVE; } else { LeCanTp_u_Ret = DAMING_INACTIVE; } return LeCanTp_u_Ret; }