Forum: Mikrocontroller und Digitale Elektronik CAN Filter STM32


von guenter (Gast)


Lesenswert?

Hallo zusammen,

ich kämpfe gerade mit den Can Filtern im STM32.

Folgende Infos sind erforderlich: (Beispielhaft):

1
    FilterConfig.FilterIdHigh = 0x0000;
2
    FilterConfig.FilterIdLow = 0x0000;
3
    FilterConfig.FilterMaskIdHigh = 0x0000;
4
    FilterConfig.FilterMaskIdLow = 0x0000;

Ich hab diesen Beitrag gefunden: 
https://schulz-m.github.io/2017/03/23/stm32-can-id-filter/

Und diesen Code probiert:

1
    FilterConfig.FilterIdHigh = 0x00000629;
2
    FilterConfig.FilterIdLow = 0x000000629;
3
    FilterConfig.FilterMaskIdHigh = 0x1FFFFFFF;
4
    FilterConfig.FilterMaskIdLow = 0x1FFFFFFF;

Aber nun bekomme ich gar keine Daten über den Bus. Alle Nachrichten 
scheinen gefiltert zu werden. Ich benötige Nachrichten von $629

Kann mir da einer mal erklären wie genau das mit den Masken und IDs 
geht?

Vielen Dank.

von Nobby (Gast)


Lesenswert?

So habe ich das gemacht.

Alles was mit 0x1FFB0000 anfängt wird zugelassen.

sFilterConfig.FilterIdHigh = (0x1FFB0000UL << 3) >> 16;
sFilterConfig.FilterIdLow = 0x1FFB0000UL << 3 | 4;
sFilterConfig.FilterMaskIdHigh = (0xFFFF0000UL << 3) >> 16;
sFilterConfig.FilterMaskIdLow = 0xFFFF0000UL << 3 | 4;

Gruß

von zer0 (Gast)


Lesenswert?

1
// Filter aktivieren und FIFO1 auswählen
2
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO1;
3
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
4
// Listenmodus aktivieren
5
CAN_FilterInitStructure.CAN_FilterNumber = 0;
6
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList;
7
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
8
// Standard Frame
9
CAN_FilterInitStructure.CAN_FilterIdHigh = (0x629) << 5;
10
CAN_FilterInitStructure.CAN_FilterIdLow = 0;
11
// Extended Frame
12
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = ((0x629) << 3) >> 16;
13
CAN_FilterInitStructure.CAN_FilterMaskIdLow = (((0x629) << 3) | CAN_Id_Extended;

von guenter (Gast)


Lesenswert?

Hi,

danke. Genau das shiften hat gefehlt um an die richtige Stelle im Filter 
zu kommen.

IdList statt Mask sieht auch interessant aus! Wie geht denn das wenn ich 
dann sagen wir 5 versch. IDs habe die nicht aufeinanderfolgend sind?

von zer0 (Gast)


Lesenswert?

guenter schrieb:
> Hi,
>
> danke. Genau das shiften hat gefehlt um an die richtige Stelle im Filter
> zu kommen.
>
> IdList statt Mask sieht auch interessant aus! Wie geht denn das wenn ich
> dann sagen wir 5 versch. IDs habe die nicht aufeinanderfolgend sind?

Bei IdList kannst du zwei IDs pro Filter eintragen. In meinem Beispiel 
habe ich die gleiche ID als Standard Frame und Extended Frame gewählt.
Also einfach Filter hochzählen.
1
// Filter aktivieren und FIFO1 auswählen
2
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO1;
3
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
4
// Listenmodus aktivieren
5
CAN_FilterInitStructure.CAN_FilterNumber = 0;
6
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList;
7
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
8
// Standard Frame
9
CAN_FilterInitStructure.CAN_FilterIdHigh = (0x629) << 5;
10
CAN_FilterInitStructure.CAN_FilterIdLow = 0;
11
// Standard Frame
12
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (0x229) << 5;
13
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0;
14
CAN_FilterInit(&CAN_FilterInitStructure);
15
16
17
CAN_FilterInitStructure.CAN_FilterNumber = 1;
18
// Standard Frame
19
CAN_FilterInitStructure.CAN_FilterIdHigh = (0x329) << 5;
20
CAN_FilterInitStructure.CAN_FilterIdLow = 0;
21
// Standard Frame
22
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (0x429) << 5;
23
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0;
24
25
...

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.