Forum: Mikrocontroller und Digitale Elektronik Arduino Due SD-Card mit Atmels' FatFS


von I.Haase (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich lese schon lange hier im Forum mit und habe mir dadurch schon häufig 
selber helfen können. Leider habe ich nun jedoch ein Problem, bei dem 
ich alleine nicht weiter komme, auch wenn es schon etliche Beiträge zum 
Thema FATfs o.ä. gibt, die helfen mir jedoch leider alle nicht weiter.

Der nachfolgende Text ist sehr lang geworden, aber ich möchte euch mein 
Problem so gut es geht schildern und eingrenzen um euch und möglichst 
viel Arbeit und Diskussion zu ersparen.


Meine Ausgangslage: Ich programmiere für ein Studienprojekt mit dem 
Atmel Studio 6.2 einen Arduino Due mit einem selbstgebauten 
Aufsatzshield, welches u.a. einen SD-Card Connector beinhaltet, der über 
SPI mit dem ATSAM verbunden ist.

Das Grobziel ist es einen hochauflösenden (24 Bit) Datalogger zu bauen. 
Das letzte fehlende Teilziel ist die korrekte Einrichtung des File 
Systems auf dem uC.

Ich verwende (u.a) die ASF Bibliotheken "SD/MMC stack on SPI interface" 
und "FatFS file system" welches auf der Bibliothek von Elm Chan basiert.

Die SPI Kommunikation für andere Zwecke funktioniert super. Auch die 
Schaltung ist korrekt, da ich bereits mit der Arduino IDE und 
zugehörigen Bibliotheken erfolgreich auf die Karte schreiben und von ihr 
lesen konnte.

Ich habe mir auch schon die ASF Beispiele zu genüge angeguckt und 
ausprobiert. Bis zum einfachen Schreiben und Lesen mit der SD Karte 
funktioniert das Beispiel super und das Terminal-Window gibt einem 
folgende Infos:

_________________________
-I- Initialize SPI Interface
 Please plug an SD, MMC or SDIO card in SD-slot.Card information:

    SDHC

    30436 MB

Card R/W test: 246 KBps [OK] 474 KBps [OK][OK]

Test finished. Card is ready.
_________________________

Das Problem liegt also "lediglich" bei der Einrichtung der FatFS.

Was ich bisher heraus gefunden habe, wo man überall Anpassungen 
vornehmen muss, ist dass man die "low-level" Funktionen (disk_read, 
disk_write, disk_init...) zum Schreiben und Lesen auf/von der SD Karte 
in die diskio.c einarbeiten muss.

Außerdem habe ich festgestellt, dass man in der conf_access.h scheinbar 
die LUN_2 enablen muss.


Als nächstes habe ich in der main unter anderem folgende Funktionen 
aufrufen:

-  sd_mmc_init();

-  sd_mmc_check(SD_SLOT); //sollte keinen Fehler zurückgeben, tut es 
auch nicht. //bis hierhin funktioniert wie oben beschrieben alles 
tadelos und  das Terminal-Fenster spuckt auch valide Daten von der 
Kommunikation aus

-  f_mount(LUN_ID_SD_MMC_0_MEM, &fs);  //an dieser Stelle vermute ich 
schon, dass die Wahl des LUN falsch sein kann. Ich verstehe noch nicht 
ganz was es mit den LUNs auf sich hat. Der Ausgabewert der Funktion 
ergibt jedoch keinen Fehler (FR_OK)

-  f_open(&file_object,(char const *)test_file_name,  FA_CREATE_ALWAYS | 
FA_WRITE); // Hier kommt es jetzt zur eigentlichen Fehlermeldung. f_open 
gibt als Errorcode FR_DISK_ERR aus.
Wenn man jetzt die Funktion f_open weiter verfolgt, liegt der Fehler in 
der nächsten Ebene in
-> chk_mounted(&path, &dj.fs, (BYTE)(mode & ~FA_READ));
-> fmt = check_fs(fs, bsect = 0);
-> dann in disk_read (in der diskio.c);
meine diskio.c habe ich euch angehängt.

- f_puts("Test SD/MMC stack\n", &file_object); //soweit komme ich gar 
nicht erst diese Funktion aufzurufen, da ich ja bereits in der f_open 
festhänge...

- f_close(&file_object); // da f_open nicht funktioniert, funktioniert 
natürlich auch (noch) kein f_close ;-)



Eine Stelle die mir innerhalb der Funktin chk_mounted noch aufgefallen 
ist und die zur Fehlerfindung beitragen könnte, ist diese hier:

if (fs->fs_type)
{    /* If the logical drive has been mounted */
  stat = disk_status(fs->drv);
  if (!(stat & STA_NOINIT))
  {
  /* and the physical drive is kept initialized (has not been changed), 
*/
  if (!_FS_READONLY && chk_wp && (stat & STA_PROTECT))
  /* Check write protection if needed */
  return FR_WRITE_PROTECTED;
  return FR_OK;    /* The file system object is valid */
  }
}

Das heißt ja, dass fs_type an irgendeiner Stelle einen Wert außer 0 
annehmen muss, damit man innerhalb von chk_mounted überhaupt irgendwann 
"return FR_OK" erreicht. Aber ich konnte keinen Ort finden, an dem 
fs_type zu irgendetwas anderem außer "0" initialisiert wird. Ich habe es 
so verstanden, dass der fs_type die Art des FAT systems angibt, also bei 
uns bspw. fs_type = 3 um ein FAT32 system auszuwählen.


Leider habe ich keine wirklich konkrete Fragestellung, sondern lediglich 
meine Fetzen, an denen ich den Fehler vermute und die Frage, ob ich an 
irgendeiner Stelle ein benötigtes define o.ä. vergessen habe oder 
irgendeine Funktion noch nötig ist.


Ich denke/hoffe, dass mit meiner Frage bzw. euren Antworten vielen 
anderen auch geholfen werden kann, die ähnliche Probleme mit der 
Einrichtung der FatFS in Atmel mit dem Arduino haben, da ich vermute, 
dass diese Konstellation gar nicht mal so selten verwendet wird.

Wenn ihr so weit gekommen seid, bis hierher zu lesen, vielen Dank im 
voraus für eure Antworten! :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.