STM32 - SD-KARTE MIT FATFS

Ich versuche, mit Hilfe von FATFS R0.11 eine SD-Karte der Klasse 10 - 2 GBf_mount() von STM32 zu lesen und zu schreiben, aber die Funktion gibt FR_NO_FILESYSTEMeinen Fehlercode zurück. Ich habe den gleichen Code auf einer SD-Karte der Klasse 4 - 2 GB und der Klasse 10 - 16 GB getestet , und es hat perfekt funktioniert. Was mache ich hier falsch für diese spezielle SD-Karte?

Code:

FIL filTest;
FATFS fs;

FRESULT initSD()
{

    disk_initialize(0);
    FRESULT res;

    res = f_mount(&fs, "", 1);

    if(res != FR_OK)
    {

        return res;

    }

    res = f_open(&filTest, "test.txt", FA_OPEN_ALWAYS | FA_WRITE | FA_READ);
    return res;

}
Die "Klasse 10 - 2GB SD" ist gefälscht. Geschwindigkeitsklassen gelten nur für SDHC-Karten IIRC, und das sind >=4 GB.
Hast du versucht die Karte neu zu formatieren?

Antworten (2)

Sie erhalten einen Rückgabecode FR_NO_FILESYSTEM, wenn ein Dateisystem nicht existiert ( LINK ). Formatiere einfach die SD-Karte und es sollte in Ordnung sein. Ich gehe davon aus, dass Sie die kostenlose Implementierung von FAT von Elm Chan verwenden.

Noch mehr Spaß: Wenn Sie tief genug in ff.c einsteigen, können Sie sehen, dass wir check_fs() innerhalb von find_volume() aufrufen. In check_fs() prüfen wir, ob die SD-Karte oder der Flash oder irgendein Speicher ein FAT-Dateisystem hat. Wir brauchen ein Dateisystem, um eine Festplatte zu mounten. Sie können f_mkfs verwenden, um ein System in FAT zu formatieren. ( VERKNÜPFUNG )

Ich hatte das Problem, dass 1 meiner 4 herumliegenden SD-Karten funktionierte. Bei den anderen bekomme ich FR_NO_FILESYSTEM beim Mounten mit f_mount. Wenn Sie Ihre Karte mit HxD in Sektor 0 überprüfen, sollten die letzten 2 Bytes 0x55 und 0xAA sein, wenn sie mit FAT formatiert sind.

Meine Karten waren korrekt formatiert, wurden aber nicht als FAT-Format erkannt und der Fehler lag tatsächlich in der Low-Level-Implementierung.

Auf STM32 (mit spi HAL-Bibliothek) muss beim Lesen von der SD-Karte ein 0xFF gesendet werden (MOSI muss für jedes Bit HIGH sein) und daher musste ich die Funktion HAL_SPI_TransmitReceive() verwenden, um beim Empfangen ein 0xFF zu senden.

Danach funktionierten die anderen Karten ohne Probleme.

Ich denke, einige Karten können ohne sie leben.

Das hat das Problem für mich gelöst!