⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drvcan.c

📁 cortex-m0 LCD1602程序
💻 C
📖 第 1 页 / 共 5 页
字号:
    {
        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 + -