Forum: Mikrocontroller und Digitale Elektronik STM32 CAN-Bus mit zwei Filtern


von Frank A. (_frank)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

Ja.

von Frank A. (_frank)


Lesenswert?

und wie?

von Frank A. (_frank)


Lesenswert?

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

von TManiac (Gast)


Lesenswert?

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

von Frank A. (_frank)


Lesenswert?

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

von Matthias T. (matthias-t)


Lesenswert?

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

von Frank A. (_frank)


Lesenswert?

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

von guenther (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.