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.