cancel
Showing results for 
Search instead for 
Did you mean: 

CAN filter

frhoden9
Associate
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
2 REPLIES 2
glory_man
Associate II
Posted on April 21, 2012 at 10:16

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.

frhoden9
Associate
Posted on April 23, 2012 at 09:00

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?