CAN Filter STM32

Gast #6477453
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.
Gast #6477467
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ß
Gast #6477495
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;
Gast #6477538
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?
Gast #6477557
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
...

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