📄 drvcan.c
字号:
{
CAN->sMsgObj[u8MsgIfNum].u32MASK1 = 0;
CAN->sMsgObj[u8MsgIfNum].u32MASK2 = ((MaskMsg->u32Id&0x7FF)<<2) ;
}
else /* extended ID*/
{
CAN->sMsgObj[u8MsgIfNum].u32MASK1 = (MaskMsg->u32Id) &0xFFFF;
CAN->sMsgObj[u8MsgIfNum].u32MASK2 = ((MaskMsg->u32Id)&0x1FF0000)>>16 ;
}
CAN->sMsgObj[u8MsgIfNum].MASK2.MXTD = MaskMsg->u8Xtd;
CAN->sMsgObj[u8MsgIfNum].MASK2.MDIR = MaskMsg->u8Dir;
CAN->sMsgObj[u8MsgIfNum].MCON.UMASK = 1;
/* update the contents needed for transmission*/
CAN->sMsgObj[u8MsgIfNum].u32CMASK = CAN_CMASK_WRRD| CAN_CMASK_MASK;
CAN->sMsgObj[u8MsgIfNum].u32CREQ = 1 + u8MsgObj;
return E_SUCCESS;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvCAN_SetRxMsgObj */
/* */
/* Parameter: */
/* - u8MsgObj: specifies the Message object number, from 0 to 31. */
/* - u8idType: specifies the identifier type of the frames that will be transmitted */
/* using this message object. This parameter can be one of the following values: */
/* - CAN_STD_ID (standard ID, 11-bit) */
/* - CAN_EXT_ID (extended ID, 29-bit) */
/* - u32id: specifies the identifier used for acceptance filtering. */
/* - u8singleOrFifoLast: specifies the end-of-buffer indicator. */
/* This parameter can be one of the following values: */
/* - TRUE: for a single receive object or a FIFO receive */
/* object that is the last one of the FIFO. */
/* - FALSE: for a FIFO receive object that is not the last one. */
/* */
/* Returns: */
/* - E_SUCCESS: SUCCESS */
/* - E_DRVCAN_NO_USEFUL_INTERFACE: No useful interface */
/* Description: */
/* The function is used to configure a receive message object. */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvCAN_SetRxMsgObj(uint8_t u8MsgObj, uint8_t u8idType, uint32_t u32id, uint8_t u8singleOrFifoLast)
{
uint8_t u8MsgIfNum=0;
if ((u8MsgIfNum = GetFreeIF()) == 2) /* Check Free Interface for configure */
{
return E_DRVCAN_NO_USEFUL_INTERFACE;
}
/* Command Setting */
CAN->sMsgObj[u8MsgIfNum].u32CMASK = CAN_CMASK_WRRD| CAN_CMASK_MASK | CAN_CMASK_ARB |
CAN_CMASK_CONTROL | CAN_CMASK_DATAA | CAN_CMASK_DATAB;
if (u8idType == CAN_STD_ID) /* According STD/EXT ID format,Configure Mask and Aribration register */
{
CAN->sMsgObj[u8MsgIfNum].u32ARB1 = 0;
CAN->sMsgObj[u8MsgIfNum].u32ARB2 = CAN_ARB2_MSGVAL | (u32id & 0x7FF)<< 2;
}
else
{
CAN->sMsgObj[u8MsgIfNum].u32ARB1 = u32id & 0xFFFF;
CAN->sMsgObj[u8MsgIfNum].u32ARB2 = CAN_ARB2_MSGVAL | CAN_ARB2_XTD | (u32id & 0x1FF0000)>>16;
}
CAN->sMsgObj[u8MsgIfNum].MCON.UMASK = 1;
CAN->sMsgObj[u8MsgIfNum].MCON.RXIE = 1;
CAN->sMsgObj[u8MsgIfNum].MCON.EOB = u8singleOrFifoLast?1:0;
CAN->sMsgObj[u8MsgIfNum].u32DAT_A1 = 0;
CAN->sMsgObj[u8MsgIfNum].u32DAT_A2 = 0;
CAN->sMsgObj[u8MsgIfNum].u32DAT_B1 = 0;
CAN->sMsgObj[u8MsgIfNum].u32DAT_B2 = 0;
CAN->sMsgObj[u8MsgIfNum].u32CREQ = 1 + u8MsgObj;
return E_SUCCESS;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvCAN_ClrIntPn */
/* */
/* Parameter: */
/* - u8MsgObj: specifies the Message object number, from 0 to 31. */
/* Returns: */
/* - E_SUCCESS: Transmission ended */
/* - E_DRVCAN_NO_USEFUL_INTERFACE: No useful interface */
/* Description: */
/* The function is used to reset IntPnd and TXRQSTNEWDAT bit in a Message Object. */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvCAN_ClrIntPnd(uint8_t u8MsgObj)
{
uint8_t u8MsgIfNum=0;
if ((u8MsgIfNum = GetFreeIF()) == 2) /* Judge if any interface is free */
{
return E_DRVCAN_NO_USEFUL_INTERFACE;
}
CAN->sMsgObj[u8MsgIfNum].u32CMASK = CAN_CMASK_CLRINTPND | CAN_CMASK_TXRQSTNEWDAT;
CAN->sMsgObj[u8MsgIfNum].u32CREQ = 1 + u8MsgObj;
return E_SUCCESS;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvCAN_SetTxRqst */
/* */
/* Parameter: */
/* - u8MsgObj: specifies the Message object number, from 0 to 31. */
/* Returns: */
/* - E_SUCCESS: SUCCESS */
/* Description: */
/* The function is used to set transmit request bit in the target message object. */
/*---------------------------------------------------------------------------------------------------------*/
uint32_t DrvCAN_SetTxRqst(uint8_t u8MsgObj)
{
STR_CANMSG_T rMsg;
DrvCAN_ReadMsgObj(u8MsgObj,TRUE, &rMsg);
CAN->sMsgObj[0].u32CMASK = CAN_CMASK_WRRD |CAN_CMASK_TXRQSTNEWDAT ;
CAN->sMsgObj[0].u32CREQ = 1 + u8MsgObj;
return E_SUCCESS;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvCAN_ReadMsgObj */
/* */
/* Parameter: */
/* - u8MsgObj: specifies the Message object number, from 0 to 31. */
/* - u8Release: specifies the message release indicator. */
/* This parameter can be one of the following values: */
/* - TRUE: the message object is released when getting the data. */
/* - FALSE:the message object is not released. */
/* - pCanMsg: pointer to the message structure where received data is copied. */
/* Returns: */
/* - E_SUCCESS: Success */
/* - E_DRVCAN_NO_PENDING_MSG: No any message received */
/* Description: */
/* Gets the message, if received. */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvCAN_ReadMsgObj(uint8_t u8MsgObj, uint8_t u8Release, STR_CANMSG_T* pCanMsg)
{
if (!DrvCAN_IsNewDataReceived(u8MsgObj))
{
return E_DRVCAN_NO_PENDING_MSG;
}
CAN->STATUS.RXOK =0;
/* read the message contents*/
CAN->sMsgObj[1].u32CMASK = CAN_CMASK_MASK
| CAN_CMASK_ARB
| CAN_CMASK_CONTROL
| CAN_CMASK_CLRINTPND
| (u8Release ? CAN_CMASK_TXRQSTNEWDAT : 0)
| CAN_CMASK_DATAA
| CAN_CMASK_DATAB;
CAN->sMsgObj[1].u32CREQ = 1 + u8MsgObj;
if (CAN->sMsgObj[1].CREQ.BUSY ==1)
{
return E_DRVCAN_NO_USEFUL_INTERFACE;
}
if ((CAN->sMsgObj[1].ARB2.XTD) == 0)
{
/* standard ID*/
pCanMsg->IdType = CAN_STD_ID;
pCanMsg->Id = (CAN->sMsgObj[1].ARB2.ID28_16 >> 2);
}
else
{
/* extended ID*/
pCanMsg->IdType = CAN_EXT_ID;
pCanMsg->Id = (((CAN->sMsgObj[1].u32ARB2) & 0x1FFF)<<16) | CAN->sMsgObj[1].u32ARB1;
}
pCanMsg->DLC = CAN->sMsgObj[1].MCON.DLC;
pCanMsg->Data[0] = CAN->sMsgObj[1].DAT_A1.DATA0;
pCanMsg->Data[1] = CAN->sMsgObj[1].DAT_A1.DATA1;
pCanMsg->Data[2] = CAN->sMsgObj[1].DAT_A2.DATA2;
pCanMsg->Data[3] = CAN->sMsgObj[1].DAT_A2.DATA3;
pCanMsg->Data[4] = CAN->sMsgObj[1].DAT_B1.DATA4;
pCanMsg->Data[5] = CAN->sMsgObj[1].DAT_B1.DATA5;
pCanMsg->Data[6] = CAN->sMsgObj[1].DAT_B2.DATA6;
pCanMsg->Data[7] = CAN->sMsgObj[1].DAT_B2.DATA7;
return E_SUCCESS;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvCAN_WaitEndOfTx */
/* */
/* Parameter: */
/* None */
/* Returns: */
/* - E_SUCCESS: Transmission ended */
/* Description: */
/* Waiting until current transmission is finished. */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvCAN_WaitEndOfTx(void)
{
while(CAN->STATUS.TXOK==0);
return E_SUCCESS;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvCAN_BasicSendMsg */
/* */
/* Parameter: */
/* pCanMsg: Pointer to the message structure containing data to transmit. */
/* Returns: */
/* - E_SUCCESS: Transmission OK */
/* - E_DRVCAN_ERR_TIMEOUT: Check busy flag of interface 0 is timeout */
/* Description: */
/* The function is used to send CAN message in BASIC mode of test mode. Before call the API, */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -