En el siguiente ejercicio, ya podemos:
crear y borrar archivos .txt
crear y borrar carpetas
ingresar y salir por los directorios
Todo es en base a la libreria de CCS y el ejemplo de FAT que este trae.
#include "main.h"
#include <stdlib.h>
#Include "mmcsd.c"
#Include "fat.c"
#Include "comandos_fat.h"
void main(){
char buffer[255];
char opt_buffer[255];
char *cmd, *option1, *option2;
set_tris_a(0b00000010);
set_tris_b(0b00000001);
set_tris_c(0b00000000);
set_tris_d(0b00000000);
set_tris_e(0b00000000);
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
// TODO: USER CODE!!
printf("\r\nTest Memoria SD FAT- PICmouse\r\n");
Respuesta_SD=fat_init();//mmcsd_init();
printf("Resultado de inicializacion de memoria SD=");
if(Respuesta_SD==0)printf("OK\r\n");
else {
printf("ERROR\r\n");
while(1);
}
puntero_SD=0x0000;
capacidad_buffer=512;
//Respuesta_SD=mmcsd_read_block(puntero_SD, capacidad_buffer, buffer_SD);
Respuesta_SD=0;
if(Respuesta_SD!=0){
printf("Error es imposible leer la memoria SD");
while(1);
}
else{
printf ("\r\n\r\n\r\n");
/*
printf ("LECTURA DE MEMORIA SD Direccion Inicial=%LX posiciones leidas = %lu \r\n\r\n",puntero_SD,capacidad_buffer);
printf (" DIR 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F VAL ASCII \r\n");
printf ("----:---- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ----------------\r\n");
printf ("0000:%LX ",puntero_SD);
j=0;
l=0;
for(i=0;i<capacidad_buffer;i++){
printf("%2X ",buffer_SD[i]);
j++;
l++;
if (j== 16){
printf(" ");
for (k=l-16;k<l;k++) printf("%C",buffer_SD[k]);
printf("\r\n");
puntero_SD=puntero_SD+16;
if(i<(capacidad_buffer-1)) printf("0000:%LX ",puntero_SD);
j=0;
}
}
printf("Fin de lectura de bloque de 512 bytes\r\n\r\n"); */
//--------------------------------------------------
while(TRUE)
{
i = 0;
DisplayPrompt();
do
{
buffer[i] = getch();
// check for a backspace
if(buffer[i] != 8)
{
printf("%c", buffer[i]);
i++;
}
else if(i > 0)
{
// delete the last character
i--;
putc(8);
putc(' ');
putc(8);
}
buffer[i] = '\0';
} while(buffer[i - 1] != '\r');
// parse the command and options
cmd = GetCMD(buffer);
option1 = GetOption(cmd + strlen(cmd) + 1);
option2 = GetOption(option1 + strlen(option1) + 1);
//if option1 starts with a '/', that means the file in the option includes
//the full path to the file. if the file doesn't start with a '/', the
//current working directory must be added.
if (option1 && (option1[0]=='/'))
{
//option1 is a full path
strcpy(opt_buffer, option1);
}
else if (option1)
{
// tack on the current working directory to option1
strcpy(opt_buffer, g_CWD);
strcat(opt_buffer, option1);
}
if (cmd)
{
switch(FindCommand(cmd))
{
case 0: //del
DeleteFile(opt_buffer);
break;
case 1: //make
MakeFile(opt_buffer);
break;
case 2: //append
AppendFile(opt_buffer, option2);
break;
case 3: //change directory
ChangeDirectory(opt_buffer);
break;
case 4: //show directory contents
DisplayDirectory(g_CWD);
break;
case 5: //cat, display file
PrintFile(opt_buffer, CAT_FROM_START);
break;
case 6: //tail, display last 80 charachters
PrintFile(opt_buffer, CAT_FROM_END);
break;
case 7: //mkdir, make a directory
MakeDirectory(opt_buffer);
break;
case 8: //rmdir, make a directory
RemoveDirectory(opt_buffer);
break;
case 9: //format, format the card
FormatMedia(option1);
break;
case 10: //help, display help
ShowHelp();
break;
default:
printf("\r\nUnkown Command '%s'", cmd);
break;
}
}
}
}
while(1);
}Estoy haciendo un video para que vean como va esto.
http://rapidshare.com/files/169064068/SD_FAT.swf.htmlAhora bien:
Creamos archivos con el PIC, al tabajar en FAT esperaria que al meter la SD al PC este me reconozca los mismos archivos y directorios creados. Pasa que no.

Entonces: El PIC supuestamente trabaja en FAT32, así que intente revisar lo que escribe el PIC en el sector de arranque de la SD y luego formatear de las formas posibles en el PC y buscar diferencias. El resultado:
Esta resaltado en rojo lo que es diferente.
Pero si buscamos en que significa cada posición, sabemos que corresponde a:
42h Dynamic disk volumeID Descripción01h Partición primaria FAT12 o volumen lógico (volumen de menos de 32,680 sectores)
04h Partición primaria FAT16 o volumen lógico (32,680–65,535 sectores o 16 MB–33 MB)
05h Partición DOS Extendida
06h Partición FAT16 BIGDOS o volumen lógico (33 MB–4 GB)
07h Partición NTFS o volumen lógico ("Installable File System")
0Bh Partición FAT32 o volumen lógico (hasta 2048 GB)
0Ch Partición FAT32 o volumen lógico usando extensiones de la INT 13h BIOS
0Eh Partición FAT16 BIGDOS o volumen lógico usando extensiones de la INT 13h BIOS
0Fh Partición DOS extendida usando extensiones de la INT 13h BIOS
12h Partición EISA
42h Dynamic disk volume
86h Legacy FT FAT16 disk
87h Legacy FT NTFS disk
8Bh Legacy FT volume formateado con FAT32
8Ch Legacy FT formateado con FAT32 usando extensiones de la INT 13h BIOS