Warum empfängt mein CAN-Transceiver keine Nachrichten, es sei denn, es liegt eine lange Startverzögerung vor oder ein Busanalysator ist angeschlossen?

8

Ich verwende eine 16-Bit-MCU, PIC24HJ64GP504 , um eine CAN-basierte Anwendung zu schreiben. Grundsätzlich ist es die Kommunikation zwischen meinem Board und einem anderen Knoten, die kontinuierlich Daten mit CAN mit 1 Mbit / s an mein Board sendet. Ich konfiguriere das ECAN-Modul in meinem PIC24 so, dass es mit 1 Mbit / s arbeitet. Ich habe den Code so geschrieben, dass das ECAN-Modul in den ersten 10 ms alle von der anderen Seite eingehenden Nachrichten akzeptiert. Danach habe ich das ECAN-Modul so konfiguriert, dass nur die Nachrichten mit der Nachrichten-ID 0x13 akzeptiert werden.

Jetzt kommt das Problem. Der andere Knoten und mein Board werden im selben Moment eingeschaltet. Der andere Knoten beginnt nach etwa 40 ms nach dem Einschalten mit der Übertragung von Nachrichten. Aber ich kann keine Nachricht auf meinem Board erhalten. Wenn ich jetzt mein Board zuerst einschalte, geben Sie ihm etwas Zeit, um das ECAN-Modul mit neuen Filtern neu zu konfigurieren und den anderen Knoten zu beruhigen und dann einzuschalten, dann funktioniert alles perfekt.

Jetzt der seltsamste Teil. Wenn ich einen CAN-Bus-Analysator zwischen meiner Karte und dem anderen Knoten angeschlossen habe und selbst wenn ich beide Knoten gleichzeitig einschalte, funktioniert alles einwandfrei ... ich muss meine Karte nicht zuerst einschalten. Ich habe dies mit drei verschiedenen Busanalysatoren verschiedener Hersteller versucht und die gleichen Ergebnisse erzielt.

Mir scheint, dass es während der Neukonfiguration des ECAN-Moduls einige Zeit dauert, bis es sich beruhigt hat. Und mit der Einführung des Busanalysators im Bus wird diese Zeit irgendwie verkürzt, damit alles perfekt funktioniert. Aber ich bin mir nicht sicher, was genau das Problem sein könnte.

Ich habe in den letzten sieben Tagen mit diesem Problem zu kämpfen.

PS: Heute habe ich mit einem Oszilloskop nachgefragt und festgestellt, dass das Ganze einwandfrei funktioniert, wenn der andere Knoten nach 170 ms nach dem Einschalten mit der Übertragung beginnt. Vorher empfängt mein Gerät keine Nachrichten, es sei denn, der Busanalysator ist angeschlossen. Das Schlimmste ist, dass ich die Übertragung des anderen Knotens nicht verzögern kann. Die Firmware dieses Knotens ist proprietär.

Außerdem habe ich heute in einem Forum gelesen, dass CAN den 120 Ω-Widerstand am Knoten benötigt, damit er funktioniert (obwohl mein Knoten keinen hat und einwandfrei funktioniert, vorausgesetzt, er hat nach der Neukonfiguration etwas Zeit, sich zu beruhigen). Ich vermute, dass die Einführung des Busanalysators die elektrischen Parameter einiger Netzwerke so ändert, dass die Zeit, die mein Knoten benötigt, um sich nach der Neukonfiguration einzurichten, verkürzt wird. Aber ich bin mir nicht sicher.. :(

Mayuresh
quelle
1
Können Sie uns Links zu allen von Ihnen verwendeten Produkten geben? Dadurch können konkrete Antworten leichter formuliert werden.
Kortuk
Können Sie Änderungen an Ihrem Board vornehmen oder erwarten / hoffen Sie auf eine reine Softwarelösung?
Vicatcu
Sind Sie sicher, dass der andere Knoten weiter sendet, auch wenn Ihr eigener Knoten nicht aktiv ist? Einige CAN-Implementierungen verwenden einen Fehlerzähler. Wenn dieser überläuft (z. B. weil keine Knoten empfangen werden), stoppt der sendende Knoten.
Schedler
1
keil.com/download/files/can_primer_2009sp.pdf Ausgezeichnete Grundierung in CAN.
Stephen Collings

Antworten:

9

Sie "lesen in einem Forum" irgendwo, dass der CAN-Bus Widerstände benötigt? Ernsthaft!!?

Dies ist ein wesentlicher Bestandteil Ihres Designs. Wenn Sie CAN verwenden möchten, müssen Sie es verstehen, was bedeutet, dass Sie die entsprechende Dokumentation lesen.

Spearson hat Recht, aber aus dem falschen Grund. Ein differenzieller CAN-Bus, wie Sie ihn wahrscheinlich haben (Sie haben nicht angegeben, welchen Schnittstellenchip Sie verwenden, aber wahrscheinlich haben Sie einen standardmäßigen differentiellen CAN-Bus, der an jedem Knoten von einem MCP2551 angesteuert wird), erfordert einen Widerstand zwischen den Leitungen. Dies liegt daran, dass der rezessive Zustand dadurch signalisiert wird, dass die beiden Linien passiv zusammengezogen werden, und der dominante Zustand dadurch, dass sie aktiv auseinandergezogen werden. Die Widerstände zwischen den Leitungen entsprechen in diesem Sinne einem Pullup-Widerstand auf einer offenen Kollektorleitung. Ohne dass etwas die Leitungen zusammenzieht, wenn nichts den Bus fährt, funktioniert der Bus nicht.

Die Widerstände fungieren auch als Abschlusswiderstände, wie Spearson hervorhob. In der Regel verwenden Sie Twisted Pair für die beiden Busleitungen. Dies hat eine Impedanz von ca. 120 Ω. Diese Art von differentiellem CAN-Bus ist so definiert, dass zwischen den Leitungen 60 Ω als Durchzug liegen, so dass jeweils 120 Ω implementiert werden können, um den Bus zu beenden und Reflexionen zu vermeiden.

 

Olin Lathrop
quelle
Worauf bezieht sich "Speer"? Ein Benutzer namens "spearson", der einen Kommentar hinterlassen hat (seitdem gelöscht oder der Benutzername geändert?)? Ein Buch (Name des Autors)?
Peter Mortensen
@ Peter: Anscheinend ja.
Olin Lathrop
4

Im normalen CAN-Betrieb wiederholt ein Knoten seine Übertragung, bis er bestätigt wird oder die Fehleranzahl überschritten wurde. Wenn Sie den CAN-Analysator mit dem Netzwerk verbunden haben, gibt er das ACK-Bit aus, wenn er den Frame von Ihrem ersten Knoten erkennt, wodurch die Übertragung erfolgreich wird. Wenn Sie den Microchip CAN BUS Analyzer verwenden , können Sie ihn auf den Nur-Listen-Modus konfigurieren. Dies bedeutet, dass keine ACK-Bits ausgegeben werden und das Netzwerk daher nicht beeinträchtigt wird. Sie sollten also in der Lage sein, den wiederholten CAN-Frame in der Analysatoranzeige zu sehen, bis der zweite Knoten eine ACK ausgibt oder der erste Knoten die Übertragung aufgrund der Fehleranzahl beendet.

Das ACK-Bit wird von einem empfangenden Knoten (wenn der Rahmen vollständig und korrekt ist) unabhängig von einer Adressfilterung gesetzt.

Höchstwahrscheinlich erreicht Ihr erster Knoten einen Fehlerstatus, da der Frame nicht bestätigt wird. Sie sollten dies in der Software anhand des CiINTF-Registers erkennen. Sie können den PIC auch so konfigurieren, dass Interrupts für Fehlerzustände mithilfe des CiINTE-Registers ausgegeben werden.

Wenn Ihr Bereich CAN-Frames nicht dekodiert, versuchen Sie es mit der Saleae-Logik Analyzer. Der CAN-Frame wird dekodiert und das ACK / Error-Bit angezeigt. Es war viel zuverlässiger als der Microchip CAN-Analysator.

Erik
quelle
3

In einem CAN-Frame befindet sich ein ACK-Steckplatz (zwei Bits). Wenn ein Knoten A die Daten überträgt und sich fünf andere Knoten auf dem Bus befinden, setzt nach der Übertragung der Knoten, der den Rahmen empfängt, das dominante Bit in den ACK-Schlitz. Dies zeigt an, dass die Nachricht erfolgreich übertragen wurde. Andernfalls betrachten CAN-Controller dies als Fehler auf dem Bus.

Wenn Sie einen CAN-Analysator hinzufügen, sendet dieser ACK an den Sender. Der Sender findet den Bus gut und sendet weiter. In Abwesenheit eines CAN-Analysators erhält der Sender beim Neukonfigurieren Ihres CAN-Controllers keine ACK und glaubt, dass ein Fehler auf dem Bus vorliegt, sodass die Übertragung beendet wird.

Ich hoffe du hast den Punkt verstanden.

Stellen Sie sicher, dass ACK ordnungsgemäß funktioniert. Versuchen Sie auch, Ihren CAN-Receiver während der Neukonfiguration nicht vollständig auszuschalten.

Ein weiterer Trick (ich bin nicht sicher, ob es immer funktionieren wird) besteht darin, nach der Neukonfiguration einen Null-DLC- und einen Null-ID-Frame zu senden. Dadurch wird dem Senderknoten mitgeteilt, dass der Bus aktiv ist, und er beginnt mit der Übertragung.

Hinweis: Ein 120 Ω Widerstand ist ein MUSS !!! . Ein Abschlusswiderstand ist DAS Wichtigste an JEDEM Bus.

Swanand
quelle
Ihr Trick, nach der Initialisierung einen Null-DLC- und einen Null-ID-Frame zu senden, ist bereits in den Standards enthalten, die als Startnachricht bezeichnet werden. Die ID entspricht dem Heartbeat (0x700 + Node ID) und hat einen einzelnen DLC von 1. Die Analysator-Tools sollten dies erkennen.
BullBoyShoes