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 MLA Legacy. 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 malo".
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 dos últimos bytes del sector 0 son la firma de arranque 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 verificació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, la primera condición se cumple y vuelve con el error "CE_BAD_PARTITION".