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:
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 | _____| |____ |
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.