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


von Gast (Gast)


Lesenswert?

Hallo,

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

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


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:

1
// Filter und Masken-Tabelle anlegen
2
 prog_char can_filter[] = {
3
    MCP2515_FILTER_EXTENDED(0), // Filter 0
4
    MCP2515_FILTER_EXTENDED(0), // Filter 1
5
    
6
    MCP2515_FILTER_EXTENDED(0), // Filter 2
7
    MCP2515_FILTER_EXTENDED(0), // Filter 3
8
    MCP2515_FILTER_EXTENDED(0), // Filter 4
9
    MCP2515_FILTER_EXTENDED(0), // Filter 5
10
    
11
    MCP2515_FILTER_EXTENDED(0), // Maske 0
12
    MCP2515_FILTER_EXTENDED(0), // Maske 1
13
 };
14
 
15
 ...
16
17
 // Filter und Masken-Tabelle laden
18
 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

von Lutz (Gast)


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

von Gast (Gast)


Lesenswert?

mhhh ... Ich denke hier wird halt der Filter in eine entsprechende Form 
gebracht.

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

von Lutz (Gast)


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".

von Gast (Gast)


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

von Gast (Gast)


Lesenswert?

... die EXTENDED-Geschichte ist ähnlich aufgebaut.

von Lutz (Gast)


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 ...

von Gast (Gast)


Lesenswert?

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

von Philipp D. (phili)


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

von Philipp D. (phili)


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

von Philipp D. (phili)


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
1
     mcp2515_static_filter(static_can_filter);

nicht aufgerufen wurde?

von Gast (Gast)


Lesenswert?

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

von Patrick (Gast)


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:
1
/*
2
     *  Einstellen der Filter
3
     */
4
    
5
    // Buffer 0 : Empfangen der gefilterten Nachrichten
6
    mcp2515_write_register( RXB0CTRL, (1<<RXM0)|(1<<BUKT));
7
    
8
    // Buffer 1 : Empfangen der gefilterten Nachrichten
9
    mcp2515_write_register( RXB1CTRL, (1<<RXM0));
10
    
11
    mcp2515_write_register( RXM0SIDH, 0xff );
12
    mcp2515_write_register( RXM0SIDL, 0x80 );
13
    mcp2515_write_register( RXM0EID8, 0 );
14
    mcp2515_write_register( RXM0EID0, 0 );
15
  
16
    mcp2515_write_register( RXM1SIDH, 0xff );
17
    mcp2515_write_register( RXM1SIDL, 0xe0 );
18
    mcp2515_write_register( RXM1EID8, 0 );
19
    mcp2515_write_register( RXM1EID0, 0 );
20
21
  mcp2515_write_register( RXF0SIDH, 0xc4 );
22
    mcp2515_write_register( RXF0SIDL, 0 );
23
    mcp2515_write_register( RXF2SIDH, 0x40 );
24
    mcp2515_write_register( RXF2SIDL, 0x20 );
25
26
  mcp2515_write_register( RXF3SIDH, 0x4c );
27
    mcp2515_write_register( RXF3SIDL, 0 );
28
    mcp2515_write_register( RXF4SIDH, 0xcc );
29
    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:
1
// Buffer 0 : Empfangen aller Nachrichten
2
    mcp2515_write_register( RXB0CTRL, (1<<RXM0)|(1<<RXM1));
3
    
4
    // Buffer 1 : Empfangen aller Nachrichten
5
    mcp2515_write_register( RXB1CTRL, (1<<RXM0)|(1<<RXM1));

von Philipp D. (phili)


Lesenswert?

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

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

von Philipp D. (phili)


Lesenswert?

Hallo Patrick,

ich habe jetzt mal diese Einstellungen in meine mcp2515-init Routine 
kopiert:
1
>   // Buffer 0 : Empfangen der gefilterten Nachrichten
2
>   mcp2515_write_register( RXB0CTRL, (1<<RXM0)|(1<<BUKT));
3
> 
4
>   // Buffer 1 : Empfangen der gefilterten Nachrichten
5
>   mcp2515_write_register( RXB1CTRL, (1<<RXM0));
6
>
7
>   mcp2515_write_register( RXM0SIDH, 0xff );
8
>   mcp2515_write_register( RXM0SIDL, 0x80 );
9
>   mcp2515_write_register( RXM0EID8, 0 );
10
>   mcp2515_write_register( RXM0EID0, 0 );
11
> 
12
>   mcp2515_write_register( RXM1SIDH, 0xff );
13
>   mcp2515_write_register( RXM1SIDL, 0xe0 );
14
>   mcp2515_write_register( RXM1EID8, 0 );
15
>   mcp2515_write_register( RXM1EID0, 0 );
16
> 
17
>   mcp2515_write_register( RXF0SIDH, 0xc4 );
18
>   mcp2515_write_register( RXF0SIDL, 0 );
19
>   mcp2515_write_register( RXF2SIDH, 0x40 );
20
>   mcp2515_write_register( RXF2SIDL, 0x20 );
21
> 
22
>   mcp2515_write_register( RXF3SIDH, 0x4c );
23
>   mcp2515_write_register( RXF3SIDL, 0 );
24
>   mcp2515_write_register( RXF4SIDH, 0xcc );
25
>   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.
1
mcp2515_write_register( RXM0SIDH, 0xff );
2
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

von Patrick (Gast)


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.

von Patrick (Gast)


Angehängte Dateien:

Lesenswert?

Tabelle vergessen

von Philipp D. (phili)


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-can-bibliothek#c000661


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

von Ulrich von den Hoden (Gast)


Lesenswert?

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

von Philipp D. (phili)


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

von Jürgen (Gast)


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.

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.