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_charcan_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
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
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".
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
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 ...
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
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
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
// 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:
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
>// 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
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.
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
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
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.