EEPROM Write and Read im AVR16DD14 Problem

OP #7734942
Lesenswert?
• ▲
▼

Hi zusammen.

Ich hatte bereits schon im Microchip Forum vor einiger Zeit die geliche Frage gestellt, aber ohne Antwort. Daher versuche ich es nochmal bei euch direkt.

Habe die MPLAX X IDE und den "neueren" AVR16DD14 MCU zum ersten mal im Einsatz.

Habe mir ein paar Basisroutinen mit dem eingebauten Codegenerator generiert. U.a. auch EEPROM Write and Read Funktionen.

Ich bekomme keine Daten ins EEPROM geschrieben. Auch wenn ich mich an den Beispielcode aus der Doku halte (https://onlinedocs.microchip.com/oxy/GUID-41EA2496-1EE8-4319-A387-9EC9318EF178-en-US-23/GUID-FAB7D938-8223-479A-9238-5949CF35E9BD.html#GUID-2636BA3B-149A-49C1-869A-4FA48C874937)

Hat von euch einer Idee woran das liegen könnte?

Hier die generieten EEPROM Funktionen und mein Beispiel, wie ich eine Speicherstelle (die Erste Adresse im EEPROM) beschreiben möchte. Speicher bleibt immer auf 0xff :/

1
#define EEPROM_ADDRESS 0x1400U
2
void EEPROM_Write_Test(void)
3
{
4

5
    eeprom_data_t eepromWriteData = 0x55;
6
 
7
    //Write EEPROM byte
8
    EEPROM_Write(EEPROM_ADDRESS, eepromWriteData);
9
    while (EEPROM_IsBusy());
10
    if (NVM_StatusGet() == NVM_OK)
11
    {
12
        //printf("EEPROM_Write passed \r\n");
13
    }
14
    else
15
    {
16
        //printf("EEPROM_Write failed \r\n");
17
        NVM_StatusClear();
18
    }
19

20
}

Die (generierten) Routinen sind:

1
eeprom_data_t EEPROM_Read(eeprom_address_t address)
2
{
3
    return *(eeprom_data_t *) address;
4
}
5

6
void EEPROM_Write(eeprom_address_t address, eeprom_data_t data)
7
{
8
    //Program the EEPROM with desired value(s)
9
    ccp_write_spm((void *) &NVMCTRL.CTRLA, NVMCTRL_CMD_EEERWR_gc);
10
    
11
    
12
    //Write byte to EEPROM
13
    *(uint8_t *) address = data; //Hier habe ich auch schon uint16_t probiert - da die Adresse ja 16 bit hat?!) - ging aber auch nicht.
14
    
15
    //Clear the current command
16
    ccp_write_spm((void *) &NVMCTRL.CTRLA, NVMCTRL_CMD_NONE_gc);
17
}
18

19
bool EEPROM_IsBusy(void)
20
{
21
    return (NVMCTRL.STATUS & NVMCTRL_EEBUSY_bm);
22
}

Bin über jeden Hinweis dankbar

OP #7734968
Lesenswert?
• ▲
▼

Ich meine auch, dass das so bei den alten AVRs war. Da gab es ja extra Adressregister wo man schreiben möchte.

Hier müsste es aber 0x1400 sein. Original ist lt. Bibliothek folgendes definiert:

1
#define EEPROM_ADDRESS (EEPROM_START)  //EEPROM address at which data is to be written

mit folgendem aus der ioavr16dd14.h

1
#  define EEPROM_START     (0x1400U)
2
#  define EEPROM_SIZE      (256U)
3
#  define EEPROM_PAGE_SIZE (1U)

Soltle also passen.

OP #7735001
Lesenswert?
• ▲
▼

NV_Initialize() ist zuvor aufgerufen. Hier wird passiert aber "nur" folgendes:

1
void NVM_Initialize(void)
2
{    
3
    NVM_StatusClear();  
4
}
5
void NVM_StatusClear(void)
6
{
7
    NVMCTRL.STATUS &= ~NVMCTRL_ERROR_gm;
8
}

Auch der Versuch mit dem C-Code zu Fuß bringt keine Veränderung im EEPROM?

Ich gucke aber an der richtigen Stelle im Memory View, oder? Ich frag mal so blöd, da ich die IDE noch nie genutzt habe zuvor. Siehe Screenshot.

Angehängte Dateien:

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.