Hi, ein Knoten in einem CAN-Bus kann ja verschiedene Error-Status annehmen: Error Active Error Passive Bus Off Dieses wird ja vom CAN-Controller geregelt. Aber wenn ich jetzt so viele Transmitt-Error habe, dass mein CAN-Knoten in Bus Off geht, kann ich das den anderen Teilnehmern irgendwie mitteilen (also über einer CAN-Botschaft)? und komme ich da irgendwie, ausser durch einem Reset des µC, wieder heraus? Wenn mein Controller jetzt in Error Passive geht, sendet dieser ja keine Nachrichten mehr heraus. Aber was passiert mit den Nachrichten die im Puffer sind? werden die gelöscht? oder werden die beim Zustandswechsel in Error Active gesendet? Ich verwende einen dsPIC30F6011A sowie einen MCP2551 als CAN-Transceiver Johannes
Hallo Johannes, du hast bei den Error-Stati vom CAN noch einen kleinen Denkfehler. - Error active: der CAN Controller gibt beim einem Empfangsfehler ein Error-Flag auf den Bus (zerstört also das Telegramm für alle anderen Teilnehmer) - Error passive: der CAN Controller legt bei einem Empfangsfehler kein Error-Flag auf den Bus (das Telegramm ist also nur für ihn ungültig). Er kann ansonsten aber ganz normal senden und empfangen. - Bus off: der CAN Controller hat zuviele Empfangsfehler erkannt und zieht sich vom Bus vollständig zurück. Ein Melden dieses Zustandes an die anderen Teilnehmer ist also nicht möglich. CANopen bietet mit "Heartbeat" und "Node Guarding" Mechanismen, dass die Steuerung es mitbekommt, wenn ein Teilnehmer nicht mehr am Busverkehr teilnimmt. Manche Controller bieten ein "Auto Bus Recovery" an, das der Firmware ermöglicht, den CAN Controller aus dem Bus off wieder heraus zu holen. Das ist aber so erstmal nicht im Standard vorgesehen. Gruß, Markus
:
Bearbeitet durch User
Zunächst danke für die Antwort. Da hatte ich wirklich noch einen Denkfehler drinne. Ich hätte da noch einmal eine Nachfrage. Ich würde gerne dennoch überprüfen in welchem Status sich mein Controller befindet. Dazu kann ich ja die entsprechenden Bits abfragen. Hierbei habe ich allerdings noch Verständnisprobleme. Ich denke, dass ich das C1INTF-Interrupt Register zur überprüfung nehmen muss. Hier habe ich mal einen Ausschnitt. bit 13 TXBO: Transmitter in Error State, Bus Off bit 1 = Transmitter in error state, bus off 0 = Transmitter not in error state, bus off bit 12 TXEP: Transmitter in Error State, Bus Passive bit 1 = Transmitter in error state, bus passive 0 = Transmitter not in error state, bus passive bit 11 RXEP: Receiver in Error State, Bus Passive bit 1 = Receiver in error state, bus passive 0 = Receiver not in error state, bus passive bit 10 TXWAR: Transmitter in Error State, Warning bit 1 = Transmitter in error state, warning 0 = Transmitter not in error state, warning bit 9 RXWAR: Receiver in Error State, Warning bit 1 = Receiver in error state, warning 0 = Receiver not in error state, warning TXBO -> Bus Off. Das ist klar Jetzt habe ich zwei Fragen: Welche bits sind für den Zustand Error-Passive? Bit 11 und 12? Oder Bit 9 und 10? Wieso kann der sender und der Empfänger getrennt in den entsprechenden Zustand wechseln? Ich dachte, das würde mein kompletter CAN-Controller machen. Oder ist es, dass wenn einer der INterrupts auslöst, mein CAN-Controller z.B. über einen Transmittfehler in den Errror-Passive Zustand gewechselt hat. Welche Bits wären dann für den Zustandswechsel in Active-Error? Oder muss ich die Status ganz anders abfragen? Johannes
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.