示例#1
0
/*********************************************************************//**
 * @brief		Handle valid transmit message
 * @param[in]	msg_no Message Object number
 * @return 		None
 **********************************************************************/
void CAN_TxInt_MessageProcess( uint8_t msg_no )
{
    /* Clear interrupt pending bit */
    CAN_IF_Write(MCTRL, IF2, UMSK|RXIE|EOB|CAN_DLC_MAX);
    /* Save changes to message RAM */
    CAN_IF_writeBuf(IF2,msg_no);
    return;
}
示例#2
0
/*********************************************************************//**
 * @brief		Listen for a message on CAN bus
 * @param[in]	msg_no message object number
 * @param[in]	msg_ptr msg buffer pointer
 * @param[in]	RemoteEnable Enable/disable remote frame support, should be:
 * 					- TRUE:	 enable
 * 					- FALSE: disable
 * @return 		None
 **********************************************************************/
void CAN_Recv(uint8_t msg_no, uint32_t *msg_ptr, Bool RemoteEnable)
{
    uint32_t rx_id = *msg_ptr;
    uint32_t rmten = 0;
    if(RemoteEnable) {
        rmten = 1<<8;
    }
    if(!(rx_id & (0x1<<30))) { /* standard frame */

        /* Mxtd: 0, Mdir: 0, Mask is 0x7FF */
        CAN_IF_Write(MSK1, IF1, 0x0000);
        CAN_IF_Write(MSK2, IF1, ID_STD_MASK << 2);
        /* MsgVal: 1, Mtd: 0, Dir: 0 */
        CAN_IF_Write(ARB1, IF1, 0x0000);
        CAN_IF_Write(MCTRL, IF1, rmten|UMSK|RXIE|EOB|CAN_DLC_MAX);
        CAN_IF_Write(DA1, IF1, 0x0000);
        CAN_IF_Write(DA2, IF1, 0x0000);
        CAN_IF_Write(DB1, IF1, 0x0000);
        CAN_IF_Write(DB2, IF1, 0x0000);
        CAN_IF_Write(ARB2, IF1, ID_MVAL | ((rx_id) << 2));
        /* Transfer data to message RAM */
        CAN_IF_writeBuf(IF1, msg_no);
    }

    else {
        rx_id &= (0x1<<30)-1 ; /* Mask ID bit */
        /* Mxtd: 1, Mdir: 0, Mask is 0x1FFFFFFF */
        CAN_IF_Write(MSK1, IF1, ID_EXT_MASK & 0xFFFF);
        CAN_IF_Write(MSK2, IF1, MASK_MXTD | (ID_EXT_MASK >> 16));
        /* MsgVal: 1, Mtd: 1, Dir: 0 */
        CAN_IF_Write(ARB1, IF1, (rx_id) & 0xFFFF);
        CAN_IF_Write(MCTRL, IF1, rmten|UMSK|RXIE|EOB|CAN_DLC_MAX);
        CAN_IF_Write(DA1, IF1, 0x0000);
        CAN_IF_Write(DA2, IF1, 0x0000);
        CAN_IF_Write(DB1, IF1, 0x0000);
        CAN_IF_Write(DB2, IF1, 0x0000);
        CAN_IF_Write(ARB2, IF1, ID_MVAL | ID_MTD | ((rx_id) >> 16));
        /* Transfer data to message RAM */
        CAN_IF_writeBuf(IF1, msg_no);
    }
    return;
}
示例#3
0
/*********************************************************************//**
 * @brief		Send a message to the CAN port
 * @param[in]	msg_no message object number
 * @param[in]	msg_ptr msg buffer pointer
 * @return 		None
 **********************************************************************/
void CAN_Send(uint8_t msg_no, uint32_t *msg_ptr )
{
    uint32_t tx_id, Length;

    if(msg_ptr == NULL) return;

    /* first is the ID, second is length, the next four are data */
    tx_id = *msg_ptr++;
    Length = *msg_ptr++;

    if(Length>CAN_DLC_MAX)Length = CAN_DLC_MAX;
    CAN_IF_Write(MCTRL, IF1, UMSK|TXIE|TXRQ|EOB|RMTEN|(Length & DLC_MASK));
    CAN_IF_Write(DA1, IF1, *msg_ptr);			/* Lower two bytes of message pointer */
    CAN_IF_Write(DA2, IF1, (*msg_ptr++)>>16);	/* Upper two bytes of message pointer */
    CAN_IF_Write(DB1, IF1, *msg_ptr);			/* Lower two bytes of message pointer */
    CAN_IF_Write(DB2, IF1, (*msg_ptr)>>16);		/* Upper two bytes of message pointer */

    /* Configure arbitration */
    if(!(tx_id & (0x1<<30)))					/* bit 30 is 0, standard frame */
    {
        /* Mxtd: 0, Mdir: 1, Mask is 0x7FF */
        CAN_IF_Write(MSK2, IF1, MASK_MDIR | (ID_STD_MASK << 2));
        CAN_IF_Write(MSK1, IF1, 0x0000);

        /* MsgVal: 1, Mtd: 0, Dir: 1, ID = 0x200 */
        CAN_IF_Write(ARB1, IF1, 0x0000);
        CAN_IF_Write(ARB2, IF1, ID_MVAL| ID_DIR | (tx_id << 2));
    }
    else										/* Extended frame */
    {
        /* Mxtd: 1, Mdir: 1, Mask is 0x7FF */
        CAN_IF_Write(MSK2, IF1, MASK_MXTD | MASK_MDIR | (ID_EXT_MASK >> 16));
        CAN_IF_Write(MSK1, IF1, ID_EXT_MASK & 0x0000FFFF);

        /* MsgVal: 1, Mtd: 1, Dir: 1, ID = 0x200000 */
        CAN_IF_Write(ARB1, IF1, tx_id & 0x0000FFFF);
        CAN_IF_Write(ARB2, IF1, ID_MVAL|ID_MTD | ID_DIR | (tx_id >> 16));
    }

    /* Write changes to message RAM */
    CAN_IF_writeBuf(IF1, msg_no);

    return;
}
/*********************************************************************//**
 * @brief		Handle valid received message
 * @param[in]	LPC_C_CANx Select C_CAN peripheral, should be LPC_C_CAN0 or LPC_C_CAN1
 * @param[in]	msg_no Message Object number
 * @return 		None
 **********************************************************************/
void CAN_RxInt_MessageProcess(LPC_C_CANn_Type* LPC_C_CANx, uint8_t msg_no )
{
	uint32_t msg_id;
	uint32_t *p_add;
	uint32_t reg1, reg2;

	/* Import message object to IF2 */
 	CAN_IF_readBuf(LPC_C_CANx, IF2, msg_no);					/* Read the message into the IF registers */

	if(LPC_C_CANx == LPC_C_CAN0)
		p_add = (uint32_t *)&recv_buff[0];
	else if(LPC_C_CANx == LPC_C_CAN1)
		p_add = (uint32_t *)&recv_buff[1];

	if( CAN_IF_Read(LPC_C_CANx, ARB2, IF2) & ID_MTD )			/* bit 28-0 is 29 bit extended frame */
	{
		/* mask off MsgVal and Dir */
		reg1 = CAN_IF_Read(LPC_C_CANx, ARB1, IF2);
		reg2 = CAN_IF_Read(LPC_C_CANx, ARB2, IF2);
		msg_id = (reg1|(reg2<<16));
	}
	else
	{
		/* bit 28-18 is 11-bit standard frame */
		msg_id = (CAN_IF_Read(LPC_C_CANx, ARB2, IF2) &0x1FFF) >> 2;
	}

	p_add[0] = msg_id;
	p_add[1] = CAN_IF_Read(LPC_C_CANx, MCTRL, IF2) & 0x000F;	/* Get Msg Obj Data length */
	p_add[2] = (CAN_IF_Read(LPC_C_CANx, DA2, IF2)<<16) | CAN_IF_Read(LPC_C_CANx, DA1, IF2);
	p_add[3] = (CAN_IF_Read(LPC_C_CANx, DB2, IF2)<<16) | CAN_IF_Read(LPC_C_CANx, DB1, IF2);

	/* Clear interrupt pending bit */
	CAN_IF_Write(LPC_C_CANx, MCTRL, IF2, UMSK|RXIE|EOB|CAN_DLC_MAX);
	/* Save changes to message RAM */
	CAN_IF_writeBuf(LPC_C_CANx, IF2, msg_no);

	return;
}