-
        

Ergebnis 1 bis 2 von 2

Thema: Einbindung der FatFS auf SD-Card über Atmel Studio in einen Arduino Due

  1. #1

    Einbindung der FatFS auf SD-Card über Atmel Studio in einen Arduino Due

    Anzeige

    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!

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    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;

    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;
    }
    Warum disk_read() fehlschlägt musst du selbst herausfinden. Ich habe weder die Hardware noch die Software.

    mfg

Ähnliche Themen

  1. Wie kann ich über Arduino einen Rc-Regler steuern?
    Von Moritz Weichert im Forum Motoren
    Antworten: 22
    Letzter Beitrag: 30.01.2013, 13:02
  2. WinAVR - Flash Reset bei Arduino Mega2560 im Atmel Studio
    Von robo_tom_24 im Forum C - Programmierung (GCC u.a.)
    Antworten: 16
    Letzter Beitrag: 23.01.2013, 09:34
  3. RP6 und Atmel Studio 6.0
    Von bernd01 im Forum Robby RP6
    Antworten: 2
    Letzter Beitrag: 24.07.2012, 12:37
  4. Atmel Studio 6
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 4
    Letzter Beitrag: 14.03.2012, 18:23
  5. Composit-Videosignal über AVR auf SD-Card?
    Von AudioPhil im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 25.01.2007, 09:13

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •