FSInit () - "CE_BAD_PARTITION" [geschlossen]

9

Ich verwende einen PIC18F26K80 und einen XC8-Compiler. Ich versuche, eine SD-Karte zu initialisieren und eine Datei zu erstellen. Ich habe die SD-Karte unter Windows einfach so formatiert, dass sie ein "FAT32" -Dateisystem und eine "Allocation Unit Size" von 512 Bytes hat. Die Kapazität der SD-Karte beträgt 2 GB. Ich verwende die MDD-Bibliothek aus der MLA Legacy-Version. Mein Haupt ist das Folgende:

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

Das Programm bleibt in der Funktion "FSInit ()" hängen und der Fehler, den ich von der Funktion erhalte, ist "CE_BAD_PARTITION", was "Der Startdatensatz ist schlecht" bedeutet.

Die Funktion "initIO ()" lautet wie folgt:

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

Die letzten beiden Bytes von Sektor 0 sind die Boot-Signatur und sollen 0x55 und 0xAA sein. Das Bild, das ich beigefügt habe, bestätigt dies. Innerhalb der Funktion "LoadMBR" wird jedoch folgende Prüfung durchgeführt:

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

und obwohl die Bytes gleich sind, ist die erste Bedingung erfüllt und es wird mit dem Fehler "CE_BAD_PARTITION" zurückgegeben.

user2344158
quelle
2
Sind Sie sicher, dass der PIC FAT32 und nicht FAT16 erwartet?
Roger Rowland
@ RogerRowland Ich habe es auch mit FAT16 versucht, aber es gab mir den gleichen Fehler.
user2344158
Dieser verwandte Beitrag in den Microchip-Foren klingt ähnlich. Hast du das gesehen?
Roger Rowland
@ RogerRowland Ja, es ist der gleiche Fall, den ich denke. Aber es sieht nicht so aus, als ob etwas nicht stimmt ... Ich werde meine Frage bearbeiten
user2344158
1
Ich stimme dafür, diese Frage als nicht zum Thema gehörend zu schließen, da sie vom Fragesteller seit vier Jahren ohne Weiterverfolgung einer Lösung aufgegeben wurde.
Chris Stratton

Antworten:

1

Sie stellen nicht genug Code zur Verfügung, um dies zu debuggen, aber wenn Sie nach den Fragmenten suchen, die Sie veröffentlicht haben, wird angezeigt, dass sie aus einem Teil einer FAT16-Bibliothek stammen.

Sehen Sie sich Ihre veröffentlichte Partitionstabelle an

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

Das sind die Flags 0x00, CHS 0/3/0 - CHS 238/231/57 LBA 128 - 3837952 und Typ 0xb

Typ 0xb gibt eine FAT32-Partition an, also meine Vermutung ist es auch

1) Ihr Code weigert sich, ihn anzusehen, weil er den falschen Partitionstyp hat, oder

2) Es ist unwahrscheinlich, dass Ihr Code verärgert ist, dass die CHS-Werte nicht mit den LBA-Werten übereinstimmen.

Versuchen Sie, diesen Partitionstyp auf 0x6 (FAT16) zu setzen, die Partitionstabelle mit vernünftigen CHS-Werten (oder Dummy-CHS-Werten) neu zu schreiben und die Partition als FAT16 zu formatieren.

James
quelle
0

Ich habe vor einiger Zeit so etwas versucht und fand die Bibliotheken von Microchip schwierig. Es gibt ein FOSS FAT-System namens PetitFAT, das ich als sehr einfach empfand . (Seine printf lib eignet sich auch hervorragend für kleine eingebettete Plattformen.) Ich hoffe, das hilft.

danmcb
quelle
0

Machen Sie zunächst keine Weile () mit FSINit (). Das ist nur faul. Rufen Sie es auf und überprüfen Sie das Ergebnis und behandeln Sie es entsprechend, damit Ihr Programm nicht in einer endlosen unbekannten Schleife hängen bleibt.

Zweitens haben Sie sich die Definition für 'FAT_GOOD_SIGN_0' und 'FAT_GOOD_SIGN_1' angesehen, um sicherzugehen, dass sie 0x55 und 0xAA erwarten?

Drittens haben Sie die Reihenfolge der Signaturbytes überprüft? FAT-32 sucht nach 0xAA55, nicht nach 0x55AA.

GSLI
quelle
Dies wurde vor vier Jahren gefragt und von einem Benutzer aufgegeben, der seit zwei Jahren nicht mehr auf der Website war. "Antworten" sollten eigentlich nicht dazu verwendet werden, klärende Fragen zu stellen, da es unwahrscheinlich ist, dass Sie eine Antwort erhalten - realistisch gesehen ist das Problem selbst wahrscheinlich längst gelöst oder aufgegeben worden.
Chris Stratton
Eigentlich Chris, das ist ein bisschen eng. Die Leute schreiben immer noch benutzerdefinierte Treiber für SD-Karten für Embedded, ohne sich auf die möglicherweise fehlerhafte Bibliothek eines anderen zu verlassen, oder andere Bibliotheken sind zu groß oder aus einem anderen Grund unzureichend. Dateisystemwissen ist eines der Dinge, die immer schwieriger zu bekommen sind, und fast jede Information ist relevant. Was ich gepostet habe, hilft möglicherweise nicht dem Originalposter, aber es kann jemand anderem helfen. Ich bin mir nicht sicher, warum Sie überhaupt einen Kommentar abgegeben haben, da Sie der Konversation technisch nichts auf nützliche Weise hinzufügen.
GSLI