Если проблему еще не решили могу предлоить кусок из примера от NXP вполне понятно и подробно все показывает как пользоваться.
Для всех типов фильтрации
/******************************************************************************
** Function name: CAN_SetACCF_Lookup
**
** Descriptions: Initialize CAN, install CAN interrupt handler
**
** parameters: bitrate
** Returned value: true or false, false if initialization failed.
**
******************************************************************************/
void CAN_SetACCF_Lookup( void )
{
DWORD address = 0;
DWORD i;
DWORD ID_high, ID_low;
// Set explicit standard Frame
CAN_SFF_SA = address;
for ( i = 0; i < ACCF_IDEN_NUM; i += 2 )
{
ID_low = (i << 29) | (EXP_STD_ID << 16);
ID_high = ((i+1) << 13) | (EXP_STD_ID << 0);
*((volatile DWORD *)(CAN_MEM_BASE + address)) = ID_low | ID_high;
address += 4;
}
// Set group standard Frame
CAN_SFF_GRP_SA = address;
for ( i = 0; i < ACCF_IDEN_NUM; i += 2 )
{
ID_low = (i << 29) | (GRP_STD_ID << 16);
ID_high = ((i+1) << 13) | (GRP_STD_ID << 0);
*((volatile DWORD *)(CAN_MEM_BASE + address)) = ID_low | ID_high;
address += 4;
}
// Set explicit extended Frame
CAN_EFF_SA = address;
for ( i = 0; i < ACCF_IDEN_NUM; i++ )
{
ID_low = (i << 29) | (EXP_EXT_ID << 0);
*((volatile DWORD *)(CAN_MEM_BASE + address)) = ID_low;
address += 4;
}
// Set group extended Frame
CAN_EFF_GRP_SA = address;
for ( i = 0; i < ACCF_IDEN_NUM; i++ )
{
ID_low = (i << 29) | (GRP_EXT_ID << 0);
*((volatile DWORD *)(CAN_MEM_BASE + address)) = ID_low;
address += 4;
}
// Set End of Table
CAN_EOT = address;
return;
}