.
hola.
¿ Alguno habeis conseguido implementar con éxito un tarjetero SD con un STM32F4, usando SDIO y FATFS ?
Llevo unos días haciendo todo tipo de pruebas y no hay manera, de pesadilla. Uso Cubemx para configurarlo todo, y el fuente para leer/escribir lo he ido encontrado por varios sitios en internet.
Al final solo me funciona con algunas tarjetas micro SD de Kingston formateadas en FAT, son tarjetas de 2Gb y 4Gb. En mi placa en principio no iba nunca, active las resistencias de pullup internas para todas las lineas, y ya parecía que funcionaba, pero no siempre. Usando una Discovery con un tarjetero externo que lleva resistencias de pullup en todas sus lineas, funciona, pero solo con tarjetas Kingston.
En Cubemx selecciono SDIO y FATFS, eso genera todas las librerías incluidas las de acceso a bajo nivel (DISKIO). El ruteo de la placa es correcto, según el pinout de las tarjetas micro SD para acceso por SDIO 4 bits paralelo. Además también he hecho pruebas con la Discovery y un tarjetero externo, con idénticos resultados.
1 ------ D2 ------- PC10
2 ------ D3 ------- PC11
3 ------ CMD ----- PD2
4 ------ +3.3v --- +3.3v
5 ------ CLK ------ PC12
6 ------ GND ----- GND
7 ------ D0 ------- PC8
8 ------ D1 ------- PC9
Y estos son los fuentes que he estado probando, para crear y leer un fichero de pruebas.
Variables públicas comunes en algunos ejemplos
FATFS SDFatFs; /* File system object for SD card logical drive */
FIL MyFile; /* File object */
FRESULT res; /* FatFs function common result code */
uint32_t byteswritten, bytesread; /* File write/read counts */
Código prueba1, crea un fichero con una linea de texto.
FATFS fileSystem;
FIL testFile;
uint8_t testBuffer[16] = "SD write success";
UINT testBytes;
res = f_mount(&fileSystem, SD_Path, 1);
if(f_mount(&fileSystem, SD_Path, 1) == FR_OK)
{
uint8_t path[13] = "testfile.txt";
path[12] = '\0';
res = f_open(&testFile, (char*)path, FA_WRITE | FA_CREATE_ALWAYS);
res = f_write(&testFile, testBuffer, 16, &testBytes);
res = f_close(&testFile);
}
Código prueba2, crea dos ficheros con textos de pruebas.
const char wtext[] = "Probando fichero1";
const char wtext2[] = "Probando fichero2";
// if(FATFS_LinkDriver(&SD_Driver, SDPath) == 0)
//{
if(f_mount(&SDFatFs, (TCHAR const*)SD_Path, 0) == FR_OK)
{
if(f_open(&MyFile, "Fichero1.txt", FA_CREATE_ALWAYS | FA_WRITE) == FR_OK)
{
if(f_write(&MyFile, wtext, sizeof(wtext), (void *)&byteswritten) == FR_OK);
{
f_close(&MyFile);
}
}
}
if(f_mount(&SDFatFs, (TCHAR const*)SD_Path, 0) == FR_OK)
{
if(f_open(&MyFile, "fichero2.txt", FA_CREATE_ALWAYS | FA_WRITE) == FR_OK)
{
if(f_write(&MyFile, wtext2, sizeof(wtext2), (void *)&byteswritten) == FR_OK);
{
f_close(&MyFile);
}
}
}
Código prueba 3, rutinas de configuración, lectura y escritura por separado.
//*** FatFs, enlace logico SD disk I/O driver.
//** Esto es comun tanto para lectura como para escritura
int errorescritura=0; // 0= fichero creado y escrito con exito, 1=Error al crear o escribir el fichero.
int sinficheroconfig=0; // 0= existe fichero config.txt, 1= no existe fichero config.txt
int sintarjeta=0; // 0= hay tarjeta, 1= no hay tarjeta SD
//if(retSD == 0)
if(FATFS_LinkDriver(&SD_Driver, SDPath) == 0)
{
//2- Register the file system object to the FatFs module
if(f_mount(&SDFatFs, (TCHAR const*)SD_Path, 0) != FR_OK)
{
//FatFs Initialization Error
sintarjeta=1; // Error, no hay tarjeta insertada
}
} else {
sintarjeta=2; // Error, no hay tarjeta insertada
}
//**** Rutina de lectura del fichero *****
if (sintarjeta==0) // hay tarjeta insertada, la lee
{
//7- Open the text file object with read access
if(f_open(&MyFile, "config.txt", FA_READ) != FR_OK)
{
sinficheroconfig = 1; // no existe fichero config.txt o esta dañado
//'Hello.txt' file Open for read Error
} else {
//8- Read data from the text file
res = f_read(&MyFile, rtext, sizeof(wtext), &bytesread);
if((res != FR_OK)) // comprueba si ha leido con exito
{
sinficheroconfig = 1; // no existe fichero config.txt o esta dañado (o vacio)
//'Hello.txt' file Read or EOF Error
} else {
//Successful read
//9- Close the open text file
f_close(&MyFile);
}
}
}
//*** Rutina escritura, crea fichero config.txt si no existe, con configuración por omisión, chequea que haya una tarjeta
if (sinficheroconfig==1 && sintarjeta==0)
{
const char wtext[] = "Hola Mundo"; // texto de pruebas para Debug
//1- FatFS: Link the SD disk I/O driver
if(sintarjeta == 0)
{
//4- Create & Open a new text file object with write access
if(f_open(&MyFile, "config.txt", FA_CREATE_ALWAYS | FA_WRITE) !=FR_OK) // Crea fichero y lo abre
{
sintarjeta=1; // Error, no puede crear el fichero, falta tarjeta, esta dañada o no la puede escribir
} else {
//5- Write data to the text file
res = f_write(&MyFile, wtext, sizeof(wtext), (void*)&byteswritten); // escribe texto de pruebas
if((byteswritten == 0) || (res != FR_OK))
{
errorescritura=1; // Error al intentar grabar en el fichero config.txt
//'Hello.txt' file Write or EOF Error
} else {
//6- Successful open/write
//HAL_GPIO_WritePin(GPIOG, GPIO_PIN_12, GPIO_PIN_RESET);
f_close(&MyFile); // Fichero grabado con exito
}
}
}
}
//10- Unlink the micro SD disk I/O driver ****
// Desconecta tarjeta micro SD ***************
FATFS_UnLinkDriver(SD_Path);