Forum: Mikrocontroller und Digitale Elektronik MCP2515 Probleme


von nepf (Gast)


Lesenswert?

Hallo,

ich nutze den MCP2515 CAN Controller und habe zwei Fragen dazu.

1. Problem:
Wie genau funktioniert das mit den Receive Buffer und den jeweiligen 
Filter/Masken dazu?
Es trifft eine Nachricht ein und gelangt zunächst ins MAB.
Wie wird dann entschieden in welchen Buffer die Nachricht gelegt wird?
Was bringen mir zwei Empfangsbuffer für Vorteile?
Weiterhin gibt es, je nach Buffer, verschiedene Filter und eine Maske. 
Anhand der Wahrheitstabelle ist das Prinzip mit einem Filter leicht zu 
verstehen, aber was bringen dann z.B. 4 Filter im RXB1?

2. Problem:
Ich würde gern mit dem MCP2515 nur passiv mitlesen, also kein Ack, 
Error, etc.
Dazu gibt es ja den "Listen-only Mode".
Großer Nachteil dabei ist, dass in diesem Modus keine Filter 
funktionieren.
Wäre es möglich, den MCP im normal Mode zu betreiben und einfach die TX 
Leitung zum CAN Transeiver (MCP2551) zu unterbrechen?

Ich hoffe es kann mir jemand Licht ins dunkle bringen.

Grüße

von maveric00 (Gast)


Lesenswert?

Hallo,

1. Problem: Es gibt die beiden Messageboxen mit verschiedenen 
Filtersätzen aus zwei Gründen:

   a) um zumindest zwei Nachrichten bei hoher Buslast zwischenspeichern 
zu können
   b) um bestimmte Nachrichten priorisieren zu können

Die erste Messagebox (Receive Buffer) hat dazu 4 Filterregister, die 
zweite MB hat 2; die Nachricht landet normalerweise in der MB, deren 
Filter mit der empfangenen Nachricht übereinstimmt. Ausnahme: Man kann 
die erste MB auf "Überlaufen" einstellen, dann landen Nachrichten, die 
einem der Filter der ersten MB entsprechen in der zweiten MB, wenn die 
erste schon belegt ist.

Wenn Dein Knoten z.b. die Nachrichten 0123 0234 0345 und 0456 empfangen 
können soll, wovon die Nachricht 0456 die wichtigste ist (nicht mit der 
Priorisierung bei der Arbitrierung des Busses verwechseln), dann werden 
die Filter des ersten Registers auf 0123,0234,0345 und die des zweiten 
Registers auf 0456 gesetzt. Damit ist die Wahrscheinlichkeit, dass eine 
0456er bei hoher Buslast verloren geht kleiner als bei den anderen drei.

Wird diese Priorisierung nicht benötigt oder sind 3 oder weniger 
Nachrichten zu empfangen, kann man auch das "Überlauf-Bit" der ersten 
Messagebox setzen und damit beide Boxen für das Zwischenspeichern der 
Nachrichten verwenden. In diesem Fall drehen sich allerdings die 
Prioritäten um. Dies ist nützlich, wenn nur 3  oder weniger verschiedene 
Nachrichten empfangen werden sollen. In diesem Fall den Filter der 1. MB 
auf die wichtige setzen und die Filter der 2. MB auf die unwichtigen. 
Letztere haben dann nur eine FIFO von Tiefe 1, während die Wichtige eine 
FIFO der Tiefe 2 hat.

Das es nur eine Maske pro MB gibt, aber 2 oder 4 Filter ist zwar eine 
Einschränkung; häufig ist es jedoch so, dass Nachrichtentypen 
Adressgruppen zugeordnet werden, die dann mit der Maske überprüft werden 
können; oder aber Du möchtest dem Knoten mehr als 6 Adressen zuordnen, 
dann können bis zu 6 Gruppen von zusammenhängenden Adressen durch die 
Masken definiert werden (z.B, 0x120-0x123, 0x130-0x133, 
0x140-0x143,...). Weitere Anwendungsbeispiele der Maske sind das 
Ausblenden von bestimmten Elementen der Adresse die z.B. als Gruppen- 
oder Status-Informationen verwendet werden o.ä.. Schöner wäre also 
sicherlich, je Filter eine Maske zu haben, dafür ist der Baustein aber 
nicht komplex genug.

Zum zweiten Problem:
Das Nichtverbinden der TX-Leitung sollte gehen - Du brauchst dann 
allerdings noch mindestens 2 weitere Busteilnehmer damit der eine Sender 
ein Ack von einem anderen Teilnehmer bekommt. Und wie der MCP2515 in 
diesem Fall reagiert, wenn er bei einem erkannten Busfehler keinen 
Error-Frame senden kann (da ja das Rückgelesene Signal nicht mit dem 
gesendeten übereinstimmt) kann ich nicht sagen. Hier wäre meine Meinung: 
"Versuch macht kluch"

Schöne Grüße,
Martin

von 32bitter (Gast)


Lesenswert?

nepf schrieb:
> Wäre es möglich, den MCP im normal Mode zu betreiben und einfach die TX
> Leitung zum CAN Transeiver (MCP2551) zu unterbrechen?

Ja, aber dann am '2515 RX und TX über ein Wired-& zusammenbinden. So 
ungefähr:
1
vorher:
2
_____        ____
3
'2515|      |'2551
4
     |      |
5
CANTX|------|TX
6
     |      |
7
CANRX|------|RX
8
_____|      |____
9
10
nachher:
11
           VCC  VCC
12
_____       |    |   ____
13
'2515|      R    |  |'2551
14
     |      |    |  | 
15
CANTX|--|<--*    +--|TX
16
     |      |       |
17
CANRX|------*--->|--|RX
18
_____|              |____

von nepf (Gast)


Lesenswert?

Erstmal 1000 Dank für die sehr Ausführliche Antwort.
Mir ist nun einiges etwas klarer geworden.
Ich kann also konkret auf 6 genaue IDs filtern, möchte ich mehr muss ich 
versuchen mit Hilfe der Maske etwas zu erreichen.

> Letztere haben dann nur eine FIFO von Tiefe 1, während die Wichtige eine
> FIFO der Tiefe 2 hat

FIFO von Tiefe 1 und 2. Was heißt das?

> 32bitter schrieb:

           VCC  VCC
___       |    |   __
'2515|      R    |  |'2551
     |      |    |  |
CANTX|--|<--*    +--|TX
     |      |       |
CANRX|------*--->|--|RX
_____|              |____

Das TX vom 2551 direkt an Vcc? Wird es nicht hin und wieder auf Masse 
gezogen?
Was genau bewirken die Dioden, bzw. welches Verhalten sollen sie 
simulieren?

von NickNack (Gast)


Lesenswert?

Bin ebenfalls in der Situation erstmals mit dem MCP2515 arbeiten zu 
"dürfen".
Ich möchte auch nur bestimmte Datenpakete mitlesen und etwas mehr Info 
zur Hardwarebeschaltung von "32bitter" wäre wirklich interessant.
Vor allem wie ich per Jumper wieder auf "normal" umschalten könnte.

Meine Idee wäre ein 3pol-Jumper:
Links = TX-Leitung | Mitte = RX-Leitung | RECHTS = 4,7kOhm-R-VCC
( Links und Rechts kann natürlich auch oben/unten(etc.) vom 
Jumper-Stecker sein ;) )

Die Dioden aus "32bitter[s]" Vorschlag würden bei dieser Variante 
natürlich erhalten bleiben ... klappt das so?

von maveric00 (Gast)


Lesenswert?

Hallo,

FIFO Tiefe 1 heisst, dass alle einkommende Nachrichten, die vollständig 
bis zum Abholen der ersten Nachricht gesendet werden nach der ersten 
Nachricht verloren gehen (ein Buffer, der MAB sammelt dann jeweils neue 
einkommende Nachrichten, verwirft diese aber, wenn die nächste kommt), 
eine FIFO-Tiefe von 2 bedeutet, dass zwei Nachrichten 
zwischengespeichert werden (FIFO: First In First Out).

Die Beschaltung von 32bitter dient dazu, dass der 2515 alles was er 
sendet wieder zurücklesen kann. Dies kann notwendig sein, da er sonst 
eventuell beim Senden des Ack-Bits eine Kollision erkennt (sollte zwar 
nicht auftreten, wenn noch ein weiterer Teilnehmer am Bus hängt, da 
dieser das gleiche Signal wie Dein 2515 erzeugt, aber wer weiss?).

Die Schaltung funktioniert, da RX und TX im inaktiven Zustand auf VCC 
liegen und bei aktivierung auf Ground heruntergezogen werden. Dies wird 
hier erreicht, indem ein Pull-Up die Leitung oben hält, während die 
Dioden die beiden Ausgänge entkoppeln (so dass nicht ein VCC-Ausgang 
direkt mit einem GND-Ausgang gekoppelt wird). Die Ausgänge können dank 
der Dioden nur nach GND ziehen, aber kein VCC liefern (das kommt dann 
über den Widerstand).

Die Dimensionierung von R hängt von den Schaltschwellen der Eingänge 
sowie von der Stromfähigkeit der Ausgänge ab; eventuell hat 32bitter ja 
einen Vorschlag?

Zur Schaltbarkeit wird man die ganze Mimik herausnehmen müssen, da sonst 
ggf. eine empfangene "0" direkt wieder auf den Bus gesendet wird (der 
Bus also nicht wieder nach "1" gehen kann.

Schöne Grüße,
Martin

von NickNack (Gast)


Lesenswert?

maveric00 schrieb:
> Zur Schaltbarkeit wird man die ganze Mimik herausnehmen müssen, da sonst
> ggf. eine empfangene "0" direkt wieder auf den Bus gesendet wird (der
> Bus also nicht wieder nach "1" gehen kann.

Wie kann ich das nun genau lösen? Mir geht es nur darum zwischen einem 
Hardware(!) Listen-Only-Mode und normaler Funktion (mit Ack etc.) 
umschalten zu können.

von NickNack (Gast)


Lesenswert?

Push: Eine Hardware-Umschaltung ist immer noch von Interesse!

von maveric00 (Gast)


Lesenswert?

Hallo,

zur Hardwareumschaltung musst Du die Dioden brücken und die Verbindung 
zwischen TX und RX lösen. Eventuell reicht es auch, nur eine der beiden 
Dioden zu brücken, wenn der andere Zweig mit dem Pullup verbunden bleibt

1
            VCC  VCC
2
 _____       |    |   ____
3
 '2515|      R    |  |'2551
4
      |      |    |  |
5
 CANTX|--|<--*    +--|TX
6
      |      |       |
7
 CANRX|------*--->|--|RX
8
 _____|              |____
9
 
10
wird zu 
11
12
            VCC  VCC
13
 _____       |    *   ____
14
 '2515|      R       |'2551
15
      |      |    *  |
16
 CANTX|--|<--*----+--|TX
17
      |              |
18
 CANRX|------*-->|-*-|RX
19
 _____|      |_____| |____

Braucht also 4 Jumper / einen 4-fach Schalter oder 2 Wechsler. Ob das so 
funktioniert müsste man mal ausprobieren...

Schöne Grüße,
Martin

von qwertz (Gast)


Lesenswert?

Schon getestet NickNack?

von qwertz (Gast)


Lesenswert?

Ich muss den Thread hier nochmal aktivieren.

Mein Anliegen war es ja, einen passiven CAN "Empfänger" zu bauen.
Durch die o.g. Dioden zwischen dem MCP2515 und MCP2551 könnte dies ja 
Hardwaremäßig umgesetzt werden.

Kann man dies auch Softwaremäßig umsetzten?
Also das man dem MCP2515 vom µC keine Frames sendet.
Oder generiert der MCP2515 selbständig die Ack- oder Error Frames?

Es gibt ja auch noch diesen Listen-Only Modus, bei dem allerdings keine 
Filter und Masken funktionieren. Oder habe ich das falsch verstanden?

mfg

von maveric00 (Gast)


Lesenswert?

Hallo,

das kommt davon, wenn man sich von Anfang an zu sehr auf eine Lösung 
statt auf das Problem fixiert: Wie kam der TO eigentlich darauf, dass im 
Listen-Only-Mode die Filter nicht funktionieren? Das Datenblatt Rev E 
sagt jedenfalls dazu:
1
Listen-only mode is a silent mode, meaning no
2
messages will be transmitted while in this mode
3
(including error flags or acknowledge signals). The
4
filters and masks can be used to allow only particular
5
messages to be loaded into the receive registers, or the
6
masks can be set to all zeros to allow a message with
7
any identifier to pass. The error counters are reset and
8
deactivated in this state.

Filter sollten also (im Gegensatz zu den Error-Countern) gehen. Damit 
steht doch einem reinen Software Listen-Only-Mode nichts im Wege, oder?

Schöne Grüße,
Martin

P.S.: Im Normal Mode geht es nicht, da der MCP2515 selbstständig Errors 
und Acks erzeugt.

von nepf (Gast)


Lesenswert?

> P.S.: Im Normal Mode geht es nicht, da der MCP2515 selbstständig Errors
> und Acks erzeugt.

Also werden Error Frames direkt vom MCP selbständig erzeugt.

Mein Verständnis:
- Der MCP2515 schafft es die empfangene Nachricht in Echtzeit zu prüfen.

- Überprüfung erfolgreich: setzt dominanten Pegel an der Stelle des 
ACK-Slots und überschreibt somit den rezessiven Pegel des Senders. (Der 
ACK Pegel wird direkt in den Empfangsdatenstrom "geschrieben" ?)

- Überprüfung nicht erfolgreich: rezessiver Pegel am ACK-Slot und 
Erzeugen eines Error Frames.

- Und dann weiter?
Sendet Sender Nachricht erneut an Empfänger?
Was ist bei mehrere Empfängern: einer gibt ACK, einer gibt Error ?
Und: Zwischen Nachricht und Error können doch auch andere Teilnehmer 
bereits wieder Nachrichten auf den Bus geschickt haben. Oder wird so 
lange nicht weiter gearbeitet bis die vollständige Kommunikation 
zwischen 2 oder auch mehreren Teilnehmern erfolgt ist?

Gibt er für alle möglichen Fehler auch unterschiedliche Error Frames auf 
den Bus, oder beinhaltet ein Error Frame einfach nur "Error" ?
Im Datenblatt steht lediglich "an error frame is generated" [S.45].

- weiterhin:
Wird ein Fehler erkannt und ein Error Frame erzeugt (Error active), 
erhöht sich der Error Counter. Das geht so oft bis dieser eine gewisse 
Grenze (hier 128) erreicht hat und den MCP in den Error passive Modus 
schaltet, sodass der keine Error Frames mehr erzeugt. Richtig?
Wie wird er dann wieder in den Error active gebracht?

von qwertz (Gast)


Lesenswert?

okay - nochmal nachgeschaut:

http://ww1.microchip.com/downloads/en/DeviceDoc/21801G.pdf

Seite 59.

"Listen-Only mode is a silent mode, [*] signals).

In Listen-Only mode, both valid and invalid messages will
be received regardless of filters and masks or RXMn
Receive Buffer mode bits.

The error counters are reset and deactivated in this state.
The Listen-Only mode is activated by setting the mode request bits in 
the
CANCTRL register."

Da steht ein anderer Text, als du ihn gepostet hast.
Zu beachten: der zweite Satz.

von maveric00 (Gast)


Lesenswert?

Hallo,

das sind jetzt eher grundlegende Fragen zum CAN - kennst Du den (recht 
guten) Wikipedia-Artikel? Oder 
http://www-ivs.cs.uni-magdeburg.de/bs/lehre/wise9900/proro/vortrag/can/CAN.pdf 
?

Hier nur kurz:

- Der MCP2515 überprüft in Echtzeit
- Alle Empfänger auf dem Bus setzten bei einer gültigen Nachricht (also 
noch vor Filterung) das Ack auf Dominant (in den "Empfangsdatenstrom" 
hinein)
- Falls einer der Empfänger einen Fehler feststellt (z.B. Kollision nach 
Identifier, CRC error,...) sendet er direkt im Anschluss an das (von ihm 
rezessive) Ack einen Error-Frame. Der überschreibt den End-Of-Frame vom 
Sender, so dass dieser (und alle anderen Empfänger) den Fehler erkennt
- Die Empfänger übernehmen eine Nachricht nur, wenn sie komplett gültig 
war (inkl. End of Frame); kommt es zum Errorframe, wird die Nachricht 
komplett verworfen.
- Es gibt nur "Error", keine verschiedenen Arten
- Der Sender sollte die Nachricht wiederholen. Ob er das automatisch 
tut, oder erst nach Modifikation, bleibt ihm überlassen; der MCP2515 
versucht es automatisch so bald wie möglich wieder
- Im error passive wird auch ein Error-Flag gesendet (mit rezessiven 
Bits, daher wird der Bus nicht gestört aber eigene Sendungen 
abgebrochen)
- "Heile" Pakete verringern die Fehlerzähler und damit kann von passive 
error zu active error zurückgekehrt werden.
- Bus off heilt nach 128*11 rezessiven bits


Zu den Filtern: Interessant, der Passus hat sich zwischen Rev. E und 
Rev. G des Datenblatts geändert, ohne in der Änderungshistorie 
eingetragen zu sein - böse! Wie sich der Chip verhält weiss ich nicht, 
mit Listen-Only habe ich noch nicht gearbeitet.

Schöne Grüße,
Martin

von nepf (Gast)


Lesenswert?

wow - wieder mal 1000 Dank für die ausführliche Antwort :)

Mit den Filter, bzw. dem passiven lesen, das werde ich probieren.

Du kennst dich nicht zufällig mit der CAN Verwendung
unter dem RaspberryPi aus?
Ich habe diesbezüglich nämlich ein paar Schwierigkeiten...

von qwertz (Gast)


Lesenswert?

Hab die Schaltung mit zwei Schottky Dioden und einem 10 k Widerstand 
umgesetzt.
- Funktioniert nicht.

Alles ausgelötet und jeweils TX/RX normal verbunden, es geht.

Also liegt es genau an dieser Schaltung.
Könnte der Widerstand daran schuld sein?
Jemand die Schaltung schon mal getestet?

Grüße

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.