mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Universelles CAN Interface; MCP2515: Probleme beim Filter setzen


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich benutze zum ansteuern des MCP2515 die Universelles CAN Interface von 
kreatives-chaos.com:

http://www.kreatives-chaos.com/artikel/universelle...


Das Senden und Empfangen funktionniert soweit auch. Nur mit dem 
Einstellen der Filter/Masken hab ich noch Probleme. In der Doku ist das 
wie folgt beschrieben:

// Filter und Masken-Tabelle anlegen
 prog_char can_filter[] = {
    MCP2515_FILTER_EXTENDED(0), // Filter 0
    MCP2515_FILTER_EXTENDED(0), // Filter 1
    
    MCP2515_FILTER_EXTENDED(0), // Filter 2
    MCP2515_FILTER_EXTENDED(0), // Filter 3
    MCP2515_FILTER_EXTENDED(0), // Filter 4
    MCP2515_FILTER_EXTENDED(0), // Filter 5
    
    MCP2515_FILTER_EXTENDED(0), // Maske 0
    MCP2515_FILTER_EXTENDED(0), // Maske 1
 };
 
 ...

 // Filter und Masken-Tabelle laden
 can_static_filter(can_filter);



Bei mir hat das zum Ergebnis das ich überhaupt keine Nachrichten mehr 
empfangen kann.Es sollte aber eigentlich alles durchkommen wenn die 
Filter/Masken testweise auf Null gesetzt werden, oder?

Grüße

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kenne die Lib ja nun gar nicht, aber 8 mal den gleichen 
Funktionsaufruf/Macro/WasAuchImmer ... .
Sicher, daß Du da nicht etwas falsch übernommen hast? Auf die Schnelle 
konnte ich den Codeteil dort auch nicht finden.filter

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mhhh ... Ich denke hier wird halt der Filter in eine entsprechende Form 
gebracht.

#define MCP2515_FILTER(id) \
00156             (uint8_t)((uint32_t) id >> 3), \
00157             (uint8_t)((uint32_t) id << 5), \
00158             0, \
00159             0

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch wenn ich es immer noch nicht verstehe

MCP2515_FILTER_EXTENDED(0)
zu z.B.
MCP2515_FILTER(id) (uint8_t)((uint32_t) id >> 3)

Nehmen wir an, die EXTENDED-Geschichte wäre ähnlich aufgebaut wie unten 
gepostet. Wenn "id" dann "0" ist, kann man shiften wie man will, das 
bleibt immer "0".

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jepp ... aber normalerweise steht da aber keine null, sonder das Bit des 
CAN-ID das man gerne filter/maskieren würde. Aber wenn man Null einträgt 
sollten alle Nachrichten durchgelassen werden. Ist aber bei mir nicht 
so. Sobald ich mit

can_static_filter(can_filter);

Filter und Masken lade kann ich keine Nachricht mehr empfangen

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... die EXTENDED-Geschichte ist ähnlich aufgebaut.

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, ich kenn die Lib, wie gesagt, leider nicht. Gemäß Datenblatt des 
MCP2515 (so ich mich auf die Schmelle jetzt nicht verlesen hab) wird 
jede Nachricht akzeptiert, wenn das zugehörige Maskbit "0" ist. Die 
Filterbits sind dann egal (Masken machen also eine Vorauswahl; sind 
"höherwertiger"). Erst wenn das Maskbit gesetzt ist, wird durch die 
Filterbits weiter gefiltert siehe FILTER/MASK TRUTH TABLE im 
Datenblatt).

Ohne Lib kann kann man im Register RXBnCTRL die Bits RXM1 und RXM0 "1" 
setzen; dann werden die Masken und Filter nicht ausgewertet und alle 
Nachrichten werden empfangen. Aber das hilft Dir leider bei der Lib auch 
nicht wirklich weiter ...

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Komisch, Nachrichten mit dem ID 1FFFFFFE können empfangen werden, alle 
anderen nicht! Woran könnte das nur liegen??

Autor: Philipp Drewes (phili)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe das gerade das selbe Problem mit der lib.
In den Registern "RXB0CTRL" und "RXB1CTRL" kann mit Hilfe der RXM-Bits 
festgelegt werden, welche NAchrichten empfangen werden sollen. Wenn ich 
hier etwas anderes als den Promiscuous-Mode auswähle, dann kommen keine 
Nachrichten mehr durch; auch nicht, wenn ich alle Masken-Bits auf null 
setzte.

Ich bin auch gerade ein wenig am verzweifeln. Ich arbeite zur Zeit 
übrigens nur mit extended frames.

 weiter am Suchen
Phili

Autor: Philipp Drewes (phili)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast schrieb:
> Komisch, Nachrichten mit dem ID 1FFFFFFE können empfangen werden, alle
> anderen nicht! Woran könnte das nur liegen??

Stimmt, Nachrichten mit der ID 1FFFFFFE lassen sich empfangen. 1FFFFFFF 
geht bei mir aber auch.

wirklich komisch

Autor: Philipp Drewes (phili)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lieber Gast,
funktioniert denn der Empfang von (beliebigen) Nachrichten bei Dir, wenn

in RXB1CTRL und RXB2CTRL  die Bits RXM0 = 0 und RXM1 = 0
und
     mcp2515_static_filter(static_can_filter);

nicht aufgerufen wurde?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Philipp Drewes: Müsste ich mal ausprobiern. Werde aber leider heute 
nicht mehr dazu kommen. Gibt es sonst was neues zum Thema?

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verwende den MCP2515 an einem Blackfin DSP. Für meine Treiber habe 
ich aber nur folgende Funktionen aus der lib verwendet:

mcp2515_write_register
mcp2515_read_register
mcp2515_bit_modify
mcp2515_read_status
mcp2515_read_rx_status
mcp2515_get_message
mcp2515_send_message

Die Filter stelle ich dann wie folgt ein:
/*
     *  Einstellen der Filter
     */
    
    // Buffer 0 : Empfangen der gefilterten Nachrichten
    mcp2515_write_register( RXB0CTRL, (1<<RXM0)|(1<<BUKT));
    
    // Buffer 1 : Empfangen der gefilterten Nachrichten
    mcp2515_write_register( RXB1CTRL, (1<<RXM0));
    
    mcp2515_write_register( RXM0SIDH, 0xff );
    mcp2515_write_register( RXM0SIDL, 0x80 );
    mcp2515_write_register( RXM0EID8, 0 );
    mcp2515_write_register( RXM0EID0, 0 );
  
    mcp2515_write_register( RXM1SIDH, 0xff );
    mcp2515_write_register( RXM1SIDL, 0xe0 );
    mcp2515_write_register( RXM1EID8, 0 );
    mcp2515_write_register( RXM1EID0, 0 );

  mcp2515_write_register( RXF0SIDH, 0xc4 );
    mcp2515_write_register( RXF0SIDL, 0 );
    mcp2515_write_register( RXF2SIDH, 0x40 );
    mcp2515_write_register( RXF2SIDL, 0x20 );

  mcp2515_write_register( RXF3SIDH, 0x4c );
    mcp2515_write_register( RXF3SIDL, 0 );
    mcp2515_write_register( RXF4SIDH, 0xcc );
    mcp2515_write_register( RXF4SIDL, 0 );
So kann ich die Filter einfach nach Datenblatt einstellen.
Obiges Beispiel filtert folgende Nachrichten raus:
Receive Buffer 0: ID 0x620 - 0x623
Receive Buffer 1: IDs 0x201, 0x260, 0x660

Wenn Du alle Nachrichten empfangen willst, dann musst Du doch nur 
folgende Register beschreiben:
// Buffer 0 : Empfangen aller Nachrichten
    mcp2515_write_register( RXB0CTRL, (1<<RXM0)|(1<<RXM1));
    
    // Buffer 1 : Empfangen aller Nachrichten
    mcp2515_write_register( RXB1CTRL, (1<<RXM0)|(1<<RXM1));

Autor: Philipp Drewes (phili)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Patrick,
> Wenn Du alle Nachrichten empfangen willst, dann musst Du doch nur
> folgende Register beschreiben:
>
// Buffer 0 : Empfangen aller Nachrichten
>     mcp2515_write_register( RXB0CTRL, (1<<RXM0)|(1<<RXM1));
> 
>     // Buffer 1 : Empfangen aller Nachrichten
>     mcp2515_write_register( RXB1CTRL, (1<<RXM0)|(1<<RXM1));
> 

ja das stimmt und es funktioniert dann auch. Jetzt will ich schon mit 
Hilfe der Filter eine Nachrichtenvorauswahl treffen um die CPU-Belastung 
zu senken.

Da ich mit den Filtern aber Probleme habe, möchte ich zunächst zwar 
Filter einsetzten, durch eine reine "Null-Maske" aber immernoch alle 
Nachrichten passieren lassen.

Habe auch schon versucht, die Masken und Filter direkt mit Hilfe von 
mcp2515_write_register einzustellen. Leider ohne Erfolg. Dabei habe ich 
schon darauf geachtet, das EXIDE-Bit im den Filter Registern zu setzen, 
da wir ja mit dem Extended ID Format arbeiten.

Phili

Autor: Philipp Drewes (phili)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Patrick,

ich habe jetzt mal diese Einstellungen in meine mcp2515-init Routine 
kopiert:
>   // Buffer 0 : Empfangen der gefilterten Nachrichten
>   mcp2515_write_register( RXB0CTRL, (1<<RXM0)|(1<<BUKT));
> 
>   // Buffer 1 : Empfangen der gefilterten Nachrichten
>   mcp2515_write_register( RXB1CTRL, (1<<RXM0));
>
>   mcp2515_write_register( RXM0SIDH, 0xff );
>   mcp2515_write_register( RXM0SIDL, 0x80 );
>   mcp2515_write_register( RXM0EID8, 0 );
>   mcp2515_write_register( RXM0EID0, 0 );
> 
>   mcp2515_write_register( RXM1SIDH, 0xff );
>   mcp2515_write_register( RXM1SIDL, 0xe0 );
>   mcp2515_write_register( RXM1EID8, 0 );
>   mcp2515_write_register( RXM1EID0, 0 );
> 
>   mcp2515_write_register( RXF0SIDH, 0xc4 );
>   mcp2515_write_register( RXF0SIDL, 0 );
>   mcp2515_write_register( RXF2SIDH, 0x40 );
>   mcp2515_write_register( RXF2SIDL, 0x20 );
> 
>   mcp2515_write_register( RXF3SIDH, 0x4c );
>   mcp2515_write_register( RXF3SIDL, 0 );
>   mcp2515_write_register( RXF4SIDH, 0xcc );
>   mcp2515_write_register( RXF4SIDL, 0 );

Damit werden dann bei mir leider nicht die gewünschten, sondern 
folgende Nachrichten gefiltert:

Receive Buffer 0: IDs 0x620, 0x621
Receive Buffer 1: IDs 0x200, 0x201, 0x260, 0x261, 0x660, 0x661

übrigens 0x320 und 0x321 gehen auch

Ich kapiere es nicht. Der Chip verhält sich einfach nur merkwürdig.
Auch wenn ich weniger 1-Bits in meinen Filtermasken setze z.B.
mcp2515_write_register( RXM0SIDH, 0xff );
mcp2515_write_register( RXM0SIDL, 0x00 );

werden vom MCP2515 Nachrichten mit den IDs 0x622 und 0x623 immernoch 
nicht empfangen.

Ich glaube ich tausche gleich mal den MCP2515 gegen einen anderen aus,
obwohl ich es noch nie erlebt habe, das ein IC nur ein bisschen defekt 
ist.

Außerdem hat Gast ja das selbe Problem

Phili,
der eigentlich der Meinung ist, ziemlich gut über Filter und Masken
bescheid zu wissen

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe die Filter mit Hilfe der angehängten Tabelle erstellt. Bei mir 
werden auch nur die gewünschten Nachrichten empfangen. Wie schnell 
betreibst Du Deine SPI? Und wie lang sind Deine Leitungen? Versuch doch 
mal die SPI etwas langsamer zu fahren.

Autor: Patrick (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Tabelle vergessen

Autor: Philipp Drewes (phili)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So bei mir läuft es jetzt mit den Filtern. Ich habe schließlich das IC 
getauscht. Da sich danach der Controller in undefinierten Zeitabständen 
aufgehänt hat, was anscheinend mit dem Mega128 SPI-Interface 
zusammenhängt, habe ich vorläufig auf Software-SPI umgestellt.

Siehe auch hier:
http://www.kreatives-chaos.com/artikel/universelle...


Ich kann es fast nicht glauben, dass es an dem Baustein gelegen hat, da 
ein halb funktionierendes IC so gut wie die absolute Ausnahme ist.

Leider habe ich keine Energie / Zeit dafür, den Baustein noch einmal zu 
tauschen (SDM-Gehäuse).

Danke an Alle, die hier mitdiskutiert und geholfen haben.
Gast, für Dich  hoffe ich, das Du auch noch Deine Lösung findest.

Soweit erstmal
Phili

Autor: Ulrich von den Hoden (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo stelle ich denn die ID des Avrs ein? Ich finde das weder im Programm 
noch in den anderen Files... :(

Autor: Philipp Drewes (phili)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ulrich,
der AVR selbst hat keine ID. Nur die Nachrichten haben ID-Nummern. Mit 
Hilfe der Filterregeln kannst Du jetzt festlegen, welche Nachrichten 
überhaput von dem MCP2515 akzeptiert und an Deinen AVR weitergereicht 
werden.

Geräte werden in höheren Protokollschichten teeilweise mit IDs 
ausgestattet, indem gewisse Bytes der Nachrichten-ID als Sender bzw. 
Empfängerkennung genutzt werden (beispielsweise bei J1939 oder 
NMEA2000).

Phili

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, daß ich diesen uralten Thread wieder ausgrabe. Ich habe im Moment 
exakt das gleiche Problem wie der Ersteller dieses Threads.
Ich habe hier eine Mega644 + MCP2515 auf meiner Platine und nutze die 
CAN-Lib von Kreatives Chaos. Die Kommunikation über den CAN-Bus klappt 
damit auch super. Sowohl senden als auch empfangen.
Sobald ich mit " can_static_filter(can_filter); " die Filter des MCP2515 
aktiviere, empfange ich keinerlei Nachrichten mehr. vgl. 
Eröffnungsbeitrag

Hat jemand schonmal das gleiche Problem gehabt und eine Lösung gefunden? 
An einen defekten CAN-Controller kann ich einfach nicht glauben.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.