Ethernut Home Hardware Firmware Tools Download Community
 
Ethernuts  /  Ethernut 5  /  Nut/OS  /  Speicherkarte
Suchen | Impressum | English

Ethernut 5 Speicherkarte

Die Unterstützung von MultiMedia bzw. SD-Speicherkarten ist unter Nut/OS besonders komfortabel, da man C-Standardaufrufe verwenden kann. Mit Hilfe von Beispielprogrammen soll dies hier demonstriert werden.

Initialisierung

Bedingt durch die Modularität von Nut/OS müssen alle von einer Anwendung benötigten Treiber explizit registriert werden. Für Ethernut 5 steht ein Treiber für das Multimedia Card Interface der AT91SAM9 CPU zur Verfügung.

#include <dev/at91_mci.h>

NutRegisterDevice(&devAt91Mci0, 0, 0);

Mit diesem Aufruf wird die MMC-Hardware aktiviert und die anf&aul;nglich Taktrate entsprechend der Konfiguration von MCI_INI_BITRATE (standardmäßig 400kHz) eingestellt. Damit ist die Hardware bereit.

Der Treiber stellt mehrere Routinen bereit, die von einem Dateisystem genutzt werden, um Daten auf die Speicherkarte zu schreiben oder von dieser zu lesen. Als Dateisystem wird auf Speicherkarten üblicherweise FAT verwendet. Der entsprechende Nut/OS-Treiber wird mit folgendem Aufruf registriert:

#include <fs/phatfs.h>

NutRegisterDevice(&devPhat0, 0, 0);

Zuletzt muss noch das Medium, die Speicherkarte, gemounted werden. Hierzu verwendet man unter Nut/OS die stdio-Funktion zum Öffnen von Dateien, wobei als Dateiname der Name des Schnittstellentreibers, gefolgt von einem Doppelpunkt, gefolgt von der Partitionsnummer und, getrennt durch einen Schrägstrich, der Name des Dateisystemtreibers anzugeben ist:

<Interface Name>:<Partition>/<Filesystem Name>

Für Ethernut 5 sieht der Aufruf konkret so aus:

int volid = _open("MCI0:1/PHAT0", _O_RDWR | _O_BINARY);

Der zurückgegebene Datei-Handle kann später dazu verwendet werden, die Karte auszuwerfen (Unmout).

_close(volid);

Üblicherweise werden noch folgende Standard-Header-Dateien benötigt.

#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <errno.h>

Dateien erzeugen und lesen

Zum Schreiben und Lesen von Dateien können alle gängigen Funktionen der C-Bibliothek benutzt werden. Die folgende Funktion schreibt eine angegebene Anzahl von Textzeilen in eine neue Datei:

/*
 * Write a given number of demo lines to a file.
 */
static void WriteFile(const char *path, int lines)
{
    FILE *fp;
    int i;

    /* Open file. */
    fp = fopen(path, "w");
    if (fp == NULL) {
        printf("Error %d opening %s\n", errno, path);
        return;
    }
    /* Write the text lines. */
    for (i = 1; i <= lines; i++) {
        putchar('.');
        fprintf(fp, "This is line number %d\n", i);
    }
    /* Close file. */
    fclose(fp);
}

Nut/OS kennt keine relativen Pfade. Diese müssen immer absolut angegeben werden, wobei der Name des Dateisystems, getrennt durch einen Doppelpunkt, vorangestellt wird. Um eine Datei TEST.TXT im Rootverzeichnis mit 10 Textzeilen zu erstellen, wird die obige Routine wie folgt aufgerufen:

WriteFile("PHAT0:/TEST.TXT", 10);

Die entsprechende Funktion zum Lesen einer Textdatei könnte so aussehen:

/*
 * Print file contents on console.
 */
static void DisplayFile(const char *path)
{
    static char buffer[512];
    FILE *fp;

    /* Open file. */
    fp = fopen(path, "r");
    if (fp == NULL) {
        printf("Error %d opening %s\n", errno, path);
        return;
    }
    /* Read and display file, line by line. */
    while (fgets(buffer, sizeof(buffer), fp)) {
        printf("%s", buffer);
    }
    /* Close file. */
    fclose(fp);
}

Quellcode

Die in den Archiven enthaltenen Unterverzeichnisse kopiert man in das Verzeichnis nutapp. Falls noch nicht geschehen, muss man dieses mit dem Nut/OS Konfigurator erstellen. Die ebenfalls enthaltenen Binärdateien wurden für die Ausführung im SDRAM übersetzt.

en5mmc_write.zip
Vollständige Beispielanwendung zum Schreiben einer Textdatei.

en5mmc_read.zip
Entsprechendes Beispiel zum Lesen der Textdatei.