www.mikrocontroller.net

Forum: Mikrocontroller und Elektronik CAN-CRC berechnen


Autor: Nils M. (nilsm)
Datum:
Angehängte Dateien:

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
Autor: Wilhelm Ferkes (ferkes-willem)
Datum:

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.
Autor: Anja (Gast)
Datum:

Hallo,

der CRC-Berechnungsalgorithmus ist auf Seite 13 beschrieben:

http://www.bosch-semiconductors.de/media/pdf/canli...


Gruß Anja
Autor: Nils M. (nilsm)
Datum:

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
Autor: Balu (Gast)
Datum:

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
Autor: H.joachim Seifert (crazyhorse)
Datum:

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.
Autor: Nils M. (nilsm)
Datum:

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
Autor: holger (Gast)
Datum:

>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;)
Autor: Nils M. (nilsm)
Datum:

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.
Autor: holger (Gast)
Datum:

>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.
Autor: Nils M. (nilsm)
Datum:

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. :-)
Autor: Wilhelm Ferkes (ferkes-willem)
Datum:

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.
Autor: Andi D. (xaos)
Datum:

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..
Autor: H.joachim Seifert (crazyhorse)
Datum:

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.
Autor: Nils M. (nilsm)
Datum:

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.
Autor: Helmut -dc3yc (dc3yc)
Datum:

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 :-(
Autor: Chris D. (myfairtux) (Moderator)
Datum:

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 ;-)
Autor: Chris D. (myfairtux) (Moderator)
Datum:

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.
Autor: Thomas O. (kosmos)
Datum:

@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.
Autor: willibald (Gast)
Datum:

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
Autor: Balu (Gast)
Datum:

>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
Autor: Thomas O. (kosmos)
Datum:

und am Ende kommt es auf den Rest an wie oft geshiftet wird ist ohne
Belang
Autor: Balu (Gast)
Datum:

>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
Autor: Thomas O. (kosmos)
Datum:

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....

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net