cancel
Showing results for 
Search instead for 
Did you mean: 

Bank filter confinguration working ramdonly with HAL_CAN over STM32L4

Posted on March 20, 2017 at 18:28

Working with HAL_CAN over STM32L4 polatform and kvaser (can analyzer).

I have this functions implementing my bank filtering:

void DRV_CAN_configureFiltersBank(void)

{

HCANFilter_Struct.FilterNumber = 0; //0 - 27

HCANFilter_Struct.FilterMode = CAN_FILTERMODE_IDMASK;

HCANFilter_Struct.FilterScale = CAN_FILTERSCALE_32BIT;

/*iid mask = 0...0 --> 0=don't care --> se acepta id con cualquier valor de bit en ese lugar*/

HCANFilter_Struct.FilterIdHigh = 0x0000; //11-bit ID in top bits ;//MSB of 32b config

HCANFilter_Struct.FilterIdLow = 0x1F;//LSB of 32b config

HCANFilter_Struct.FilterMaskIdHigh = 0x0000; //MSB

HCANFilter_Struct.FilterMaskIdLow = 0x11; //LSB

HCANFilter_Struct.FilterFIFOAssignment = 0;

HCANFilter_Struct.FilterActivation = ENABLE;

HCANFilter_Struct.BankNumber = 13;

if (HAL_CAN_ConfigFilter(&HCAN_Struct,&HCANFilter_Struct) != HAL_OK)

{

DrvCan_Error_Handler();

}

}

I would like to remark black letters. Since I have this configuration and I'm sending frames with different ID values and controller seems to get sometimes expected frames ID, but sometimes get non expected ones. Even sometimes ahs blocked correct IDs. If I understand correctly, with this configuration I have: 

  • 0x0000001F = ID value = 11111
  • 0x00000011 = mask value = 10001
  • That means all ID numbers with 1xxx1 bits at the same position will pass, but if first 1 or last one is not present that frame will not entering to my FIFO.

Is it?

The thing is that I send a frame with 10100 = ID, but this frame passes the filters and it is processed (with an eco transmition after being receiving).

Is something wrong at my configuration understanding?

Thanks in advance.

#mask #id-filters #hal_can_receive_it #can #can-filter
12 REPLIES 12
Posted on April 27, 2017 at 10:40

I don't understand.. This 5 bit (RTR,IDE,EXID) in what register are they? 

Posted on April 27, 2017 at 10:58

0690X00000606nyQAA.png

If I want that the filter 0 works on 4 ID of 16 bit, and for example I want to receive the following ID: 5,10,12,14.. How can I set the Filter bank register?

CAN_F0R1 = 5<<5 | 10<<16;

CAN_F0R2 = 12<<5 | 14<<16;

It's correct, I can receive the ID 5 but not the ID 10?

Thanks.

Posted on April 27, 2017 at 15:13

They are bits in the CAN packet headers, see a definition of the CAN standards.

You have to shift the pattern you want to match in to the bit fields that the comparison is occurring on

CAN_F0R1 = (5<<5) | (10 << (5 + 16));

CAN_F0R2 = (12<<5) | (14 << (5 +16));

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..