Forum: Mikrocontroller und Digitale Elektronik ATxmega EEprom Erase geht nicht.


von Tom (Gast)


Lesenswert?

Es handelt sich um einen ATxmega256A3AU der mit dem internen 32MHz 
betrieben und unter Assembler programmiert wird und durch PDI mit dem 
Atmel Studio 6 verbunden ist.
In das EEprom schreiben oder aus dem EEprom lesen funktioniert sehr gut.
Jetzt wollte ich den EEprombereich durch die Software Erasen, also alle 
Speicherstellen im EEprom löschen bzw. auf 0xFF zurück setzen. Aber das 
funktioniert aus meiner Software heraus nicht! Wenn ich mit dem 
Programmiertool aus dem Atmel Studio und einem Programmer über PDI das 
Erase mache, dann funktioniert es. Stelle mal den verwendeten Code ein:

eeprom_erase:

nvm_eeprom_busy_check_1:
lds r16, NVM_STATUS  ;Prüfen, ob NVM noch Busy oder nicht
sbrc r16, 7
rjmp nvm_eeprom_busy_check_1

ldi r16, NVM_CMD_ERASE_EEPROM_gc  ;Erase EEprom Kommando laden (0x30)
sts NVM_CMD, r16

ldi r16, 0b00000001  ;Bit0=CMDEX mit 1 vorladen
ldi r17, 0xD8    ;Signatur zum Freischalten laden
out CPU_CCP, r17  ;Schreibschutz für NVM_CTRLA aufheben.
sts NVM_CTRLA, r16      ;CMDEX Bit0 jetzt auf 1 setzen und Befehl 
ausführen

nvm_eeprom_busy_check_2:
lds r16, NVM_STATUS  ;wieder warten bis NVM fertig
sbrc r16, 7
rjmp nvm_eeprom_busy_check_2

ldi r16, NVM_CMD_NO_OPERATION_gc ;KEIN Kommando in NVM_CMD laden
sts NVM_CMD, r16

ret   ;FERTIG! FUNZT ABER NICHT!

Ich habe jetzt das Datenblatt schon mehrere male durchgesehen und auch 
die zusätzlichen Dokumente auf der Microchip Seite. Habe hier im Forum 
alles was mit ATxmega zu tun hat durchgeschaut. Ich kann keine andere 
Information finden, als den Ablauf, den ich auch Programmiert habe:
1. Warten bis NVM nicht mehr Busy ist.
2. Kommando für das Erase in das NVM_CMD Register schreiben
3. Den Schreibschutz für 4 Take für das Register NVM_CTRLA aufheben
4. NVM_CTRLA Register Bit0 mit 1 beschreiben und damit das Kommando 
ausführen.
5. Warten bis NVM fertig ist.

Daran habe ich mich doch in meinem Programmcode gehalten. Aber nachdem 
diese Routine durchlaufen wird, ist der EEprom noch immer gefüllt mit 
den Werten die mal eingeschrieben wurden.
Hier im Forum habe ich gelesen, das bei 32MHz Takt der Zugriff auf 
EEprom problematisch sein soll. Habe dann auf den internen 2MHz Takt 
"runter geschaltet", auch alle Interrupts abgeschaltet. Aber der EEprom 
wird enfach nicht erased!

Da ich keine Idee mehr habe, wo der Fehler liegen könnte, bleibt mir 
nichts anderes mehr übrig, als hier mal um Rat zu bitten.
Kennt eventuell jemand dieses Problem, oder könnte mir bitte dabei 
Helfen?

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

Tom schrieb:

> Jetzt wollte ich den EEprombereich durch die Software Erasen, also alle
> Speicherstellen im EEprom löschen bzw. auf 0xFF zurück setzen. Aber das
> funktioniert aus meiner Software heraus nicht! Wenn ich mit dem
> Programmiertool aus dem Atmel Studio und einem Programmer über PDI das
> Erase mache, dann funktioniert es. Stelle mal den verwendeten Code ein:

Fusbit EESAVE aktiviert?

Vgl. Manual, Table 33-5. NVM commands available for external programming
Fussnote 1: "If the EESAVE fuse is programmed, the EEPROM is preserved 
during chip erase."

Evtl. "denkt" das Atmel Studio ja mit und deaktiviert das Fuse-Bit? Da 
ich dieses nicht verwende, kann ich dazu nichts sagen.

Grüßle
Volker

von Tom (Gast)


Lesenswert?

Volker B. schrieb:
> Fusbit EESAVE aktiviert?

Danke für den Tip. Bei den Fuses hatte ich wirklich noch nicht 
nachgesehen. Aber das EESAVE ist nicht aktiviert.
Auch ist kein Bootloader aktiviert der eventuell irgendwelche Auswirkung 
auf das EEprom haben könnte. Also der ATxmega ist was die Fuses 
anbelangt noch im default oder Auslieferungsstadium.

von Georg (Gast)


Lesenswert?

Tom schrieb:
> In das EEprom schreiben oder aus dem EEprom lesen funktioniert sehr gut

Warum schreibst du dann nicht einfach 0xff an allen Adressen rein?

Georg

von Tom (Gast)


Lesenswert?

Georg schrieb:
> Tom schrieb:
>> In das EEprom schreiben oder aus dem EEprom lesen funktioniert sehr gut
>
> Warum schreibst du dann nicht einfach 0xff an allen Adressen rein?
>
> Georg

Georg schrieb:
> Warum schreibst du dann nicht einfach 0xff an allen Adressen rein?

Ja, daran hatte ich auch schon gedacht und das wäre auch möglich, weil 
das Beschreiben ja funktioniert. Auch vorhandene Datenwerte im EEprom 
kann ich problemlos mit neuen Datenwerten überschreiben. Die 4kByte 
würden auch in annehmbarer Zeit bei 32MHz Takt beschrieben sein.
Aber, das wäre keine Lösung, so wie es vorgesehen ist. Das Kommando um 
den EEprom aufzufrischen gibt es ja und dann muss es auch funktionieren! 
Mir geht es in erster Linie darum, zu verstehen, was das Problem ist, 
warum es nicht funktioniert.

von Dirk (Gast)


Lesenswert?

Hallo zusammen,

ich habe das gleiche Problem wie Tom.
Alle Versuche den "Erase" Befehl zum Laufen zu bekommen sind 
fehlgeschlagen.
Das Bank-Erase geht auch nicht.
Ich lösche das EEPROM in meinem XMEGA256A3 jetzt auch durch Beshreiben
einzelner Bytes. Das dauert für den ganzen 4K Speicher dann aber eine
gefühlte Ewigkeit. Ich hatte im Internet Hinweise gefunden, daß man
auf jeden Fall die NVM-Adressen laden sollte, auch wenn das widersinnig
beim Erase-Befehl erscheint. Geholfen hat das auch nichts.
Da ich den Prozessor erst im Juni bei Digikey gekauft hatte, gehe ich 
von
einer aktuallen Revision ohne den EEPROM Bug aus. Möglicherweise ist 
dieser
Bug aber immer noch vorhanden. So langsam kommen mir Zweifel, ob ich 
nicht
langsam die Finger von diesem Atmelzeug lassen sollte und auf TI oder ST
umsteigen sollte. Die Atmel-Bugs haben ja mittlerweile ein traurige
Tradition. Das ist ein Schlamperladen.

Gruß, Dirk

von Norbert T. (atos)


Lesenswert?


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.