Forum: Mikrocontroller und Digitale Elektronik STM32F2xx und CAN-Filter - Bug im Prozessor?


von K. H. (hegy)


Lesenswert?

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
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.