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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.