Forum: Digitale Signalverarbeitung / DSP / Machine Learning Can bus filter


von Thomas (Gast)


Lesenswert?

Hallo,

ich betreibe ein CAN- Bus Netzwerk mit CAN Standard Frames (2048 
identifiers).

Ich möchte nun einen Filter schreiben, welcher nur Pakete mit dem 
Identifier "0x003" und als ersten Datenbyte den Wert "0x01" annimmt.

Ich verwende einen Arduino mit der MCP 2515 Libary, dazu ein Beispiel 
der Filter: 
https://github.com/coryjfowler/MCP_CAN_lib/blob/master/examples/Standard_MaskFilter/Standard_MaskFilter.ino

Setze ich nur eine Mask, so werden trotzdem alle Pakete angenommen, 
setze ich beide Mask (muss ich immer beide setzen?), so werden gar keine 
mehr angenommen.

Code:
1
  _bus->init_Mask(0,0,0x0FFFFF00);                // Init first mask...
2
  _bus->init_Mask(1,0,0x0FFFFF00);                // Init second mask...
3
  _bus->init_Filt(0,1,0x00030100);                // Init first filter...

Auch bei folgenden Beispiel werden keine Pakete mehr mit dem Identifier 
0x003 angenommen:


Code:
1
  _bus->init_Mask(0,0,0x0FFF0000);                // Init first mask...
2
  _bus->init_Mask(1,0,0x0FFF0000);                // Init second mask...
3
  _bus->init_Filt(0,1,0x00030000);                // Init first filter...

Könnt ihr mir helfen?

Danke!

von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

Thomas schrieb:
> _bus->init_Filt(0,*1*,0x00030000);                // Init first
> filter...
Bedeutet die 1 nicht dass es sich um einen Extended Filter handelt?

von Thomas (Gast)


Lesenswert?

Christopher B. schrieb:
> Bedeutet die 1 nicht dass es sich um einen Extended Filter handelt?

Gut zu wissen, danke! Irgendwie habe ich in der Doku vom 2ten Parameter 
nichts gefunden. Aber ich hatte es mit 0 & 1 getestet, beides hat nicht 
funktioniert :(

von Christopher B. (chrimbo) Benutzerseite


Lesenswert?


von Thomas (Gast)


Lesenswert?

Christopher B. schrieb:
> Siehe hier
>
> https://github.com/coryjfowler/MCP_CAN_lib/blob/master/mcp_can.cpp#L600

Ok danke!

Ich kann es gerade nicht testen, aber sollte dieses hier rein 
theoretisch funktionieren oder gibts da einen Denkfehler:
1
  _bus->init_Mask(0,0,0x0FFFFF00);                // Init first mask...
2
  _bus->init_Mask(1,0,0x0FFFFF00);                // Init second mask...
3
  _bus->init_Filt(0,0,0x00030100);                // Init first filter...

Somit sollte ich nur Nachrichten mit dem Identifier 3 und dem ersten 
Datenbyte mit dem Wert bekommen?

von Thomas (Gast)


Lesenswert?

Hab mich gerade noch eingelesen, müsste es zufällig so lauten;
1
  _bus->init_Mask(0,0,0x07FFFF00);                // Init first mask...
2
  _bus->init_Mask(1,0,0x07FFFF00);                // Init second mask...
3
  _bus->init_Filt(0,0,0x00030100);                // Init first filter...

Beitrag #5379150 wurde von einem Moderator gelöscht.
von zyxw (Gast)


Lesenswert?

7ff klingt schon besser bei Std-IDs.
Ich glaube, Du brauchst nur Filt0 und Mask0,
denn wenn Du Mask1 setzt, solltest Du auch Filt1 setzen.

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.