Saya menggunakan PIC18F26K80 dan kompiler XC8. Saya mencoba menginisialisasi kartu SD dan membuat file. Saya hanya memformat kartu SD pada Windows untuk memiliki sistem file "FAT32" dan "Ukuran unit alokasi" sebesar 512 byte. Kapasitas kartu SD adalah 2GB. Saya menggunakan perpustakaan MDD dari versi MLA Legacy. Utama saya adalah sebagai berikut:
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);
}
Program macet di dalam fungsi "FSInit ()" dan kesalahan yang saya dapatkan dari fungsi adalah "CE_BAD_PARTITION", yang berarti "Catatan boot buruk".
Fungsi "initIO ()" adalah sebagai berikut:
//==============================================================================
// 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;
}
Dua byte terakhir dari sektor 0 adalah tanda tangan boot dan mereka dimaksudkan untuk 0x55 dan 0xAA dan gambar yang saya sertakan mengonfirmasi hal itu. Namun, di dalam fungsi "LoadMBR", cek berikut dibuat:
if((Partition->Signature0 != FAT_GOOD_SIGN_0) || (Partition->Signature1 != FAT_GOOD_SIGN_1))
{
FSerrno = CE_BAD_PARTITION;
error = CE_BAD_PARTITION;
}
else
{
...
}
dan meskipun byte sama, kondisi pertama dipenuhi dan kembali dengan kesalahan "CE_BAD_PARTITION".