The Message Objects and Identifier Masks for acceptance filtering of received messaged in the Message RAM.
https://github.com/OpenNuvoton/NUC970_NonOS_BSP/tree/master/SampleCode/CAN
int32_t CAN_SetRxMsgObj(UINT32 uCAN, uint8_t u8MsgObj, uint8_t u8idType, uint32_t u32id, uint8_t u8singleOrFifoLast)
{
UINT32 uOffset = uCAN * CAN_OFFSET;
if((inpw(REG_CAN0_IF2_CREQ+uOffset) & CAN_IF_CREQ_BUSY_Msk) != 0)
{
return FALSE;
}
/* Command Setting */
outpw((REG_CAN0_IF2_CMASK+uOffset), (CAN_IF_CMASK_WRRD_Msk | CAN_IF_CMASK_MASK_Msk | CAN_IF_CMASK_ARB_Msk |
CAN_IF_CMASK_CONTROL_Msk | CAN_IF_CMASK_DATAA_Msk | CAN_IF_CMASK_DATAB_Msk));
if (u8idType == CAN_STD_ID) /* According STD/EXT ID format,Configure Mask and Arbitration register */
{
outpw((REG_CAN0_IF2_ARB1+uOffset), 0x0);
outpw((REG_CAN0_IF2_ARB2+uOffset), (CAN_IF_ARB2_MSGVAL_Msk | (u32id & 0x7FF)<< 2)); /* Identifier Masks */ /* 参考 NUC970 Technical Reference Manual Page 824. CAN_IFn_ARB2, Bit 15, 0 = The Message Object is ignored by the Message Handler
当把第15位配置成0,将会忽略指定的消息对象,即所有的CAN消息对象将会被处理! */
}
else
{
outpw((REG_CAN0_IF2_ARB1+uOffset), (u32id & 0xFFFF));
outpw((REG_CAN0_IF2_ARB2+uOffset), (CAN_IF_ARB2_MSGVAL_Msk | CAN_IF_ARB2_XTD_Msk | (u32id & 0x1FFF0000)>>16));
}
outpw((REG_CAN0_IF2_MCON+uOffset), (inpw(REG_CAN0_IF2_MCON+uOffset) | CAN_IF_MCON_UMASK_Msk | CAN_IF_MCON_RXIE_Msk));
if(u8singleOrFifoLast)
{
outpw((REG_CAN0_IF2_MCON+uOffset), (inpw(REG_CAN0_IF2_MCON+uOffset) | CAN_IF_MCON_EOB_Msk));
}
else
{
outpw((REG_CAN0_IF2_MCON+uOffset), (inpw(REG_CAN0_IF2_MCON+uOffset) & ~CAN_IF_MCON_EOB_Msk));
}
outpw((REG_CAN0_IF2_DAT_A1+uOffset), 0x0);
outpw((REG_CAN0_IF2_DAT_A2+uOffset), 0x0);
outpw((REG_CAN0_IF2_DAT_B1+uOffset), 0x0);
outpw((REG_CAN0_IF2_DAT_B2+uOffset), 0x0);
outpw((REG_CAN0_IF2_CREQ+uOffset), (1 + u8MsgObj)); /* Message Object */
return TRUE;
} |