Forum: Mikrocontroller und Digitale Elektronik STM8S CAN Bus Fitlering


von Mike (Gast)


Lesenswert?

Hey!

Ich versuche gerade, den CAN Bus auf einem STM8S Board zum Laufen zu 
bekommen, scheitere aber aus irgendeinem Grund an der Filterung.
Ich verwende die ST Standard Library und mein Ziel ist, nur Nachrichten
mit der ID 0xAED zu empfangen. Mein Protokoll nutzt das Extended ID 
Format.

Mein Code-Schnipsel aus der CAN-Initalisierung sieht folgendermaßen aus:

  /* CAN filter init */
  CAN_FilterNumber = CAN_FilterNumber_0;
  CAN_FilterActivation = ENABLE;
  CAN_FilterMode = CAN_FilterMode_IdMask;
  CAN_FilterScale = CAN_FilterScale_32Bit;
  CAN_FilterID1=0x00AED100;
  CAN_FilterID2=0;
  CAN_FilterID3=0;
  CAN_FilterID4=0;
  CAN_FilterIDMask1=0x00FFF000;
  CAN_FilterIDMask2=0;
  CAN_FilterIDMask3=0;
  CAN_FilterIDMask4=0;
  CAN_FilterInit(CAN_FilterNumber, CAN_FilterActivation, CAN_FilterMode,
                 CAN_FilterScale,CAN_FilterID1, CAN_FilterID2,
                 CAN_FilterID3,
                 CAN_FilterID4,CAN_FilterIDMask1, CAN_FilterIDMask2,
                 CAN_FilterIDMask3, CAN_FilterIDMask4);

Wahrscheinlich ist es nur ein trivialer Fehler, aber ich bin recht neu 
auf dem Gebiet und habe leider noch wenig Erfahrung.

Danke!
Mike

von Mike (Gast)


Lesenswert?

Bin jetzt soweit, dass ich die ersten 16 bit filtern kann. Mein Fehler 
war, dass ich die IDE und RTR nicht in die Adresse miteingerechnet habe. 
Mein Code sieht jetzt wie folgt aus:

    /* CAN filter init */
  CAN_FilterNumber = CAN_FilterNumber_2;
  CAN_FilterActivation = ENABLE;
  CAN_FilterMode = CAN_FilterMode_IdMask;
  CAN_FilterScale = CAN_FilterScale_32Bit;
  CAN_FilterID1=0xc7;
  CAN_FilterID2=0xed;
  CAN_FilterID3=0x02;
  CAN_FilterID4=0x02;
  CAN_FilterIDMask1=0xFF;
  CAN_FilterIDMask2=0xE7;
  CAN_FilterIDMask3=0xE0;
  CAN_FilterIDMask4=0x00;
  CAN_FilterInit(CAN_FilterNumber, CAN_FilterActivation, CAN_FilterMode,
                 CAN_FilterScale,CAN_FilterID1, CAN_FilterID2, 
CAN_FilterID3,
                 CAN_FilterID4,CAN_FilterIDMask1, CAN_FilterIDMask2,
                 CAN_FilterIDMask3, CAN_FilterIDMask4);


Für die Adresse 0x18FEC101 kann ich nun die 0x18FE, also die vorderen 
16bit filtern. Aus irgendeinem Grund schaffe ich es jedoch nicht, auch 
den hinteren Teil zu filtern. Gibt es vielleicht hierzu irgendwelche 
Ideen oder Erfahrungen?

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.