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
Hast du dir mal die CRC-Routinen in <util/crc16.h> angeguckt? Da müsste auch eine Xmodem-Variante dabei sein.
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 ?
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.