Hallo,
ich habe noch einmal eine Frage zum CAN.
Wenn ich eine Anfrage auf mein Controller schicke, lasse ich mir die
Anzahl der Sende-Errors, sowie der Empfangs-Errors ausgeben. Ist es
möglich ein Empfang-Error zu simulieren? beim Senden-Error habe ihc
einfach das can-kabel abgezogen.
Meine Frage bezieht sich auch auf das Abrufen der Errors.
Wenn ich die Sende-Errors abfrage, bekomme ich einen Wert (z.B. 0x69)
jetzt frage ich den Wert noch einmal ab und bekomme dann den wert 0x68.
Dann lasse ich andere nachrichten drüber laufen. Für jede nachricht
(Senden und empfangen), geht der Wert runter. Woran liegt das?
Ich benutze
(C1EC & 0x00FF) für die Empfangs-Errors und
(C1EC & 0xFF00) >> 8 für die Errors, die beim Senden entstanden sind.
Johannes
Johannes schrieb:> Wenn ich die Sende-Errors abfrage, bekomme ich einen Wert (z.B. 0x69)> jetzt frage ich den Wert noch einmal ab und bekomme dann den wert 0x68.> Dann lasse ich andere nachrichten drüber laufen. Für jede nachricht> (Senden und empfangen), geht der Wert runter. Woran liegt das?
Die Error-Counters zeigen nicht die Anzahl der Fehler an, sondern werden
nach bestimmten Regeln erhöht oder verringert. Siehe Kapitel 3.2:
http://documentation.renesas.com/doc/products/mpumcu/apn/rej05b0804_m16cap.pdf
mh, wieso können die nicht einfach hochzählen?
naja, werden wohl ihre gründe dafür haben. das muss ich mir erst noch
zwei, drei mal durchlesen, bis ich das richtig verstanden habe.
aber danke dir
Johannes schrieb:> mh, wieso können die nicht einfach hochzählen?
Weil sie eben nicht einfach dazu da sind, Fehler zu zählen. Sie gehören
zur automatischen schrittweisen Abkopplung des Controllers vom CAN im
Fehlerfall. Wenn der Fehler aber behoben ist, sollen nicht irgendwelche
uralten Fehler von vor Tagen noch eine Rolle spielen, nur weil die noch
im Counter stehen.
Sieh dir mal die Zustände "error active", "error passive" und "bus off"
an. Die stehen im Zusammenhang mit diesen Zählern.
Auf den ersten blick macht es für mcih einfach keinen Sinn. Ich habe
z.B. 20x einen Fehler bekommen und anschließend 20 nachrichten
erfolgreich gesendet bzw. empfangen. Dann habe ihc ja wieder einen
Fehlerstand von null.
Die andere Frage, wozu ich eigentlich die anzahl der Fehler haben
möchte. Ist es überhaupt möglich, die anzahl der einzelnen Fehler
(Acknowledge-Fehler, Form-Fehler und Bit-Fehler) zu ermitteln? Laut
datenblatt
The CAN module will detect the following transmission errors:
• Acknowledge Error
• Form Error
• Bit Error
These transmission errors will not necessarily generate an interrupt but
are indicated by the transmission error counter. However, each of these
errors will cause the transmission error counter to be incremented by
one. Once the value of the error counter exceeds the value of 96, the
ERRIF (CiINTF<5>) and the TXWAR bit (CiINTF<10>) are set. Once the value
of the error counter exceeds the value of 96 an interrupt is generated
and the TXWAR bit in the error flag register is set.
Das heisst ja soviel wie, dass die art des fehlers nicht unterschieden
werden kann. Ich kann ja 8x einen Form-Fehler haben (der Transmission
error counter wird je um eins erhöht) oder einmal einen Fehler haben,
der den error counter um 8 erhöht. Auch unter sich (Acknowledge-, Form-,
Bit-Fehler lassen sich nciht unterscheiden)
Hinterher wollte ich eigentlich, dass bei eingehender NAchricht die
Anzahl der einzelnen Fehler raussende.
Johannes schrieb:> Auf den ersten blick macht es für mcih einfach keinen Sinn. Ich habe> z.B. 20x einen Fehler bekommen und anschließend 20 nachrichten> erfolgreich gesendet bzw. empfangen. Dann habe ihc ja wieder einen> Fehlerstand von null.
Ja, und genau das ist Sinn der Sache. Sieh den Error-Counter nicht als
Anzahl der in der Vergangenheit aufgetretenen Fehler, sondern als ein
Indiz, wie hoch die Wahrscheinlichkeit ist, daß der Bus aktuell
fehlerhaft ist.
> Ist es überhaupt möglich, die anzahl der einzelnen Fehler> (Acknowledge-Fehler, Form-Fehler und Bit-Fehler) zu ermitteln?
Das hängt vom CAN-Controller ab. Ich habe bisher nur den SJA-1000
benutzt, und der kann das. Welchen Controller du hast, hast du nicht
verraten.
> These transmission errors will not necessarily generate an interrupt
Ist nur die Frage, was "not necessarily" bedeutet. Ist das eine
Konfigurationssache oder wird einfach kein Interrupt ausgelöst?
Rolf Magnus schrieb:> Ja, und genau das ist Sinn der Sache. Sieh den Error-Counter nicht als> Anzahl der in der Vergangenheit aufgetretenen Fehler, sondern als ein> Indiz, wie hoch die Wahrscheinlichkeit ist, daß der Bus aktuell> fehlerhaft ist.
Ahso, ja dann macht die zählerei auch für mich sinn.
Ich benutze für mein CAN je einen PIC aus der daPIC30F-Familie. Als
CAN-Transceiver benutze ich je einen MCP2551.
Rolf Magnus schrieb:> Ist nur die Frage, was "not necessarily" bedeutet
Ich verstehe es so, dass zwar ein Interrupt ausgelöst wird, aber halt
nur ein error-interrupt und nicht unterschieden wird, wieso.
Johannes schrieb:> Auf den ersten blick macht es für mcih einfach keinen Sinn. Ich habe> z.B. 20x einen Fehler bekommen und anschließend 20 nachrichten> erfolgreich gesendet bzw. empfangen. Dann habe ihc ja wieder einen> Fehlerstand von null.
Sinn des ganzen ist eine möglichst hohe Verfügbarkeit des Busses auch im
Fehlerfall. Wenn dein Gerät der Störer ist, wird dieses durch das
schnelle hochzählen der Counter schnell "abgekoppelt" (TX Counter, wenn
er fehlerhaft sendet, RX Counter, wenn er fehlerhafterweise Fehler
erkennt, wo es keine gibt). Danach haben die verbleibenden Geräte durch
das langsame runterzählen "viel" Zeit ihre normale Kommunikation
durchzuführen, bis der Bus wieder kurzzeitig gestört ist.
(arg vereinfacht dargestellt)
> Die andere Frage, wozu ich eigentlich die anzahl der Fehler haben> möchte.
???
> These transmission errors will not necessarily generate an interrupt but> are indicated by the transmission error counter.
Dann kann dieser CAN Controller nicht bei jeder fehlerhaften Übertragung
einen Interrupt generieren. Wird auch nur selten benötigt, da die
Interruptlast im Fehlerfall schon extrem sein kann (Bit Fehler aller 11
bitzeiten im Error Active - so als Extremfall)
> Das heisst ja soviel wie, dass die art des fehlers nicht unterschieden> werden kann. Ich kann ja 8x einen Form-Fehler haben (der Transmission> error counter wird je um eins erhöht) oder einmal einen Fehler haben,> der den error counter um 8 erhöht. Auch unter sich (Acknowledge-, Form-,> Bit-Fehler lassen sich nciht unterscheiden)
Zur Busanalyze scheint dieser CAN Controller nicht geeignet.
> Hinterher wollte ich eigentlich, dass bei eingehender NAchricht die> Anzahl der einzelnen Fehler raussende.
Wozu? Darauf bist du nicht eingegangen.
Dieses Detail wird nur selten gebraucht. Vielleicht gibt es ja für dein
spezielles Problem eine andere Lösung.