mit dieser Library können SD-Karten mit einem FAT-Dateisystem per SPI-Schnittstelle vom STM32F4 verwaltet werden.
Hinweis : es gibt noch eine Library für den SDIO-Bus (Nr. 13) für USB-Sticks per FATFS (Nr. 32) und eine kombinierte Library SD+USB (Nr. 87)
Für eine genauere Beschreibung siehe Library Nr. 13 (die ist softwareseitig identisch)
FATFS von ChaN ist in der Version 0.10c und die SPI-Funktionen sind auch von ChaN.
(siehe beiliegende Doku)
Hinweis : der MISO-Pin braucht einen PullUp Widerstand
(ich habe den internen der CPU per Software aktiviert)
Den CardDetect Pin habe ich im H-File deaktiviert.
(mein SD-Kartenhalter hat keinen Detect-Schalter)
Der “Mount-Befehl” wirft einen Fehler, wenn keine Karte eingesteckt ist.
Benutzte Pins :
1 2 3 4 5 6 7 8 | PB12 -> ChipSelect = SD-Karte CS (CD) PB13 -> SPI-SCK = SD-Karte SCLK (CLK) PB14 -> SPI-MISO = SD-Karte DO (DAT0) (*) PB15 -> SPI-MOSI = SD-Karte DI (CMD) (*) MISO needs PullUp (internal or external) mit Detect-Pin : PC0 -> SD_Detect-Pin (Hi=ohne SD-Karte) |
Voraussetzungen :
1 2 | Benutzte Module der CooCox-IDE : GPIO, RCC, TIM, MISC, SPI Benutzte Librarys : FATFS (mehrere Files), STM32_UB_SPI |
Beispiel :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | //-------------------------------------------------------------- // File : main.c // Datum : 01.01.2014 // Version : 1.0 // Autor : UB // EMail : mc-4u(@)t-online.de // Web : www.mikrocontroller-4u.de // CPU : STM32F4 // IDE : CooCox CoIDE 1.7.4 // GCC : 4.7 2012q4 // Module : CMSIS_BOOT, M4_CMSIS_CORE // Funktion : Hauptprogramm // Hinweis : Diese zwei Files muessen auf 8MHz stehen // "cmsis_boot/stm32f4xx.h" // "cmsis_boot/system_stm32f4xx.c" //-------------------------------------------------------------- #include "main.h" #include "stm32_ub_led.h" #include "stm32_ub_fatfs.h" int main(void) { FIL myFile; SystemInit(); // Quarz Einstellungen aktivieren // init der LEDs UB_Led_Init(); // Init vom FATFS-System UB_Fatfs_Init(); // Check ob Medium eingelegt ist if(UB_Fatfs_CheckMedia(MMC_0)==FATFS_OK) { // Media mounten if(UB_Fatfs_Mount(MMC_0)==FATFS_OK) { UB_Led_On(LED_BLUE); // File zum schreiben im root neu anlegen if(UB_Fatfs_OpenFile(&myFile, "0:/UB_File.txt", F_WR_CLEAR)==FATFS_OK) { UB_Led_On(LED_GREEN); // ein paar Textzeilen in das File schreiben UB_Fatfs_WriteString(&myFile,"FATFS im SPI-Mode"); UB_Fatfs_WriteString(&myFile,"hier Zeile zwei"); UB_Fatfs_WriteString(&myFile,"ENDE"); // File schliessen UB_Fatfs_CloseFile(&myFile); } // Media unmounten UB_Fatfs_UnMount(MMC_0); } else { UB_Led_On(LED_RED); } } while(1) { } } |
Hier die Library zum Download :
Hier der komplette CooCox-Projektordner zum Download :
Thanks a lotttt.
Hi Uwe,
Ich kann deutsch aber besser in englisch zu erklären. I want to use STMf4 29i Discovery Board instead of STM32F4 for my project, in this case, I checked the SPI Pins can remain the same, and I managed to change the LEDs (PG13, PG14). But the SD mount doesn’t work. And I can’t seem to find the reason. It fails here-
// Media mounten
if(UB_Fatfs_Mount(MMC_0)==FATFS_OK)
Es fehlt irgendwie hier für 29i Discovery, hast du etwas Idee?
have you tested the example from this site ? (without modification first)
it’s written for a stm32f429 and works out of the box
do you use a detect-pin ?
have you tested another sd-card ?
double check all 6 wires (no external pullups and short as possible)