FSInit () - "CE_BAD_PARTITION" [बंद]


9

मैं एक 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" त्रुटि के साथ वापस आती है।


2
क्या आप सुनिश्चित हैं कि PIC FAT32 की उम्मीद कर रहे हैं और FAT16 की नहीं?
रोजर रोलैंड

@RogerRowland मैंने FAT16 के साथ भी कोशिश की लेकिन इसने मुझे वही त्रुटि दी।
user2344158

माइक्रोचिप के मंचों पर यह संबंधित पोस्ट समान लगता है। क्या आपको लगता है कि देखा है?
रोजर रोलैंड

@RogerRowland हाँ, यह वही मामला है जो मुझे लगता है। लेकिन ऐसा नहीं लगता कि कुछ गलत है ... मैं अपने प्रश्न का संपादन करूंगा
user2344158

1
मैं इस प्रश्न को ऑफ-टॉपिक के रूप में बंद करने के लिए मतदान कर रहा हूं क्योंकि यह प्रश्नकर्ता द्वारा चार साल के लिए समाधान के बिना अनुवर्ती द्वारा छोड़ दिया गया है।
क्रिस स्ट्रैटन

जवाबों:


1

आप इसे डिबग करने में मदद करने के लिए अपना पर्याप्त कोड प्रदान नहीं करते हैं, लेकिन आपके द्वारा पोस्ट किए गए टुकड़ों के लिए googling इसे FAT16 लाइब्रेरी के हिस्से से दिखा रहा है।

अपनी पोस्ट की गई विभाजन तालिका को देखते हुए

000001c0 03 00 0b e7 39 ee 80 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 | ................ |

यह झंडे 0x00, CHS 0/3/0 - CHS 238/231/57 LBA 128 - 3837952 और टाइप 0xb है

टाइप 0xb एक FAT32 विभाजन को इंगित करता है, इसलिए मेरा अनुमान या तो है

1) आपका कोड इसे देखने से इनकार कर रहा है क्योंकि इसमें गलत विभाजन प्रकार है, या

2) संभावना नहीं है, आपका कोड परेशान है कि सीएचएस मान एलबीए मूल्यों से मेल नहीं खाते हैं।

उस विभाजन प्रकार को 0x6 (FAT16) पर सेट करने का प्रयास करें, sane CHS मान (या डमी CHS मान) के साथ विभाजन तालिका को फिर से लिखना, और FAT16 के रूप में विभाजन को स्वरूपित करना।


0

मैंने कुछ समय पहले इस तरह की कोशिश की और माइक्रोचिप के पुस्तकालयों को मुश्किल पाया। एक FOSS FAT सिस्टम कॉल पेटिटफैट है जिसे मैंने जाना बहुत आसान पाया। (छोटे प्रिंटेड प्लेटफ़ॉर्म के लिए उनका प्रिंटफ़ लिब भी बढ़िया है।) आशा है कि मदद करता है।


0

सबसे पहले, FSINit () के आसपास कुछ समय () न करें। वह सिर्फ आलसी है। इसे कॉल करें और परिणाम की जांच करें और तदनुसार इसे संभालें ताकि आपका कार्यक्रम अंतहीन अज्ञात लूप में फंस न जाए।

दूसरा, क्या आपने 'FAT_GOOD_SIGN_0' और 'FAT_GOOD_SIGN_1' के लिए परिभाषित को देखा है, यह सुनिश्चित करने के लिए कि वे एक 0x55 और 0xAA की उम्मीद कर रहे हैं?

तीसरा, क्या आपने हस्ताक्षर बाइट्स के आदेश की जांच की है? FAT-32 0xAA55 की तलाश में है, न कि 0x55AA की।


यह चार साल पहले पूछा गया था और एक उपयोगकर्ता द्वारा छोड़ दिया गया था जो दो साल में भी साइट पर वापस नहीं आया है। "उत्तर" वास्तव में स्पष्ट सवाल पूछने के लिए इस्तेमाल नहीं किया जाना चाहिए, यह संभावना नहीं है कि आपको प्रतिक्रिया मिल जाएगी - वास्तविक रूप से, समस्या स्वयं हल होने या छोड़ने के बाद लंबे समय से है।
क्रिस स्ट्रैटन

वास्तव में क्रिस, यह थोड़ा संकीर्ण है। लोग अभी भी एम्बेडेड के लिए एसडी कार्ड के लिए कस्टम ड्राइवर लिख रहे हैं, किसी और के संभवतः छोटी गाड़ी पुस्तकालय या अन्य पुस्तकालयों पर भरोसा नहीं करना बहुत बड़ा है या किसी अन्य कारण के लिए अपर्याप्त है। फाइलसिस्टम ज्ञान उन चीजों में से एक है, जिनके द्वारा आना कठिन होता जा रहा है, और सूचना का लगभग कोई भी स्क्रैप प्रासंगिक है। मैंने जो पोस्ट किया है वह मूल पोस्टर की मदद नहीं कर सकता है, लेकिन यह किसी और की मदद कर सकता है। मुझे यकीन नहीं है कि आपने भी टिप्पणी क्यों की, क्योंकि आप तकनीकी रूप से किसी भी उपयोगी तरीके से बातचीत में कुछ नहीं जोड़ रहे हैं।
GSLI
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.