Forum: Mikrocontroller und Digitale Elektronik Wie MCP2515 CAN Filter und Mask richtig einstellen?


von Oliver S. (os252)


Lesenswert?

Hallo

Ich habe ein Projekt, in dem ich 2 AVR Mega8 über CAN kommunizieren 
lassen möchte.
Dazu habe ich die beiden Controller mit jeweils einem MCP2515 und einem 
MCP2551 ausgestattet.

Die Kommunikation läuft nun soweit auch, dank der CAN-Libary von 
kreatives-chaos.com

Nun möchte ich diese aber gerne auch so konfigurieren können das man 
verschiedene Platinen über den gleichen Bus kommunizieren lassen kann.
Dazu sollte ein Filter und eine Mask gesetzt werden.

Nun habe ich dieses mit folgendem Code gemacht:
1
  
2
// create a new filter for receiving all messages
3
can_filter_t filter = {
4
  .id = 0x1,
5
  .mask = 0x7ff,
6
  .flags = {
7
    .rtr = 0,
8
  }
9
};
10
  
11
//Filter aktivieren
12
can_set_filter(0, &filter);

Dieses funktioniert aber leider nicht. Es kommen immer noch alle 
Nachrichten an.
Nun wollte ich fragen wie sich das mit den 5 Filtern verhält, die 
gesetzt werden können. Muss man die restlichen Filter dazu so setzen das 
dort nichts mehr durchgelassen wird oder kann man diese auch 
deaktivieren?
Dazu habe ich leider im Datenblatt nichts gefunden.

Wäre nett wenn mir jemand eventuell auch nen Beispielcode zum MCP2515 
geben könnte.

Ich verwende nicht die Extended ID, sondern die normale, 11 Bit lange ID
.
MFG Olli

von David M. (md2k7)


Lesenswert?

Hallo,

müsste soweit funktionieren (soweit das auch die CAN-Lib tut, was ich 
annehme).

Vielleicht musst du noch die RXM Bits in RXB0CTRL od. RXB1CTRL setzen, 
wenn das die Lib nicht automatisch mit can_set_filter() macht. Die 
definieren nämlich, ob die Filter überhaupt wirksam sind.

Nachtrag: ob die anderen Filter von der Lib zurückgesetzt werden, weiß 
ich auch nicht; jedenfalls sind dort laut Datenblatt undefinierte Werte 
drin, d.h. die könnten auch (bei deiner Maske und 11-bit IDs nur bei 
einer speziellen ID) auslösen. Welcher Filter ausgelöst hat, steht in 
den FILHIT Bits in RXB0CTRL od. RXB1CTRL.

Gruß
David

von holger (Gast)


Lesenswert?

1
// create a new filter for receiving all messages
2
can_filter_t filter = {
3
  .id = 0x1,
4
  .mask = 0x7ff,
5
  .flags = {
6
    .rtr = 0,
7
  }
8
};

>Dieses funktioniert aber leider nicht. Es kommen immer noch alle
>Nachrichten an.

Genau das steht ja auch oben im Kommentar;)

Du hast in der mask alle 11 Bits gesetzt. Also bekommst
du auch alle Messages. Du musst die mask halt so setzen
dass du nur die gewünschten Messages bekommst.

von David M. (md2k7)


Lesenswert?

holger schrieb:
> Genau das steht ja auch oben im Kommentar;)

Mag wohl so sein.

> Du hast in der mask alle 11 Bits gesetzt. Also bekommst
> du auch alle Messages. Du musst die mask halt so setzen
> dass du nur die gewünschten Messages bekommst.

Stimmt nicht, siehe Table 4-2 im Datenblatt, Seite 32. Filterbits zählen 
dort, wo Maskenbits 1 sind.

Gruß
David

von Oliver S. (os252)


Lesenswert?

@holger:
Ja der Kommentar stammt leider noch aus der Testzeit, in der auf jeden 
Fall alle Nachrichten ankommen sollten.

MFG Olli

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.