dsPIC: Daten in Programmspeicher speichern

OP #2923030
Lesenswert?

Hallo zusammen.
Ich will Daten in den Programmspeicher eines dsPic30F2020 schreiben.
Dabei nutze ich MPLABX, zum Debuggen den ICD3.
Die Daten möchte ich auf die letzte Adresse im Programmspeicher 
(0x001FF8) schreiben, leider tut sie es nicht.
Hat jemand eine Idee was ich falsch mache?
Besten Dank für eure Bemühungen
1
void WriteFlash(void)
2
{
3

4
    int i = 0;
5
    char Data[]={"A"};
6
    
7
    /* 1 Zeile im Flash Programmspeicher löschen */
8
    
9
    NVMCON = 0x4041;                // Flash Row Erase Code
10

11
                                    // Letzte Adresse im User Programm Flash Memory: 0x001FF8
12
    NVMADR = 0x1FF8;                // Unteren 16 Bits der Zieladresse schreiben
13
    NVMADRU = 0x00;                 // Oberen 8 Bits der Zieladresse schreiben
14

15
    disInt();                       // Interrupts deaktivieren
16

17
    NVMKEY = 0x55;                  // Code zum aktivieren des Löschvorgangs
18
    NVMKEY = 0xAA;
19
    NVMCONbits.WR = 1;
20

21
    enaInt();                       // Interrupts aktivieren
22
    
23
    
24

25
    /* 1 Zeile im Flash Programmspeicher schreiben */
26

27
    NVMCON = 0x4001;                // Flash Row Programm Code
28

29
    TBLPAG = NVMADR;                // Letzte Adresse im User Programm Flash Memory: 0x001FF8
30
                                    // an TBLPAG übergeben
31
    
32
    for (i=0; i < 32; i++)          // Daten schreiben
33
    {
34
        int Offset = 4;
35
       __builtin_tblwtl(Offset, Data[0]);
36
       __builtin_tblwth(Offset, Data[0]);
37

38
    }
39

40
    disInt();                       // Interrupts deaktivieren
41

42
    NVMKEY = 0x55;                  // Code zum aktivieren des Löschvorgangs
43
    NVMKEY = 0xAA;
44
    NVMCONbits.WR = 1;
45

46
    enaInt();                       // Interrupts aktivieren
47

48
}
Gast #2923069
Lesenswert?

Michel Herren schrieb:
> Die Daten möchte ich auf die letzte Adresse im Programmspeicher
> (0x001FF8) schreiben, leider tut sie es nicht.

WAS tut denn nicht?
Was steht vorher drinn?
Was steht nachher drinn?

Ich denke, Du mußt nach dem Starten des Löschens das Bit #15 in NVMCON 
pollen, um zu warten, bis der Löschvorgang fertig ist. Ansonsten ist das 
Flash nicht nicht bereit für Deinen Schreibzugriff.

Das gleiche gilt auch nach dem Starten des Schreiben der Row/Page: auch 
hier wieder Bit #15 abwarten!
1
  asm("    push        TBLPAG      ");
2
  asm("    mov        W2,NVMCON   ");
3
  asm("    mov        w0,TBLPAG   ");           //; Init Pointer to page to be erased
4
  asm("    tblwtl      w1,[w1]     ");            //; Dummy write to select the row
5
  __builtin_write_NVM();
6
  asm("1:   btsc       NVMCON,#15  ");    //  ;Wait for write end
7
  asm("     bra        1b          ");
8
  asm("    pop         TBLPAG      ");
Gast #2923200
Lesenswert?

Es geschieht leider nichts, die Werte auf der Zieladresse werden nicht 
verändert. Auf der Zieladresse steht ständig 0xFFFFFF.
Ich vermute dass etwas mit der Angabe der TBLPAG nicht stimmt, 
allerdings weiss ich nicht was genau.
Besten Dank für deinen Tipp, ich werde es morgen einmal versuchen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren