2012-04-20 12:26 AM
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
2012-04-21 01:16 AM
If you use CAN1 you can try to define slave's filter start bank with CAN_SlaveStartBank(num) where num = your last filter bank num + 1.
Did you use standard IDs? If yes - why you use 32bit filter length? You can use 16bit filters list - in this case each filter bank consist of 4 filters.2012-04-23 12:00 AM
Hello,
thanks for the help. Yes i use the CAN1.I have a microcontroller from the Performance line (STM32F103) and the funktion ''CAN_SlaveStartBank(num)'' applies only to STM32 Connectivity line devices. You are right i use standard IDs. Can you explain how to set up four filters when i use 16 Bit filter list?