STM32 CAN-Bus mit zwei Filtern

OP #2510686
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
OP #2514541
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
OP #2519467
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
#2539091
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
OP #2588911
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
Gast #6481101
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren