Forum: Mikrocontroller und Digitale Elektronik CAN-CRC berechnen


von Nils M. (nilsm)


Angehängte Dateien:

Lesenswert?

Hallo,

auf einem CAN-BUS habe ich die angehängte Sequenz mitgeschnitten.
Mein Problem ist es nun die CRC Berechnung nachzuvollziehen.
Ich habe mich heute zum ersten Mal mit der CRC Berechnung auseinander 
gesetzt und an meiner Sequenz auch einige Berechnungen durchgeführt. 
Leider habe ich andauernd einen anderen CRC raus als der vorgegebene.

Bisher habe ich versucht das Generatorpolynom mit den 15 niedrigsten 
Bits der beiden Daten-Bytes zu bilden.
Dann habe ich die Bits von SOF bis Data-Byte 1 genommen, 14 Nullen dran 
gehängt und durch das Generatorpolynom geteilt.

So habe ich es zumindest mithilfe der CAN-BUS Spec, wikipedia und 
einigen Foren-Beiträgen verstanden.

Kann sein, dass ich da grad irgendwie ein Brett vorm Kopf habe und ich 
irgendwas nicht richtige verstehe. Würde mich jedenfalls freuen wen mir 
jemand auf die Sprünge helfen könnte. Danke!


Gruß
Nils

von Wilhelm F. (Gast)


Lesenswert?

Nils M. schrieb:
> Kann sein, dass ich da grad irgendwie ein Brett vorm Kopf habe und ich
> irgendwas nicht richtige verstehe. Würde mich jedenfalls freuen wen mir
> jemand auf die Sprünge helfen könnte. Danke!

Mit dem CAN-Bus hatte ich mal zu tun, aber das ist schon etwas her, 
stecke da im Augenblick nicht mehr so tief drin. In deinem Dateianhang 
sehe ich Sequenzen, die mehr als 5 gleiche Bits haben. Und ich erinnere 
mich noch daran, daß es nicht vorkommen darf, im Datenstrom 5 gleiche 
Bits zu haben. Dann wird per Hardware das 5. Bit gekippt. War da nicht 
noch was mit so genannten Stub-Bits??? Wenn ich mich irre, betrachte 
meinen Beitrag als gegenstandslos. Aber es fiel mir als allererstes 
sofort auf.

von Anja (Gast)


Lesenswert?

Hallo,

der CRC-Berechnungsalgorithmus ist auf Seite 13 beschrieben:

http://www.bosch-semiconductors.de/media/pdf/canliteratur/can2spec.pdf


Gruß Anja

von Nils M. (nilsm)


Lesenswert?

Hallo,

danke für die bisherigen Antworten.
Habe mich heute nochmal damit beschäftigt aber leider zu keinem Ergebnis 
gekommen.

@Anja:
Den Link kannte ich schon. Habe die Beschreibung aber anscheinend leider 
nicht richtig verstanden. Weißt du wie der Algorithmus richtig 
funktioniert?

Bin über jede Hilfe weiterhin dankbar!

Gruß
Nils

von Balu (Gast)


Lesenswert?

Babe, wenn ich ja riechen koennte, wo Dein Problem liegt,
koennte man Dir ggf. helfen.  Vermutlich habe ich nun
hier Deine Uebungsaufgabe geloest. Naja...


Das sind die einzelnen Reduktionsschritte:

(0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0)

(0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0)

(0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0)

(0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0)

(0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0)

(1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0)

(0 1 0 1 0 1 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0)

(1 0 1 0 1 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0)

(0 1 1 0 1 1 1 0 1 0 1 1 1 0 1 1 0 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0)

(1 1 0 1 1 1 0 1 0 1 1 1 0 1 1 0 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0)

(0 0 0 1 1 0 0 0 1 1 1 0 1 1 1 1 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0)

(0 0 1 1 0 0 0 1 1 1 0 1 1 1 1 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0)

(0 1 1 0 0 0 1 1 1 0 1 1 1 1 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0)

(1 1 0 0 0 1 1 1 0 1 1 1 1 0 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0)

(0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 1 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0)

(0 0 0 0 0 1 0 1 1 1 0 0 0 0 1 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0)

(0 0 0 0 1 0 1 1 1 0 0 0 0 1 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0)

(0 0 0 1 0 1 1 1 0 0 0 0 1 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0)

(0 0 1 0 1 1 1 0 0 0 0 1 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0)

(0 1 0 1 1 1 0 0 0 0 1 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)

(1 0 1 1 1 0 0 0 0 1 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)

(0 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)

(1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)

(0 0 1 1 1 1 1 0 0 0 1 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)

(0 1 1 1 1 1 0 0 0 1 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)

(1 1 1 1 1 0 0 0 1 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)

(0 0 1 1 1 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)

(0 1 1 1 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)

(1 1 1 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)

(0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0)

(0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0)

(1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0)

(0 0 0 0 0 1 1 1 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0)

(0 0 0 0 1 1 1 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0)

(0 0 0 1 1 1 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0)

(0 0 1 1 1 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0)

(0 1 1 1 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0)

(1 1 1 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0)

(0 0 1 1 1 1 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0)

(0 1 1 1 1 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0)

(1 1 1 1 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0)

(0 0 1 1 1 1 0 1 0 1 1 1 1 1 0 1 0 0 0 0)

(0 1 1 1 1 0 1 0 1 1 1 1 1 0 1 0 0 0 0)

(1 1 1 1 0 1 0 1 1 1 1 1 0 1 0 0 0 0)

(0 0 1 1 0 0 0 0 0 1 1 0 1 1 0 1 0 0)

(0 1 1 0 0 0 0 0 1 1 0 1 1 0 1 0 0)

(1 1 0 0 0 0 0 1 1 0 1 1 0 1 0 0)

(0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 1)

(0 0 0 0 1 0 0 0 0 1 0 1 1 0 1)

-Balu

von H.Joachim S. (crazyhorse)


Lesenswert?

Und eigentlich hat man als Anwender gar nichts mit der CRC zu tun. Wird 
doch vom CAN-Controller erledigt, sowohl sender- als auch 
empfängerseitig.

Es sei denn, es geht tatsächlich um die Schule/Ausbildung :-)
Oder man will sich einen CAN-Controller selbst in Software giessen.

von Nils M. (nilsm)


Lesenswert?

Hallo,

danke für eure Antworten.

Eine Aufgabe für die Schule bzw. Ausbildung ist es nicht.
Es handelt sich um ein privates Projekt in dem ich über einen 
vorhandenen CAN-Bus Daten schicken möchte.
Als Hardware verwende ich einen MCP2551 und einen PIC uC. Einen extra 
CAN-Controller wollte ich nicht verwenden.
Also möchte ich einen CAN-Controller selbst mit Assembler schreiben.

@Balu:
Danke für die einzelnen Reduktionsschritte!

Ich habe jetzt meinen (eigentlich ziemlich dummen Fehler) erkannt.
Mein Fehler war, dass ich eine 1 im Generatorpolynom vergessen habe und 
somit ein Bit weniger hatte. Dadurch waren natürlich alle meine 
Rechnungen falsch.

Hätte ich meine Ausführung hier gepostet, hätte man meinen Fehler 
wahrscheinlich früher erkannt und du hättest dir nicht soviel Arbeit 
machen müssen. Bei meinem nächsten Problem (was ich hoffentlich nicht so 
schnell haben werde) werde ich dran denken.

Jedenfalls nochmal vielen Dank! :-)

Gruß
Nils

von holger (Gast)


Lesenswert?

>Als Hardware verwende ich einen MCP2551 und einen PIC uC. Einen extra
>CAN-Controller wollte ich nicht verwenden.

Es gibt doch haufenweise PICs mit eingebautem CAN Controller;)

von Nils M. (nilsm)


Lesenswert?

Stimmt, es gibt soweit ich weiß ab der 18er Serie einige PICs mit 
CAN-Controller.
Ich habe aber noch jede Menge 16er PICs zuhause rumliegen, die ich 
endlich mal sinnvoll einsetzen will. Die haben alle leider keinen 
CAN-Controller.

von holger (Gast)


Lesenswert?

>Ich habe aber noch jede Menge 16er PICs zuhause rumliegen, die ich
>endlich mal sinnvoll einsetzen will.

Dann bau dir ein Mobile daraus. Als CAN Controller taugen die nicht.
Nichts für ungut, ich mach gelegentlich auch noch was mit den 16F,
aber ich glaube da rennst du mit an die Wand.

von Nils M. (nilsm)


Lesenswert?

Hmm, jetzt bin ich schon zumindest dabei es zu versuchen.
Mit einem 16F kommt man schnell an seine Grenzen. Ist mir auch schon 
paar mal passiert. Die geschickteste Lösung ist der wirklich nicht.
Ich glaube aber für das was ich vorhab dürfte er noch gerade ausreichen. 
Es sollen nicht viele Daten über den CAN-Bus gelesen oder gesendet.
Falls ich es echt gegen die Wand rennen sollte, hast du mich jedenfalls 
gewarnt. :-)

von Wilhelm F. (Gast)


Lesenswert?

Nils M. schrieb:

> Also möchte ich einen CAN-Controller selbst mit Assembler schreiben.

Das würde ich mir reiflich überlegen! Wieviel BPS (Bit pro Sekunde) soll 
der denn dann in Software können? 100 oder 1000? Und zwar sah ich bei 
meinen eigenen Geschichten mit CAN schon mal Prototypenaufbauten aus der 
Anfangszeit von CAN mit vielen hochintegrierten Einzelbausteinen und 
Controllern. Das war für mich im wahrsten Sinne des Wortes das 
MERKwürdigste über die Komplexität. Und flößte mir gleich etwas Respekt 
ein. Eine Platine 20x20cm voll mit hochintegrierter Hardware. Und das 
Ergebnis, steckt heute in einem winzigen CAN-Controller drinne. Eine 
Menge Hardware, wie auch die CRC-Berechnung, und die Stub-Bits, die ich 
schon nannte, einige Dinge zur Betriebssicherheit des CAN. Da bei CAN 
ist einiges vieles in Hardware gelöst, da kommst du auch mit dem 
schnellsten µC in Assembler nicht dran.

von TestX .. (xaos)


Lesenswert?

mal im ernst... mach dir doch nicht die absolut sinnfreie arbeit das in 
software selbe rzu  machen.. nimm einen controller mit eingebautem can 
controller...sparrt zeit und ärger..

von H.Joachim S. (crazyhorse)


Lesenswert?

Eigentlich schade um die Zeit...
Du wirst nicht nur Timingprobleme bekommen, sondern sehr wahrscheinlich 
schnell auch an RAM- und ROM-Grenzen stossen. Selbst wenn du es schaffst 
- wo ist der Nutzen?
Ein externer CAN-Controller kostet 1€, und in 2h Programmierzeit läuft 
das Ding.

von Nils M. (nilsm)


Lesenswert?

Ich kann eure Bedenken natürlich verstehen und bin euch auch für eure 
Warnungen dankbar.
Aber die Anforderungen die ich an meinen CAN-Controller habe sind sehr 
sehr gering.
Im besten Fall muss er einmal am Tag, wenn überhaupt, einen kompletten 
Frame schicken. Im schlechtesten Fall muss er zwei Frames schicken und 
einen als Antwort empfangen. Die zu empfangenen Daten sind sogar 
vorraussehbar und die Datenrate relativ gering. Der PIC wird sich meiner 
Meinung nach eher damit langweilen was ich von ihm erwarte.

Kann sein, dass es alles wunderbar klappt (wovon ich grad ausgehe) oder 
ich werde echt meine Zeit vebraten und gegen die Wand laufen.
Dann habe ich halt Pech gehabt...
Aber immerhin werde ich dann drauß gelernt haben.
Die CAN-CRC Berechnung war bereits das erste was ich nun richtig 
verstanden habe.

von Helmut -. (dc3yc)


Lesenswert?

Nils, wie sieht's mit der Fehlerbehandlung aus? Kann das dein 
selbergestrickter Controller auch? Denn das ist ein ganz wichtiger 
Aspekt des CAN-Busses. Und wenn er das nicht kann, dann nenne ihn bitte 
nicht CAN-Controller :-(

von Chris D. (myfairtux) (Moderator) Benutzerseite


Lesenswert?

Das sehe ich ähnlich wie Nils.

Natürlich gibt es preiswerte IC-Lösungen und die Implementierung einer 
CAN-FSM ist nicht ohne.

Aber zum wirklich tiefgründigen Lernen/Gewinnen von Erfahrung am Bus ist 
das sicherlich eine sehr gute Idee (wenn nicht sogar die beste).

Wenn das Ding läuft - die Geschwindigkeit ist wohl nicht so 
entscheidend; dann läuft er halt nur mit 100 Bit/s - dann kann er von 
sich behaupten:

"Ja - ich verstehe jetzt CAN" :-)

Auf jeden Fall finde ich das besser als den 100en Motorcontroller zu 
bauen.

Versuchen? Auf jeden Fall!
Schaffen? Ich drücke die Daumen - einfach wird es nicht.

Chris D.
CAN-Fan - aber manchmal wird es zur Hassliebe ;-)

von Chris D. (myfairtux) (Moderator) Benutzerseite


Lesenswert?

Helmut -dc3yc schrieb:
> Nils, wie sieht's mit der Fehlerbehandlung aus? Kann das dein
> selbergestrickter Controller auch? Denn das ist ein ganz wichtiger
> Aspekt des CAN-Busses. Und wenn er das nicht kann, dann nenne ihn bitte
> nicht CAN-Controller :-(

Lass ihn doch einfach mal machen - ich denke, er ist froh, wenn der 
Controller überhaupt erstmal Daten überträgt.

:-)

Chris D.

von Thomas (kosmos)


Lesenswert?

@Balu: Könntest du mir bitte die Abfolge etwas genauer erklären.

Ich sehe du schiebst so lange nach links bis die 1 vorne steht was einer 
Division durch 32 entspricht, was passiert im nächsten Schritt? Ich 
verstehe nicht wo jetzt die neue Zeichenfolge herkommt?

X15 + X14 + X10 + X8 + X7 + X4 + X3 + 1
heißt das x hoch 15 + x hoch 14....wofür steht hier x für die Sequenz 
vom Startbit bis zum letzten Datenbit?

Wäre dir sehr dankbar wenn du das nochmal ausführlicher erklären 
würdest, ich würde dann auch einen Artikel dazu schreiben, da an dieser 
CAN-CRC Berechnung sehr viel Interesse besteht, auch wenns normal der 
CAN-Controller übernimmt.

von willibald (Gast)


Lesenswert?

Chris D. schrieb:
> Lass ihn doch einfach mal machen

Es ist ein hoher Aufwand, die nicht-triviale CAN-Physik 
nachzuprogrammieren. Die vorgesehene PIC-Hardware wird das aller 
Voraussicht nach nur auf sehr niedrigen Bitraten schaffen, die 
Verwendbarkeit in real existierenden CAN-Bus-Systemen ist also fraglich.

Auf der anderen Seite sind uCs mit integriertem CAN-Interface für wenige 
Euro zu kaufen.

Der Plan ist also ungefähr so sinnvoll wie das Abschreiben der 
Tageszeitung.

Der Lerneffekt (Verständnis von CAN) kann auch auf andere Weise erreicht 
werden, und zwar schneller und mit mehr Nutzen.

Unterm Strich ist es nichts als eine Vergeudung von Zeit, und da 
Lebenszeit keine unendliche Resource ist, kann man von "lasst ihn doch 
machen" in diesem Fall eigentlich nur abraten, was ich hiermit tue.

Gruß,
willibald

von Balu (Gast)


Lesenswert?

>Wäre dir sehr dankbar wenn du das nochmal ausführlicher erklären
>würdest, ich würde dann auch einen Artikel dazu schreiben, da an dieser
>CAN-CRC Berechnung sehr viel Interesse besteht, auch wenns normal der
>CAN-Controller übernimmt.

Der de.wikipedia.org Artikel ueber CRC ist zu empfehlen, dann
gibt es unter mikrocontroller.net noch diverse CRC-Threads.
Hier gibt es an gewissen Stellen Analogien zu einer regulaeren
Division, welche mehr oder weniger gut passen. Bereits diese
Analogien sind einigen mathematisch formaler orientierten
Personen aufgestossen, will heissen: Stelle Dich bei Deinem
Artikel auf viele falsche Aussagen und reges "Feedback" ein ;-)

Mal grad so erklaeren wuerde einiges an abstrakter Algebra, GF(2)
und Ringen erfordern ;-) Fuer tiefere Einsichten waere aber
"Error Correction Coding", T.K. Moon zu empfehlen; selbiger Autor
verwendet das Buch in einem 2 Semester Kurs), die CRC-Aufgaben
samt den Grundlagen umfassen etwa 3 Labs (== 3 Wochen Schufterei).

Zum operativen Teil(s.o):
steht vorne eine 0 -> shiften
steht vorne eine 1 -> mit dem Polynom reduzieren(exor), dann
                      steht zwingend wieder eine 0 da.

Viel Erfolg,
Balu

von Thomas (kosmos)


Lesenswert?

und am Ende kommt es auf den Rest an wie oft geshiftet wird ist ohne 
Belang

von Balu (Gast)


Lesenswert?

>und am Ende kommt es auf den Rest an wie oft geshiftet wird ist ohne
>Belang

Bei einer Nachricht m bestehend aus Bytes und der (Byte-)Laenge
m_l der Nachricht m wird  m_l * 8  mal geshiftet.

VG,
Balu

von Thomas (kosmos)


Lesenswert?

ich bin nun auch dahinter gekommen hatte ein einzelnes Bit falsch aus 
dem ersten Bild übernommen. Nun Ich habe einen kleinen Wiki-Artikel 
erstellt vielleicht könnt ihr ja mal drüber schauen damit ich nichts 
falsches verbreite. Werde mich demnächst an einen ASM Routine dazu 
machen und diese dem Artikel hinzufügen.

Und danke Nils für die Bereitstellung deines Bildes

http://www.mikrocontroller.net/wikisoftware/index.php?title=CAN_CRC_Berechnung&redirect=no

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.