Skip to main content
frhoden9
Associate
April 20, 2012
Question

CAN filter

  • April 20, 2012
  • 2 replies
  • 711 views
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
    This topic has been closed for replies.

    2 replies

    glory_man
    Associate III
    April 21, 2012
    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
    frhoden9Author
    Associate
    April 23, 2012
    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?