Hallo, ich nutze vom STM32 den CAN-Bus, was soweit auch gut funktioniert. Ich habe die Schnittstelle mit einem Filter eingerichtet, so das ich nur Nachrichten mit der ID 0x581 empfange. Ist es möglich, zwei Filter einzurichten, so das ich nur Nachrichten mit der ID 0x701 und 0x581 empfange? Ich möchte die Nachrichten zwischen 0x581 und 0x701 nicht empfangen. Vielen Dank und ein schönes Wochenende
Guten Morgen, da A. K. sein Wissen ja nicht mit uns teilen will oder kann, habe ich in einem anderen Forum den gewünschten Tipp bekommen. Ich möchte aber trotzdem für die Nachwelt kurz dokumentieren wie man zwei oder mehr Filter beim CAN einrichtet. Ob meine Lösung jetzt die Beste ist, kann ich nicht sagen, sie funktioniert aber soweit. Letztendlich war die Lösung recht leicht, nur manchmal sieht man halt den Wald vor lauter Bäumen nicht. Wie man Filter einrichtet ist im folgenden Beitrag gut beschrieben: Beitrag "STM32 - CAN-Filter - ST Library v3.40" Die Lösung sieht demnach wie folgt aus:
1 | // CAN Filter 1 |
2 | CAN_FilterInitTypeDef CAN_FilterInitStructure; |
3 | CAN_FilterInitStructure.CAN_FilterNumber=0; |
4 | CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; |
5 | CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; |
6 | CAN_FilterInitStructure.CAN_FilterIdHigh= 0x0581 << 5; |
7 | CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; |
8 | CAN_FilterInitStructure.CAN_FilterMaskIdHigh= 0x0581 << 5; |
9 | CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; |
10 | CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0; |
11 | CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; |
12 | CAN_FilterInit(&CAN_FilterInitStructure); |
13 | |
14 | // CAN Filter 2 |
15 | CAN_FilterInitStructure.CAN_FilterNumber=1; |
16 | CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; |
17 | CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; |
18 | CAN_FilterInitStructure.CAN_FilterIdHigh= 0x0701 << 5; |
19 | CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; |
20 | CAN_FilterInitStructure.CAN_FilterMaskIdHigh= 0x0701 << 5; |
21 | CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; |
22 | CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0; |
23 | CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; |
24 | CAN_FilterInit(&CAN_FilterInitStructure); |
Laut Dokumentation kann man so bis zu 14 verschiedene Filter einstellen. Frank
Also wenn dich die zwei Nachrichten mit den IDs 0x781 und 0x501 im Empfangsbuffer stören, hätte man das ganze auch mit nur einem Filter geschafft. Gruß, TManiac
Hallo TManiac, vielen Dank für deine Antwort. Es verhält sich genau umgekehrt. Ich möchte nur die Nachrichten mit den genannten IDs empfangen. Alles andere möchte ich ausblenden. Wenn du noch eine bessere Lösung hast, würde ich mich freuen wenn du diese kurz erklärt. Gruß Frank
Hallo Frank, wenn du ausschließlich Nachrichten mit den StandardIds 0x701 und 0x581 empfangen möchtest, dann kannst du das auch mit einem Filter realisieren, indem du den IdList-Modus verwendest:
1 | CAN_FilterInitStructure.CAN_FilterNumber = 0; |
2 | CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList; |
3 | CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; |
4 | |
5 | // CAN_FxR1 Konfiguration |
6 | CAN_FilterInitStructure.CAN_FilterIdHigh = (0x701<<5); |
7 | CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; |
8 | // CAN_FxR2 Konfiguration |
9 | CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (0x581<<5); |
10 | CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; |
11 | |
12 | CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0; |
13 | CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; |
14 | CAN_FilterInit(&CAN_FilterInitStructure); |
Somit kannst du explizit zwei IDs angeben, die der Filter akzeptieren soll. Alle anderen IDs werden abgewiesen. Gruß, Matthias
Hallo Matthias, ich bin erst jetzt dazu gekommen deine Lösung auszuprobieren. Vorweg noch einmal vielen Dank dafür. Der von mir oben beschriebene Ansatz funktionierte doch nicht richtig. Deine Lösung funktioniert wie gewünscht, es kommen nur die genannten Nachrichten durch. Vielen Dank. Gruß Frank
Hallo, ich würde gern den Thread nochmal hochholen auch wenn er schon älter ist. Ich möchte ebenfalls nur zwei IDs empfangen. Ich habe den Code von Matthias an die "neue" HAL Lib angepasst:
1 | FilterConfig.FilterBank = 0; |
2 | FilterConfig.FilterMode = CAN_FILTERMODE_IDLIST; |
3 | FilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; |
4 | |
5 | // CAN_FxR1 Konfiguration |
6 | FilterConfig.FilterIdHigh = (0x0A5 << 5); |
7 | FilterConfig.FilterIdLow = 0x0000; |
8 | // CAN_FxR2 Konfiguration |
9 | FilterConfig.FilterMaskIdHigh = (0x1A1 << 5); |
10 | FilterConfig.FilterMaskIdLow = 0x0000; |
11 | |
12 | FilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0; |
13 | FilterConfig.FilterActivation = CAN_FILTER_ENABLE; |
14 | HAL_CAN_ConfigFilter(&hcan, &FilterConfig); |
Jedoch empfange ich keine der beiden ID's... Hat jemand ne Idee?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.