Kampis Elektroecke

XMega – Zugriff auf das EEPROM

XMega Blockdiagramm

In diesem Beispiel möchte ich zeigen, wie mit Hilfe des NVM-Controllers lesend, bzw. schreibend auf das interne EEPROM zugegriffen wird. Das EEPROM wird immer dann gerne genutzt, wenn kleine Datenmengen (z. B. Programmparameter) nicht flüchtig im Mikrocontroller gespeichert werden sollen.

Sämtliche Schreibvorgänge des NVM-Controllers werden über einen internen Puffer durchgeführt, da der NVM-Controller sowohl für die Schreibvorgänge auf das EEPROM (Zugriff erfolgt byteweise), als auch für die Schreibvorgänge auf den Flash-Speicher (Zugriff erfolgt seitenweise) verantwortlich ist. Daher müssen die entsprechenden Datenbytes zuerst in den Puffer geschrieben werden. Anschließend wird die komplette Seite des Puffers in den Flash, bzw. das EEPROM kopiert.

Die Seitengröße des Puffers ist von Mikrocontroller zu Mikrocontroller unterschiedlich und muss im Datenblatt nachgeschaut werden. Bei einem XMega384C3 beträgt die Seitengröße für das EEPROM 32 Byte. Da der Zugriff auf das EEPROM seitenweise erfolgt, ist die Anzahl der vorhandenen Seiten wichtig. Diese ergibt sich aus der Seitengröße (32 Byte) und der Größe des EEPROMs (4k Byte), wodurch sich eine Anzahl von 128 Seiten ergibt.

Schreibzugriff auf das EEPROM:

Für das Beschreiben des EEPROMs sind folgende Schritte notwendig:

  1. EEPROM-Puffer mit Daten füllen
    1. NVM-Kommando LOAD_EEPROM_BUFFER in das CMD-Register schreiben.
    2. Schreibadresse in die ADDR-Register schreiben.
      • Die Adresse besteht aus bis zu Bit. Die Aufteilung ergibt sich aus dem Datenblatt des Mikrocontrollers.
      • Für das aktuelle Beispiel addressieren die Bits 4:0 den Byteoffset (E2BYTE) und die Bits 11:5 die Seite (E2PAGE) des EEPROMs.
    3. Das Datenbyte in das DATA0-Register schreiben. Dies startet den Schreibvorgang, wodurch das Byte in den internen Puffer kopiert wird.
  2. EEPROM Seite löschen
  3. EEPROM Seite schreiben
    1. Die Schritte 2 und 3 werden mit dem ERASE_WRITE_EEPROM_PAGE-Kommando ausgeführt.
    2. Das Kommando wird in das CMD-Register kopiert.
    3. Das ADDR-Register wird mit der Adresse gefüllt.
    4. Das CMDEX-Bit im CTRLA-Register wird gesetzt. Dieses Bit wird durch das CCP-Register geschützt, weshalb zuerst die korrekte Signatur in das CCP-Register geschrieben werden muss.

Der komplette Programmcode zum beschreiben des EEPROMs sieht folgendermaßen aus:

Zu Anfang wird geprüft ob die übergebene Seite und der übergebene Offset innerhalb des erlaubten Bereichs liegen. Die Makros EEPROM_SIZE und EEPROM_PAGE_SIZE werden vom AVRGCC mitgeliefert und beinhalten die entsprechenden Informationen des ausgewählten Mikrocontrollers.

Eine komplette Seite kann geschrieben werden, indem zuerst die Seitenaddresse in das ADDR-Register geschrieben und anschließend der Inhalt der Seite in den Puffer geschrieben wird.

Da der Offset in diesem Fall variabel ist, muss der neue Wert, zusammen mit den niederwertigsten Bits der Seitenadresse, in das ADDR0-Register geschrieben werden.

Im nächsten Schritt wird dann geprüft, ob der NVM-Controller gerade ein Kommando abarbeitet, indem das NVMBUSY-Bit im STATUS-Register abgefragt wird:

Sobald der NVM-Controller bereit ist, wird der erste Punkt abgearbeitet und die benötigten Register mit den nötigen Informationen gefüllt. Dazu wird mit Hilfe der übergebenen Seite und des übergebenen Offsets die EEPROM-Adresse berechnet und passend formatiert in die ADDR-Register des NVM-Controllers geschrieben. Nach dem Beschreiben des DATA0-Registers wird der Kopiervorgang gestartet. Von jetzt an befindet sich das übergebene Datenbyte im Puffer des NVM-Controllers.

Zum Schluss werden die letzten beiden Punkte abgearbeitet, indem das ERASE_WRITE_EEPROM_PAGE-Kommando in das CMD-Register kopiert und durch das Setzen des CMDEX-Bits ausgeführt wird. Da sich die Seitenadresse für das EEPROM bereits in den ADDR-Registern des NVM-Controllers befindet, kann dieser Punkt übersprungen werden.

Die Ausführung eines Kommandos durch das Setzen des CMDEX-Bits wird durch die nachfolgende Funktion gestartet.

Zuerst wird das auszuführende Kommando in das CMD-Register kopiert. Damit das Kommando ausgeführt wird, muss das CMDEX-Bit im CTRLA-Register gesetzt werden. Bevor dieses Bit allerdings gesetzt werden kann, muss die Signatur 0xD8 in das CCP-Register kopiert werden. Nachdem die Signatur in das CCP-Register kopiert worden ist, hat die Software vier Taktzyklen Zeit um ein geschütztes Register, hier das CMD-Register, zu beschreiben.

Damit dieser Vorgang auch bei ausgeschalteter Optimierung funktioniert, habe ich die entsprechenden Codezeilen in Inline-Assembler programmiert. Zuerst werden die Adresse des CTRLA-Registers und die Signatur für das CCP-Register in den Registern r30 und r16 gespeichert. Anschließend wird die Signatur in das CCP-Register kopiert und direkt danach das CMDEX-Bit gesetzt. Abschließend wird das CMD-Register gelöscht, indem das Kommando NO_OPERATION in das Register geschrieben wird.

Jetzt kann die Anwendung das EEPROM beschreiben.

Nach der Ausführung des Programms kann das EEPROM z. B. mit einem JTAG-Programmiergerät ausgelesen werden, um zu überprüfen, ob die Werte auch tatsächlich in das EEPROM geschrieben worden sind.

Scheint alles geklappt zu haben. Dann schauen wir uns jetzt an, wie wir das EEPROM wieder löschen können.

Löschen des EEPROMs:

Damit das EEPROM gelöscht wird, müssen die folgenden Schritte durchgeführt werden:

  1. NVM-Kommando ERASE_EEPROM in das CMD-Register schreiben
  2. Das CMDEX-Bit im CTRLA-Register setzen
  3. Warten bis der NVM-Controller fertig ist

Die fertige Funktion zum Löschen des EEPROMs ist recht einfach gehalten. Da auch hier das CMDEX-Bit gesetzt werden muss, kann die Funktion NVM_ExecuteCommand wiederverwendet werden.

Direkt nach dem Aufruf der Funktion wird gewartet, bis der NVM-Controller alle offenen Aufträge abgearbeitet ist. Anschließend wird der ERASE_EEPROM-Befehl in das CMD-Register kopiert und ausgeführt. Sobald der NVM-Controller den Befehl abgearbeitet hat, wird die Funktion verlassen.

Als letztes wollen wir uns anschauen, wie die geschriebenen Daten wieder ausgelesen werden können.

Aus dem EEPROM lesen:

Für einen lesenden Zugriff auf das EEPROM müssen die folgenden Schritte abgearbeitet werden:

  1. NVM-Kommando READ_EEPROM in das CMD-Register schreiben
  2. Adresse in das ADDR-Register schreiben
  3. Das CMDEX-Bit im CTRLA-Register setzen
  4. DATA0-Register auslesen

Für eine entsprechende Lesefunktion sind bereits alle Komponenten vorhanden und müssen nur noch in der richtigen Reihenfolge aufgerufen werden.

Der Ablauf ist nahezu identisch zum Schreibablauf, außer das im letzten Schritt das Datenbyte aus dem DATA0-Register ausgelesen und zurückgegeben wird. Für große Datenmengen empfiehlt es sich auch hier eine komplette Seite in einem Stück auszulesen.

Damit können die, im EEPROM gespeicherten, Datenbytes von der Software wieder ausgelesen werden.

Zurück

Last Updated on

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.