Forum: Mikrocontroller und Digitale Elektronik CAN-Bus Error Handling


von Johannes (Gast)


Lesenswert?

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

von Markus D. (mowlwurf)


Lesenswert?

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
von Johannes (Gast)


Lesenswert?

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

von Johannes (Gast)


Lesenswert?

Hat sich erledigt, habe die Beschreibungen gefunden

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.