FSInit () - “CE_BAD_PARTITION”

8

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".

    
pregunta user2344158

1 respuesta

0

Probé algo como esto hace algún tiempo y encontré las bibliotecas de Microchip difíciles. Hay un sistema FOSS FAT llamado PetitFAT que encontré muy fácil de poner en marcha. (Su printf lib también es ideal para pequeñas plataformas integradas). Espero que eso ayude.

    
respondido por el dmb

Lea otras preguntas en las etiquetas