Bir PIC18F26K80 ve bir XC8 derleyicisi kullanıyorum. Bir SD kart başlatmak ve bir dosya oluşturmak çalışıyorum. Ben sadece SD kartını "FAT32" dosya sistemine ve 512 baytlık bir "Ayırma birimi boyutu" olacak şekilde biçimlendirdim. SD kartın kapasitesi 2 GB'dir. MLA Legacy sürümünden MDD kütüphanesini kullanıyorum. Benim ana şudur:
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 "FSInit ()" fonksiyonu içinde sıkışıp kalır ve fonksiyondan aldığım hata "CE_BAD_PARTITION", yani "önyükleme kaydı kötü" anlamına gelir.
"İnitIO ()" işlevi şu şekildedir:
//==============================================================================
// 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;
}
Sektör 0'ın son iki baytı önyükleme imzasıdır ve 0x55 ve 0xAA olması amaçlanmıştır ve dahil ettiğim resim bunu doğrulamaktadır. Ancak, "LoadMBR" fonksiyonunun içinde aşağıdaki kontrol yapılır:
if((Partition->Signature0 != FAT_GOOD_SIGN_0) || (Partition->Signature1 != FAT_GOOD_SIGN_1))
{
FSerrno = CE_BAD_PARTITION;
error = CE_BAD_PARTITION;
}
else
{
...
}
ve baytlar aynı olmasına rağmen ilk koşul karşılanır ve "CE_BAD_PARTITION" hatasıyla döner.