2023-08-21 16:48:00 +08:00

1004 lines
25 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/******************************************************************************
| 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;
}