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