FSInit () - “CE_BAD_PARTITION” [chiuso]


9

Sto usando un PIC18F26K80 e un compilatore XC8. Sto cercando di inizializzare una scheda SD e creare un file. Ho semplicemente formattato la scheda SD su Windows per avere un file system "FAT32" e una "Dimensione unità di allocazione" di 512 byte. La capacità della scheda SD è di 2 GB. Sto usando la libreria MDD dalla versione MLA Legacy. Il mio principale è il seguente:

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);
} 

Il programma si blocca all'interno della funzione "FSInit ()" e l'errore che ottengo dalla funzione è "CE_BAD_PARTITION", che significa "Il record di avvio è errato".

La funzione "initIO ()" è la seguente:

//==============================================================================
// 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;
}

Gli ultimi due byte del settore 0 sono la firma di avvio e devono essere 0x55 e 0xAA e l'immagine che ho incluso lo conferma. Tuttavia, all'interno della funzione "LoadMBR" viene effettuato il seguente controllo:

if((Partition->Signature0 != FAT_GOOD_SIGN_0) || (Partition->Signature1 != FAT_GOOD_SIGN_1))
{
    FSerrno = CE_BAD_PARTITION;
    error = CE_BAD_PARTITION;
}
else
{
    ...
}

e sebbene i byte siano uguali, viene soddisfatta la prima condizione e restituisce l'errore "CE_BAD_PARTITION".


2
Sei sicuro che il PIC si aspetti FAT32 e non FAT16?
Roger Rowland,

@RogerRowland Ho provato anche con FAT16 ma mi ha dato lo stesso errore.
user2344158

Questo post correlato nei forum di Microchip sembra simile. L'hai visto?
Roger Rowland,

@RogerRowland sì, è lo stesso caso penso. Ma non sembra che qualcosa non
vada

1
Sto votando per chiudere questa domanda come fuori tema perché è stata abbandonata dal richiedente senza follow-up per una soluzione per quattro anni.
Chris Stratton,

Risposte:


1

Non fornisci abbastanza del tuo codice per aiutarti a eseguire il debug di questo, ma google per i frammenti che hai pubblicato mostrano che proviene da parte di una libreria FAT16.

Guardando la tabella delle partizioni pubblicata

000001c0 03 00 0b e7 39 ee 80 00 00 00 00 90 3a 00 00 00 | .... 9 .......: ... |
000001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ |

sono flag 0x00, CHS 0/3/0 - CHS 238/231/57 LBA 128 - 3837952 e digitare 0xb

digitare 0xb indica una partizione FAT32, quindi la mia ipotesi è

1) il tuo codice si rifiuta di esaminarlo perché ha un tipo di partizione errato, oppure

2) improbabile, il tuo codice è sconvolto dal fatto che i valori CHS non corrispondono ai valori LBA.

prova a impostare quel tipo di partizione su 0x6 (FAT16), riscrivendo la tabella delle partizioni con valori CHS sani (o valori CHS fittizi) e formattando la partizione come FAT16.


0

Ho provato qualcosa del genere qualche tempo fa e ho trovato difficili le librerie di Microchip. Esiste un sistema FOSS FAT chiamato PetitFAT che ho trovato molto facile da avviare. (La sua versione stampata è ottima anche per le piccole piattaforme integrate.) Spero che sia d'aiuto.


0

Innanzitutto, non fare un po 'di tempo () attorno a FSINit (). È solo pigro. Chiamalo e controlla il risultato e gestiscilo di conseguenza in modo che il tuo programma non rimanga bloccato in un loop sconosciuto infinito.

In secondo luogo, hai esaminato la definizione di "FAT_GOOD_SIGN_0" e "FAT_GOOD_SIGN_1" per essere sicuro che si aspettino uno 0x55 e 0xAA?

Terzo, hai controllato l'ordine dei byte della firma? FAT-32 sta cercando 0xAA55, non 0x55AA.


Questo è stato chiesto quattro anni fa e abbandonato da un utente che non è nemmeno tornato al sito da due anni. Le "risposte" non dovrebbero davvero essere usate per porre domande chiarificatrici, poiché è improbabile che tu possa ottenere una risposta - realisticamente, il problema stesso è probabilmente da tempo risolto o abbandonato.
Chris Stratton,

In realtà Chris, è un po 'stretto. Le persone stanno ancora scrivendo driver personalizzati per schede SD da incorporare, senza fare affidamento sulla libreria eventualmente errata di qualcun altro o altre librerie sono troppo grandi o per qualche altro motivo inadeguato. La conoscenza del filesystem è una di quelle cose che sta diventando sempre più difficile da trovare e quasi ogni frammento di informazioni è rilevante. Quello che ho pubblicato potrebbe non aiutare il poster originale, ma potrebbe aiutare qualcun altro. Non sono sicuro del motivo per cui hai anche commentato, dal momento che non stai aggiungendo nulla alla conversazione tecnicamente in alcun modo utile.
GSLI,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.