AVR Flash läßt sich nicht programmieren

15/12/2010 - 08:27 von Tilmann Reh | Report spam
Hallo,

ich verwende gerade den ATmega324PA in einer neuen Anwendung und möchte
dort einen IAP-Lader (für Software-Updates im laufenden Betrieb) einbauen.

Der IAP-Lader liegt am oberen Ende des Flash (im RWW Bereich) und macht
alles exakt so, wie es im Datenblatt und diversen Application Notes
beschrieben ist.

Trotzdem scheint der SPM Befehl einfach gar nichts zu tun. Es wird weder
des Flash gelöscht, noch neue Daten hineingeschrieben. Es gibt auch
keine meßbare Verzögerung zwischen der Ausführung von SPM und dem
anschließenden Inaktivwerden von SPMEN.

Ich habe mir einige (angeblich funktionierende) Bootlader angesehen,
aber dabei keinen Unterschied gefunden. Woran könnte es liegen, daß das
Flash sich partout nicht löschen bzw. schreiben làßt?

Hier der Code (IAPBase liegt auf Wort-Adresse 0x1E00):

-

; Erase Flash from 0x0000 up to IAP loader:

...
clr ZL
clr ZH ; start at 0
EraseLoop: ldi r16,(1<<PGERS)|(1<<SPMEN)
rcall DoSPM ; Page Erase
rcall EnableRWW ; re-enable RWW section
subi ZL,low(-128)
sbci ZH,high(-128) ; Z+128: next page
cpi ZH,high(IAPBase<<1) ; reached IAP loader?
brlo EraseLoop ; erase flash up to IAP loader
...

; Program a 128 byte flash page. X points to data in RAM, Z to the
; target (byte) address in flash.

FlashProg128: ld r0,X+
ld r1,X+
ldi r16,(1<<SPMEN)
rcall DoSPM ; do page buffer write
adiw Z,2
mov r16,ZL
andi r16,0x7F ; 128 byte boundary reached?
brne FlashProg128 ; copy 128 bytes into buffer
subi ZL,128
sbci ZH,0 ; back to page start
ldi r16,(1<<PGWRT)|(1<<SPMEN)
rcall DoSPM ; start the page write
; rjmp EnableRWW ; re-enable RWW section

; Do the flash accesses (erase, write) via SPM.
; Called with SPMSCR control byte in R16.

EnableRWW: ldi r16,(1<<RWWSRE)|(1<<SPMEN) ; re-enable RWW

DoSPM: in r17,SPMCSR
sbrc r17,SPMEN ; if SPM still in progress:
rjmp DoSPM ; wait for completion
out SPMCSR,r16
spm
ret

-

Danke für jegliche Hinweise und Ideen,

Tilmann
 

Lesen sie die antworten

#1 Andreas Graebe
15/12/2010 - 08:40 | Warnen spam
Tilmann Reh schrieb:

Hallo,

Trotzdem scheint der SPM Befehl einfach gar nichts zu tun. Es wird weder
des Flash gelöscht, noch neue Daten hineingeschrieben. Es gibt auch
keine meßbare Verzögerung zwischen der Ausführung von SPM und dem
anschließenden Inaktivwerden von SPMEN.

Danke für jegliche Hinweise und Ideen,

Tilmann



Ohne Dir zu nahe treten zu wollen: sind die Lock- und Fusebits richtig
gesetzt?

Mit freundlichen Grüßen
Andreas Graebe

Ähnliche fragen