Liebe Leute,
ich programmiere für meine Atmega1284P/W5500-Platine
(Beitrag "Meine erste Platine") gerade einen
Internet-Bootloader, und stoße dabei auf ein seltsames Phänomen: Eeprom
und Flash-Speicher werden fehlerhaft beschrieben.
Dies trat beim Schreiben des Eeprom durch meinen Bootloader auf, aber
auch beim Schreiben des NRWW durch AVR Studio/AVR Dragon.
Einer meiner Atmegas liess sich durch einen Chip-Erase inklusive Eeprom
wieder herstellen. Beim zweiten reichte dies nicht aus: Nach zweimaligem
Chip-Erase waren sowohl im Eeprom als auch im Flash immer noch Adressen
ungleich 0xFF, und auch das explizite Programmieren sowohl von Flash als
auch von Eeprom mit nur mit 0xFF gefüllten hex-Dateien durch AVR
Studio/AVR Dragon schlug fehl.
Ich habe dann bei diesem zweiten Atmega den 3.3V-Regler umgangen und den
uC direkt mit 5V versorgt. Dann hat der Chip-Erase funktioniert. Jetzt
läuft auch der zweite uC wieder.
Ich frage mich jetzt aber natürlich, wie es zu diesem Zustand kommen
konnte. Brown-out war beim ersten uC nicht aktiv, beim zweiten aber auf
2.7V. Ich benutze eeprom_write_byte() aus der avr-libc. Ich rufe
eeprom_busy_wait() vor dem Programmieren des Flash auf. Ich lade jeweils
eine Seite aus dem Flash in einen SRAM-Cache, vergleiche dann die
einlaufenden Daten mit dem Inhalt dieses Cache, und nur bei einer
Differenz wird die Seite dann per
1 | for (pa=0; pa<SPM_PAGESIZE; pa+=2) {
|
2 | boot_page_fill(pa,spmdata[pa+1]<<8|spmdata[pa]);
|
3 | }
|
4 | boot_page_erase(spmpage);
|
5 | boot_spm_busy_wait();
|
6 | boot_page_write(spmpage);
|
7 | boot_spm_busy_wait();
|
in den Flash programmiert. Ein Fehler könnte sein, dass erst noch
boot_rww_enable() gerufen werden muss, bevor dann die nächste Seite aus
dem Flash in den Cache gelesen wird. Wie dadurch aber mein Symptom
auftreten könnte ist mir schleierhaft.
Was das Eeprom angeht, so habe ich gelesen, das eine stabile
Versorgungsspannung sehr wichtig ist. Nun habe ich zwar Ripple auf 3V3
(siehe Anhang), der tritt aber vor allem bei der SPI-Kommunikation mit
dem W5500 auf, und diese findet beim Programmieren des Eeprom gar nicht
statt. Für Anregungen bezüglich des Ripple bin ich natürlich ebenfalls
dankbar.
Im Anhang auch der komplette Code des Bootloaders. Sollte jemand noch
(außer Assembler) einen guten Tipp haben, wie ich von 6KB auf unter 4KB
komme, so dass er auch in den Atmega328P passt -- immer her damit.
LG, Sebastian