Hallo zusammen,
ich war mir nicht sicher, ob meine Frage in dieser Kategorie richtig ist. Falls nicht bitte gerne verschieben.
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 uC verbunden ist.
Das Grobziel ist es einen hochauflösenden (24 Bit) Datalogger zu bauen.
Das letzte fehlende Teilziel ist die korrekte Einrichtung des FAT 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);
-> und dann in disk_read
-> Hier meine diskio.c in der die disk_read Funktion steht diskio.c
- 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.
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!
Ich bin für jeden Stupser in beliebige Richtung dankbar!
Hier tritt höchstwahrscheinlich der Fehler auf.
Code:fmt = check_fs(fs, bsect); /* Load sector 0 and check if it is an FAT boot sector as SFD */ if (fmt == 1 || (!fmt && (LD2PT(vol)))) { /* Not an FAT boot sector or forced partition number */ for (i = 0; i < 4; i++) { /* Get partition offset */ pt = fs->win + MBR_Table + i * SZ_PTE; br[i] = pt[4] ? LD_DWORD(&pt[8]) : 0; } i = LD2PT(vol); /* Partition number: 0:auto, 1-4:forced */ if (i) i--; do { /* Find an FAT volume */ bsect = br[i]; fmt = bsect ? check_fs(fs, bsect) : 2; /* Check the partition */ } while (!LD2PT(vol) && fmt && ++i < 4); } if (fmt == 3) return FR_DISK_ERR; /* An error occured in the disk I/O layer */Code:if (move_window(fs, sect) != FR_OK) /* Load boot record */ return 3;
Warum disk_read() fehlschlägt musst du selbst herausfinden. Ich habe weder die Hardware noch die Software.Code:staticFRESULT move_window ( FATFS* fs, /* File system object */ DWORD sector /* Sector number to make appearance in the fs->win[] */ ) { FRESULT res = FR_OK; if (sector != fs->winsect) { /* Window offset changed? */ #if !_FS_READONLY res = sync_window(fs); /* Write-back changes */ #endif if (res == FR_OK) { /* Fill sector window with new data */ if (disk_read(fs->drv, fs->win, sector, 1) != RES_OK) { sector = 0xFFFFFFFF; /* Invalidate window if data is not reliable */ res = FR_DISK_ERR; } fs->winsect = sector; } } return res; }
mfg
Lesezeichen