मैं एक PIC18F26K80 और एक XC8 संकलक का उपयोग कर रहा हूं। मैं एक एसडी कार्ड को इनिशियलाइज़ करने और एक फाइल बनाने की कोशिश कर रहा हूँ। मैंने विंडोज़ पर "FAT32" फाइल सिस्टम और 512 बाइट्स के "एलोकेशन यूनिट साइज" के लिए एसडी कार्ड को फॉर्मेट किया है। एसडी कार्ड की क्षमता 2GB है। मैं MLA लिगेसी संस्करण से MDD लाइब्रेरी का उपयोग कर रहा हूं। मेरा मुख्य निम्नलिखित है:
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);
}
कार्यक्रम "FSInit ()" और फ़ंक्शन से प्राप्त होने वाली त्रुटि "CE_BAD_PARTITION" के अंदर अटक जाती है, जिसका अर्थ है "बूट रिकॉर्ड खराब है"।
"InitIO ()" फ़ंक्शन निम्न है:
//==============================================================================
// 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;
}
सेक्टर 0 के अंतिम दो बाइट्स बूट सिग्नेचर हैं और वे 0x55 और 0xAA के हैं और जिस तस्वीर को मैंने शामिल किया है, वह पुष्टि करता है। हालाँकि, फ़ंक्शन "LoadMBR" के अंदर निम्न जाँच की जाती है:
if((Partition->Signature0 != FAT_GOOD_SIGN_0) || (Partition->Signature1 != FAT_GOOD_SIGN_1))
{
FSerrno = CE_BAD_PARTITION;
error = CE_BAD_PARTITION;
}
else
{
...
}
और हालांकि बाइट्स वही हैं जो पहली शर्त पूरी की जाती है और यह "CE_BAD_PARTITION" त्रुटि के साथ वापस आती है।