Estoy usando un PIC18F26K80 y un compilador XC8. Estoy tratando de inicializar una tarjeta SD y crear un archivo. Simplemente he formateado la tarjeta SD en Windows para tener un sistema de archivos "FAT32" y un "tamaño de unidad de asignación" de 512 bytes. La capacidad de la tarjeta SD es de 2GB. Estoy usando la biblioteca MDD de la versión heredada de MLA. Mi principal es el siguiente:
FSFILE * file;
char sendBuffer[22] = "This is test string 1";
//**************************************************
// main function
//**************************************************
int main()
{
initIO();
LATBbits.LATB0 = 0;
// Initialise SPI and SD-card
while ( !MDD_MediaDetect() );
// Initialize the device
while ( !FSInit() );
// Initialize
#ifdef ALLOW_WRITES
// Create a new file
file = FSfopenpgm ( "FILE.TXT", "w" );
if ( file == NULL )
while(1);
// Write 21 1-byte objects from sendBuffer into the file
if ( FSfwrite ( (void *) sendBuffer, 1, 21, file ) != 21 )
while(1);
// Close the file
if ( FSfclose ( file ) )
while(1);
#endif
LATBbits.LATB0 = 1; //LED
while(1) {}
return (0);
}
El programa se atasca dentro de la función "FSInit ()" y el error que obtengo de la función es "CE_BAD_PARTITION", que significa "El registro de arranque es incorrecto".
La función "initIO ()" es la siguiente:
//==============================================================================
// void initIO( void );
//==============================================================================
// Sets the pins on the PIC to input or output and determines the speed of the
// internal oscilaltor
// input: none
// return: none
//==============================================================================
void initIO()
{
OSCCON = 0x75; // Clock speed = 32MHz (4x8Mhz)
TRISA = 0;
TRISB = 0;
TRISC = 0;
TRISBbits.TRISB0 = 0; //LED
TRISCbits.TRISC3 = 0; // set SCL pin as output
TRISCbits.TRISC4 = 1; // set RC4 pin as input
TRISCbits.TRISC5 = 0;
TRISAbits.TRISA5 = 0;
}
Los últimos dos bytes del sector 0 son la firma de inicio y están destinados a ser 0x55 y 0xAA y la imagen que incluí lo confirma. Sin embargo, dentro de la función "LoadMBR" se realiza la siguiente comprobación:
if((Partition->Signature0 != FAT_GOOD_SIGN_0) || (Partition->Signature1 != FAT_GOOD_SIGN_1))
{
FSerrno = CE_BAD_PARTITION;
error = CE_BAD_PARTITION;
}
else
{
...
}
y aunque los bytes son iguales, se cumple la primera condición y se devuelve con el error "CE_BAD_PARTITION".