EEPROM Write and Read im AVR16DD14 Problem

#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

#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.

#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

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