Hallo Forum,
ich habe ein Problem beim Flashen (aus der BootLoaderFlashSsection). Ich
verwende einen ATmeag256 und Atmel Studio 6.1 SP2 und einen JTAGICE
mkII.
Folgendes Verhalten: nach dem Ausführen des Codeabschnitts mit der
SPM-Anweisung sind zufällige Pages meines Flashs mit 0x00 beschieben.
Manchmal wenige, manchmal aber auch ganze Abschnitte. Die Page, in die
ich gerade schreiben wollte (Adresse 0x00020000) enthält auch genau die
Daten, die ich erwarte.
Als mein Code mal ein einer solchen 0-Page ankam, konnte ich im
Disassamby auch sehen, das dort NOPs standen, weil keine Aktion
durchgeführt wurde. Scheinbar hat mich der Debugger auch nicht
veralbert.
So sieht mein C-Code aus:
1 | ENTER_CRITICAL_SECTION(); /*alle Interrupts aus*/
|
2 | for(u16Ptr=0;u16Ptr<SPM_PAGESIZE;u16Ptr+=2)
|
3 | { /* schreibe aus Buffer in den Flash jeweils ein Word */
|
4 | boot_page_fill(u32PageBase + u16Ptr, unBuffer.u16Buffer[u16Ptr/2]);
|
5 | }
|
6 | boot_spm_busy_wait();
|
7 | boot_page_write(dwPageBase);
|
8 |
|
9 | boot_spm_busy_wait();
|
10 | LEAVE_CRITICAL_SECTION();
|
und das Disassamby sieht so aus:
1 | 0001FF01 MOVW R30,R20 Copy register pair
|
2 | 0001FF02 ANDI R30,0xFE Logical AND with immediate
|
3 | 0001FF03 LDI R26,0x01 Load immediate
|
4 | 0001FF04 LDI R27,0x00 Load immediate
|
5 | 0001FF05 ADD R26,R28 Add without carry
|
6 | 0001FF06 ADC R27,R29 Add with carry
|
7 | 0001FF07 ADD R30,R26 Add without carry
|
8 | 0001FF08 ADC R31,R27 Add with carry
|
9 | 0001FF09 LDD R26,Z+0 Load indirect with displacement
|
10 | 0001FF0A LDD R27,Z+1 Load indirect with displacement
|
11 | 0001FF0B MOVW R0,R26 Copy register pair
|
12 | 0001FF0C MOVW R30,R4 Copy register pair
|
13 | 0001FF0D STS 0x005B,R6 Store direct to data space
|
14 | 0001FF0F STS 0x0057,R13 Store direct to data space
|
15 | 0001FF11 SPM Store program memory
|
16 | 0001FF12 CLR R1 Clear Register
|
17 | for(u16Ptr=0;u16Ptr<SPM_PAGESIZE;u16Ptr+=2)
|
18 | 0001FF13 SUBI R20,0xFE Subtract immediate
|
19 | 0001FF14 SBCI R21,0xFF Subtract immediate with carry
|
20 | 0001FF15 LDI R27,0x02 Load immediate
|
21 | 0001FF16 ADD R4,R27 Add without carry
|
22 | 0001FF17 ADC R5,R1 Add with carry
|
23 | 0001FF18 ADC R6,R1 Add with carry
|
24 | 0001FF19 ADC R7,R1 Add with carry
|
25 | 0001FF1A CP R20,R1 Compare
|
26 | 0001FF1B LDI R30,0x01 Load immediate
|
27 | 0001FF1C CPC R21,R30 Compare with carry
|
28 | 0001FF1D BRNE PC-0x1C Branch if not equal
|
In der Zeile 0001FF0D wird das RAMPZ mit 0x02 beschrieben. Das sind die
oberen Bits 16 und 17 der Z-Adresse.
Was kann das sein? Wo liegt das Problem?
Danke