Für ein STM32F205 habe ich mehrere CAN-Filter (29-Bit ID) in die SW
gebaut und dabei festgestellt, dass es filtermäßig etwas hakt. Das
Problem ist, habe ich
einen Filter konfiguriert, funktioniert ein Filter, habe ich
zwei Filter konfiguriert, funktioniert ein Filter, habe ich
drei Filter konfiguriert, funktionieren zwei Filter.
Dazu habe ich mir mal die CAN-Register im Debugger angekuckt und das FMR
(Filter Master Register) steht dabei so:
1 Filter konfiguriert, FMR = 0010 1010 0001 1100 0000 0000 0000 0000
2 Filter konfiguriert, FMR = 0010 1010 0001 1100 0000 0001 0000 0000
5 Filter konfiguriert, FMR = 0010 1010 0001 1100 0000 0100 0000 0000
dabei ist Bit 8 bis 13 = CAN2SB[5:0] = CAN2 start bank, in diesem Fall
also 00 0000 bei einem Filter, 00 0100 bei 5 Filtern.
Es steht im Datenbladl (Reference Manual RM0033, STM32F2xx) dazu:
When CAN2SB[5:0] is set to 0, no filters are assigned to CAN1.
Es dürfte also der eine Filter nicht tun.
Wenn ich zwei Filter konfiguriere, steht CAN2SB8[5:0] auf 00 0001 und es
funktioniert nur ein Filter, das wäre lt. Datenbladl korrekt (ein Filter
aktiv) aber nicht nach Programm(code).
Die anderen Register wie FS1R und FA1R stehen richtig, also bei einem
konfigurierten Filter auf 0b.....01, bei drei Filtern auf 0b....0111.
Die Frage ist eben, warum ein Filter funktioniert, wenn kein Bit im FMR
gesetzt ist und auch dann ein Filter funktioniert, wenn das unterste Bit
gesetzt wurde.
Der Code dazu (Filter Setup), main.cpp:
1 | ...
|
2 | CAN_SetupFilter(LINEAR_CAN_ID, FULL_DEVICE_CAN_FILTER);
|
3 | CAN_SetupFilter(BROADCAST_CAN_ID, FULL_DEVICE_CAN_FILTER);
|
4 | CAN_SetupFilter(0x06210000, FULL_DEVICE_CAN_FILTER);
|
5 | CAN_SetupFilter(0x060D0000, FULL_DEVICE_CAN_FILTER);
|
6 | CAN_SetupFilter(0x060D0000, FULL_DEVICE_CAN_FILTER); // dummy filter
|
7 | ...
|
can.cpp:
1 | void MW_CAN::CAN_SetupFilter (uint32_t CAN_msg_tId, uint32_t CAN_mask_tId)
|
2 | {
|
3 | CAN_FilterConfTypeDef CANFilterStruct;
|
4 | CANFilterStruct.FilterNumber = CANFilterIndex;
|
5 | CANFilterStruct.FilterMode = CAN_FILTERMODE_IDMASK;
|
6 | CANFilterStruct.FilterScale = CAN_FILTERSCALE_32BIT;
|
7 |
|
8 | CANFilterStruct.FilterIdHigh = CAN_msg_tId >> 13; // = (CAN_msg_tId >> 16) << 3
|
9 | CANFilterStruct.FilterIdLow = (CAN_msg_tId & 0xFFFF) << 3;
|
10 | CANFilterStruct.FilterMaskIdHigh = CAN_mask_tId >> 13; // = (CAN_mask_tId >> 16) << 3
|
11 | CANFilterStruct.FilterMaskIdLow = (CAN_mask_tId & 0xFFFF) << 3;
|
12 |
|
13 | CANFilterStruct.FilterFIFOAssignment = CAN_FIFO0;
|
14 | CANFilterStruct.FilterActivation = ENABLE;
|
15 | // CANFilterStruct.BankNumber = 1;
|
16 | CANFilterStruct.BankNumber = CANFilterIndex;
|
17 | HAL_CAN_ConfigFilter(hCAN, &CANFilterStruct);
|
18 | CANFilterIndex++;
|
19 | }
|