Question
CAN filter
Posted on April 20, 2012 at 09:26
Hello,
i try to configure the CAN on a STM32F103R8. I would like to use the filter to block messages. Only messages with the ID 0x701, 0x581, 0x185, 0x285, 0x385, 0x485, 0x205 and 0x305 shall not be blocked. With the following initialization, only the messages 0x701 and 0x581pass throught.
void
CANInitIT(
void
){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
// CAN Periph clock enable
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
// Configure CAN pin: RX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// Configure CAN pin: TX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// Put CAN pins out on port B pins 8 and 9
GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);
CAN_InitTypeDef CAN_InitStructure;
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);
CAN_InitStructure.CAN_TTCM=DISABLE;
CAN_InitStructure.CAN_ABOM=DISABLE;
CAN_InitStructure.CAN_AWUM=DISABLE;
CAN_InitStructure.CAN_NART=DISABLE;
CAN_InitStructure.CAN_RFLM=ENABLE;
CAN_InitStructure.CAN_TXFP=ENABLE;
CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1=CAN_BS1_12tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_5tq;
CAN_InitStructure.CAN_Prescaler=16;
CAN_Init(CAN1, &CAN_InitStructure);
CAN_FilterInitTypeDef CAN_FilterInitStructure;
CAN_FilterInitStructure.CAN_FilterNumber = 0;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
// CAN_FxR1 Konfiguration
CAN_FilterInitStructure.CAN_FilterIdHigh = (0x701<<5);
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
// CAN_FxR2 Konfiguration
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (0x581<<5);
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
// CAN-Filter 1 Init
CAN_FilterInitStructure.CAN_FilterNumber = 1;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
// CAN_FxR1 Konfiguration
CAN_FilterInitStructure.CAN_FilterIdHigh = (0x185<<5);
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
// CAN_FxR2 Konfiguration
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (0x285<<5);
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
// CAN-Filter 2 Init
CAN_FilterInitStructure.CAN_FilterNumber = 2;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
// CAN_FxR1 Konfiguration
CAN_FilterInitStructure.CAN_FilterIdHigh = (0x385 << 5);
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
// CAN_FxR2 Konfiguration
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (0x485 << 5);
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
// CAN-Filter 3 Init
CAN_FilterInitStructure.CAN_FilterNumber = 3;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
// CAN_FxR1 Konfiguration
CAN_FilterInitStructure.CAN_FilterIdHigh = (0x205 << 5);
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
// CAN_FxR2 Konfiguration
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (0x305 << 5);
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
//InterruptInit
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
}
can anyone help me? Thank you very much