Forum: Compiler & IDEs XMODEM CRC16 Protokoll (für Firmware update)


von Jürgen S. (jsachs)


Angehängte Dateien:

Lesenswert?

Hallo,

ich muß mich in ein bestehendes Bussystem einklinken (leider unter NDA,
daher darf ich keine Details geben).
Die Übertragung von Daten (Firmware und Programm)geschieht per XMODEM
Protokoll mit CRC 16.
Ich versuche zur Zeit verzweifelt die Prüfsumme nachzurechen, ohne
Erfolg.

Kann mir einer weiterhelfen ?

Ich will mit den Empfangenen Daten dann denn Code des AVR updaten (Zur
Zeit ein Mega8515.

Es kommen immer 128 Byte (In 3 Packeten Protokollbedingt).
Es sollte doch nun möglich sein den AVR mit den Empfangenen Daten neu
zu Flashen (auch den Boot Loader selbst ?).
Aber bevor die Prüfsumme nicht stimmt will ich das besser noch nicht
machen :-)

So, ein Packet sieht z.B. wie folgt aus (C Noatation) (3 Byte
XMODEM-Header + 128 Data + 2 Byte CRC 16):
char c[3+128+2] =
  {0x01, 0x01, 0xfe, 0x5c, 0x72, 0x5c, 0x6e, 0x0a, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x69, 0x6b};

Zur Zeit versuche ich das auf dem PC mit angehängtem Code
nachzurechnen. Dann will ich das auf den AVR mit gcc Hilfe übernehmen.

Kann mir einer sagen was ich falsch mache ?

Danke
Juergen

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Hast du dir mal die CRC-Routinen in <util/crc16.h> angeguckt?
Da müsste auch eine Xmodem-Variante dabei sein.

von Jürgen S. (jsachs)


Angehängte Dateien:

Lesenswert?

Hab ich eben erst entdeckt...
Gleich nen Versuch gestartet, allerdings mit dem C-Komplement in der
Doku.
Mein Suse System hat es nicht so mit dem AVR Assembler Code :-)

Leider mit dem gleichen Erfolgt. Die Checksumme stimmt nicht.

Anbei nochmals den Code den ich jetzt benutzt habe (Aus der AVR-libc
Doku für XMODEM)

Ich gehe mal davon aus, das der CRC nur über die Nutzdaten berechnet
wird ?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Nun, der C-Code ist eher Pseudocode.

Worüber die CRC gebildet wird, sollte Bestandteil der Protokoll-
definition sein (hmm, XModem und Protokolldefinition, naja...).
Hast du denn keinen Testvektor?

von Jürgen S. (jsachs)


Lesenswert?

Setzen 6 ! würde ich sagen :-(

Die While schleife ist schuld, da diese nicht über alle Datenbytes
läuft. (Von wegen "Durchlaufe bis du ein NULL Byte findest")
Ersetze ich diese durch:
for (uint8_t cnt = 0 ; cnt < 128 ; cnt++)

funzt es problemlos und auch mit der libc-funktion.
Besten Dank an alle die sich das Hirn zermartert haben !

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.