Forum: Mikrocontroller und Digitale Elektronik Bootloader ATXMega64A3 TWI(I2C)


von Georg X. (schorsch666)


Lesenswert?

Hallo Kollegen,

ich bin auf der Suche nach einem Flashbootloader der über die 
TWI-Schnittstelle läuft. Soll auf dem ATXMega64A3 als Slave laufen. Mir 
wäre es sehr recht wenn es was fertiges von
Atmel wäre.

Auf meiner Suche bin ich auf das Appnote: AVR1327 gestoßen.
Leider ist dieser Bootloader mit den Tools von IAR erstellt worden.

Kennt jemand noch andere Alternativen oder hat jemand den oben erwähnten 
Bootloader im Einsatz?

Danke und Gruß,
Schorsch.

von Basti (Gast)


Lesenswert?

IAR ist bis 4kb kostenlos (bei Avr) bei dem Atmel Flip Bootloader ist es 
ähnlich, dort habe ich IAR und Flip schon erfolgreich verwendet...

von Georg X. (schorsch666)


Lesenswert?

Hallo Leute,

jetzt hab ich mich doch entschloßen den Bootloader aus dem oben 
erwähnten AppNote zu verwenden und an meinen µC anzupassen.

Ich habe das Projetk geladen und mit der 4kByte Version von IAR öffnen 
können.
Leider bekomme ich beim Linken folgende Fehlermeldung die ich nicht 
zuordnen kann:

Fatal Error[e163]: The command line symbol "_..X_FLASH_END" in 
-D_..X_FLASH_CODE_END=_..X_FLASH_END is not defined.


Im Linkerfile und in den Optionen ist das Symbol "..X_FLASH_CODE_END" 
gar nicht zu finden. Kann mir jemand mal auf die Sprünge helfen?

Im Linkerfile wird der Flashbereich wie folgt definiert:

-D_..X_INTVEC_SIZE=0   // 4 bytes * 94 vectors
-D_..X_APPLICATION_SECTION_START=4000   // xmega16D4 0x4000 BYTE 
starting address
-D_..X_APPLICATION_SECTION_SIZE=1000
-D_..X_APPLICATION_START=(_..X_APPLICATION_SECTION_START+_..X_INTVEC_SIZ 
E)
-D_..X_APPLICATION_END=(_..X_APPLICATION_SECTION_START+_..X_APPLICATION_ 
SECTION_SIZE-1)

Meiner Meinung nach soweit in Ordnung. Aber der Linker scheint hier was 
anderes zu wollen.

Danke und Gruß,
Schorsch.

von Georg X. (schorsch666)


Lesenswert?

Hallo Leute,

so ich habs jetzt hinbekommen daß der Linker zufrieden ist.
Ich habe folgende Zeile hinzugefügt:

-D_..X_FLASH_END=(_..X_APPLICATION_SECTION_START+_..X_APPLICATION_SECTIO 
N_SIZE-1)

Jetzt wird zwar gelinkt aber ich kann nicht debuggen. Ich habe den 
JTACICE3.
Ich kann zwar auf den µC zugreife Fusebits setzen und den Flash löschen 
usw. aber beim Debuggen wird mir folgende Fehlermeldung ausgegeben:

Wed May 22, 2013 09:29:43: Failed to load debugee: 
...\AVR1327\AVR1327-code\Debug\Exe\ATxmega32A4.dbg

Diese Datei wird vom Compiler aber automatisch angelegt.
Kennt sich jemand hier aus?

Danke und Gruß,
Schorsch.

von Frank S. (franksanderdo)


Lesenswert?

Moin Schorsch

ich hatte ein ähnliches Problem und es waren unterschiedliche Pfade.
Schau bitte noch mal ob die Datei wirklich an der passenden stelle liegt 
/ der debugger wirklich an der richtigen Stelle sucht ;-)

Grüße
Frank

von Georg X. (schorsch666)


Angehängte Dateien:

Lesenswert?

Hi,

der Pfad stimmt soweit.
Ich hab jetzt auch mal die Verzeichnissstruktur geändert. Damit diese 
mal etwas kürzer ist. Ich verwende keine Sonderzeichen oder Leerzeichen.

Im Anhang ist ein Screenshot des PopUps zu sehen.

Die Datei wird ja auch generiert. Ich hab diese auch mal gelöscht damit 
die neu angelegt wird. Aber irgendwas passt da nicht so ganz. Ich muß 
auch dazu sagen dass ich den Samplecode für den Bootloader ja an den 
XMega64 versucht habe anzupassen. Sprich Linkerfile die Adressen richtig 
gesetzt und unter Optionen den entsprechenden µC ausgewählt.

Hat jemand noch ne Idee?

Gruß,
Schorsch.

von Georg X. (schorsch666)


Lesenswert?

Hallo Leute,

ich habs hinbekommen daß der Bootloader compiliert.
Mir ist allerdings aufgefallen daß der Bootloader nicht vollständig ist.
Dort fehlt einiges an code. z.B werden die Commandos nicht weiter 
gegeben.
Hab dies aber korrigiert.

Jetzt hab ich das Problem daß zwar das Löschen vom Flash soweit 
funktioniert aber das Schreiben nicht. Der Assemblercode sieht zwar 
soweit ok aus aber im Flash wird nicht abgelegt.

Hat jemand den bootlaoder in Verwendung und kann mir weiterhelfen?


Danke.

Gruß,
Georg.

von Georg X. (schorsch666)


Lesenswert?

Hallo Kollegen,

ich habe mir jetzt noch die Appnote "Atmel AVR1622" angeschaut.
Dort sind genau die gleichen Flashalgorithmen hinterlegt die ich auch 
verwende. Hat mir jemand ev. ein Beispiel aus seinem Bootloader? 
Vielleicht vergesse ich einfach was. Lockbits sind nicht gesetzt. Das 
Löschen funktioniert. Nur das Schreiben scheint keine Auswirkung zu 
haben. Die Routinen sind, verglichen mit dem Datenblatt, in Ordnung.

Gruß,
Georg.

von Georg X. (schorsch666)


Lesenswert?

Hallo Kollegen,

ich bins wieder.
Ich habs noch nicht hinbekommen in eine Flashpage was zu schreiben.
Löschen geht ja... nur Schreiben nicht.

Kennt sich jemand mit spm aus und kann mich etwas unterstützen?

Folgendes führe ich aus:

SP_LoadFlashWord(page_address,0x1234); 
SP_EraseWriteApplicationPage(page_address);
SP_WaitForSPM();


Aus dem Treiber von Atmel:

SP_CommonSPM:
movw  ZH:ZL, r17:r16   ; Load R17:R16 into Z.
sts  NVM_CMD, r20     ; Load prepared command into NVM Command register.
ldi  r16, CCP_SPM_gc  ; Prepare Protect SPM signature in R16.
sts  CCP, r16         ; Enable SPM operation (this disables interrupts 
for 4 cycles).
spm                      ; Self-program.
out  RAMPZ, r23
ret
ENDMOD


SP_LoadFlashWord:

in  r23, RAMPZ        ; Save RAMPZ, which is restored in SP_CommonSPM.
movw  r1:r0, r19:r18    ; Prepare flash word in R1:R0.
ldi  r20, NVM_CMD_LOAD_FLASH_BUFFER_gc  ; Prepare NVM command in R20.
jmp  SP_CommonSPM                       ; Jump to common SPM code.

ENDMOD

SP_EraseWriteApplicationPage:
in  r23, RAMPZ                            ; Save RAMPZ, which is 
restored in SP_CommonSPM.
out  RAMPZ, r18
ldi  r20, NVM_CMD_ERASE_WRITE_APP_PAGE_gc  ; Prepare NVM command in R20.
jmp  SP_CommonSPM                          ; Jump to common SPM code.

ENDMOD

SP_WaitForSPM:
lds  r16, NVM_STATUS     ; Load the NVM Status register.
sbrc  r16, NVM_NVMBUSY_bp ; Check if bit is cleared.
rjmp  SP_WaitForSPM       ; Repeat check if bit is not cleared.
clr  r16
sts  NVM_CMD, r16        ; Clear up command register to NO_OPERATION.
ret

ENDMOD

Für mich sieht es ok aus.
Habs auch noch mal in den Datenblättern nachgelesen.
Was könnte ich ev. noch in der Konfig o.ä. vergessen haben?

Danke und Gruß,
Schorschi.

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.