Hola, el codigo es algo así. El problema me aparece al principio.
Lo que hago es inicializar la tarjeta y luego buscar el sector inicial de datos, para encontrar el sector inicial de datos necesito encontrar el sector de arranque y ahí coger lo que necesito para calcular el primer sector de datos, o lo que es lo mismo el cluster numero 2 para tarjetas fat16.
La inicialización de la tarjeta se hace con la función CARD_INI() que aparece por ahi. En esa función simplemente inicio la MMC o SD y voy sacando por pantalla el tipo de tarjeta que se ha detectado, si entra en modo idle, si acepta el tamaño del bloque, y todo lo que respecta a la inicialización de la tarjeta, aquí el puerto serie siempre funciona bien, veo todo los mensajes. Hasta aquí aún no he usado el puntero
A continuación busca el primer sector de datos con la función "int32 BOOT_SECTOR (int8 *punter)" que la pego más abajo. Esta función comienza a leer todos los sectores de la tarjeta comenzando en el 0 y verificando que el primer byte de cada sector leido es 0xEB que indica si estamos en el sector de arranque, una vez encontrado este sector cojo lo que me hace falta para calcular el primer sector de datos y lo devuelvo al programa principal, donde luego lo imprimo por pantalla. Y es aquí donde se queda colgado, he verificado que efectivamente la función que busca el sector de arranque se ejecuta pero luego se queda bloqueada en la parte donde uso el puntero.
void main()
{
output_high(CS_CARD);
//CREAMOS UN PUNTERO QUE RECORRA LA RAM DEL PIC PARA DATOS Y OTRO PARA LEER RELOJ
ptr = (int8 *)malloc(768*sizeof(int8)); //puntero para datos
ptr_rtc = (int8 *)malloc(16*sizeof(int8)); //puntero que lee y escribe hora del RTC
delay_ms(1000);
//INICIALIZACION DEL RTC
RTC_CONFIG(count,counth,clock32,dm_unmask,alarm_dis);
//INICIALIZACION DE LA TARJETA, CONFIGURAMOS SPI LENTO
setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_XMIT_L_TO_H|SPI_CLK_DIV_16);
//INICIALIZACION DE LA TARJETA
CARD_INI();
//UNA VEZ INICIALIZADA AUMENTAMOS LA VELOCIDAD
setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_XMIT_L_TO_H|SPI_CLK_DIV_4);
//BUSCAMOS EL SECTOR INICIAL DE DATOS TENIENDO EN CUENTA LOS SECTORES OCULTOS
SECTOR_INICIAL = BOOT_SECTOR(ptr);
fprintf(data,"SECTOR INICIAL = %Lu\n\r",SECTOR_INICIAL);
....
....
....
....
....
}
Esta sería la función en la que entra y se bloquea.
int32 BOOT_SECTOR(int8 *punter)
{
int16 RootDirSectors,BPB_RootEntCnt,BPB_BytsPerSec;
int16 BPB_NumFATs;
int16 BPB_FATSz16;
int32 FirstDataSector,BPB_FATSz32,FATSz;
HIDDEN_SECTORS = 0;
while(1)
{
SINGLE_BLOCK_READ(HIDDEN_SECTORS, punter);
if (*punter == 0xEB)
{
BPB_RootEntCnt = MAKE16(*(punter+18),*(punter+17));
BPB_BytsPerSec = MAKE16(*(punter+12),*(punter+11));
BPB_SecPerClus = *(punter+13);
RootDirSectors = ((BPB_RootEntCnt * 32) + (BPB_BytsPerSec - 1)) / BPB_BytsPerSec ;
BPB_FATSz16 = MAKE16(*(punter+23),*(punter+22));
BPB_FATSz32 = MAKE32(*(punter+39),*(punter+38),*(punter+37),*(punter+36));
if (BPB_FATSz16 != 0){FATSz = (int32) BPB_FATSz16;}
else{FATSz = BPB_FATSz32;}
BPB_NumFATs = *(punter+16);
BPB_ResvSecCnt = MAKE16(*(punter+15),*(punter+14));
FirstDataSector = (int32)BPB_ResvSecCnt + ((int32)BPB_NumFATs * FATSz) + (int32)RootDirSectors;
//ESTAMOS EN EL BOOT SECTOR
break;
}
else{HIDDEN_SECTORS++;}
}
return (FirstDataSector + HIDDEN_SECTORS);
}
El puerto serie lo he definido en el archivo ".h" del programa de la siguiente forma
#use rs232(stream = data,baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
Cuando uso el puerto serie software y modifico esa linea de la siguiente forma
#use rs232(stream = data,baud=19200,parity=N,xmit=PIN_C7,rcv=PIN_C6,bits=8,invert)
el programa funciona correctamente y no se bloque en ningún momento.
Muchas gracias. Espero que se entienda