FSInit () - "CE_BAD_PARTITION" [বন্ধ]


9

আমি একটি পিক 18 এফ 26 কে 80 এবং একটি এক্সসি 8 সংকলক ব্যবহার করছি। আমি একটি এসডি কার্ড আরম্ভ করার জন্য এবং একটি ফাইল তৈরি করার চেষ্টা করছি। আমি উইন্ডোজটিতে "FAT32" ফাইল সিস্টেম এবং 512 বাইটের একটি "বরাদ্দ ইউনিটের আকার" রাখতে সহজভাবে এসডি কার্ডটি ফর্ম্যাট করেছি। এসডি কার্ডের ধারণক্ষমতা 2 জিবি। আমি এমডিডি লাইব্রেরিটি বিধায়ক লেগ্যাসি সংস্করণ থেকে ব্যবহার করছি। আমার প্রধানটি নিম্নলিখিত:

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 এবং আমি যে ছবিটি অন্তর্ভুক্ত করেছি তা নিশ্চিত করে। তবে "লোডএমবিআর" ফাংশনের ভিতরে নিম্নলিখিত চেকটি করা হয়েছে:

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
আপনি কি নিশ্চিত যে পিআইসি FAT32 প্রত্যাশা করছে এবং FAT16 নয়?
রজার রোল্যান্ড

পছন্দ করেছেন
ব্যবহারকারী 2344158

মাইক্রোচিপের ফোরামে সম্পর্কিত এই পোস্টটি একই রকম মনে হচ্ছে। আপনি কি তা দেখেছেন?
রজার রোল্যান্ড

@ রোজাররোল্যান্ড হ্যাঁ, আমি মনে করি এটি একই ঘটনা। তবে দেখে মনে হচ্ছে কিছু ভুল হয়েছে ... আমি আমার প্রশ্নটি সম্পাদনা করব
user2344158

1
আমি এই প্রশ্নটিকে অফ-টপিক হিসাবে বন্ধ করার পক্ষে ভোট দিচ্ছি কারণ এটি চার বছর ধরে কোনও সমাধানের দিকে ফলো-আপ না করেই প্রশ্নকর্তা ত্যাগ করেছেন।
ক্রিস স্ট্রাটন

উত্তর:


1

এটির ডিবাগ করার জন্য আপনি আপনার কোডের যথেষ্ট পরিমাণ সরবরাহ করেন না, তবে আপনার পোস্ট করা টুকরোগুলির জন্য গুগলিং এটি FAT16 লাইব্রেরির অংশ থেকে আসে।

আপনার পোস্ট বিভাজন টেবিল তাকান

000001c0 03 00 0 বি e7 39 ই 80 00 00 00 00 90 3 এ 00 00 00 | .... 9 .......: ... |
000001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ | |

এটি পতাকা 0x00, সিএইচএস 0/3/0 - সিএইচএস 238/231/57 এলবিএ 128 - 3837952 এবং টাইপ 0xb

টাইপ 0xb একটি FAT32 পার্টিশন নির্দেশ করে, তাই আমার অনুমান হয় হয়

1) আপনার কোডটি এটি দেখতে অস্বীকার করছে কারণ এতে ভুল পার্টিশন টাইপ রয়েছে, বা

2) অসম্ভব, আপনার কোডটি বিচলিত যে সিএইচএস মানগুলি এলবিএ মানগুলির সাথে মেলে না।

পার্টিশনটি টাইপ 0x6 (FAT16) এ সেট করার চেষ্টা করুন, পার্টিশন টেবিলকে বুদ্ধিমান সিএইচএস মান (বা ডামি সিএইচএস মান) দিয়ে আবার লিখুন এবং পার্টিশনটি FAT16 হিসাবে ফর্ম্যাট করুন।


0

আমি কিছুক্ষণ আগে এরকম কিছু চেষ্টা করেছি এবং মাইক্রোচিপের লাইব্রেরিগুলিকে কঠিন বলেছি। পেটিটএফএটি কল একটি ফসস ফ্যাট সিস্টেম রয়েছে যা আমি খুব সহজ পেয়েছি। (তার প্রিন্টফ লিব ছোট এম্বেড থাকা প্ল্যাটফর্মগুলির জন্যও দুর্দান্ত)) আশা করি এটি সহায়তা করে।


0

প্রথমে, FSINit () এর চারপাশে কিছুক্ষণ () করবেন না। এটাই অলস। এটিকে কল করুন এবং ফলাফলটি যাচাই করুন এবং সেই অনুযায়ী পরিচালনা করুন যাতে আপনার প্রোগ্রামটি অন্তহীন অজানা লুপে আটকে না যায়।

দ্বিতীয়ত, আপনি কি 'এফএইএসওগুডিএসআইজিএন_0' এবং 'এফএইএইচইউজিডিএসআইজিএন_1' এর জন্য একটি 0x55 এবং 0xAA প্রত্যাশা করছেন তা নিশ্চিত করার সংজ্ঞাটি দেখেছেন?

তৃতীয়, আপনি স্বাক্ষর বাইটের ক্রম পরীক্ষা করেছেন? FAT-32 0xAA55 খুঁজছেন, 0x55AA নয়।


এটি চার বছর আগে জিজ্ঞাসা করা হয়েছিল এবং এমন এক ব্যবহারকারী দ্বারা পরিত্যক্ত করা হয়েছিল যিনি দুই বছরেও সাইটে ফিরে আসেননি। "উত্তরগুলি" আসলে পরিষ্কারভাবে প্রশ্ন জিজ্ঞাসা করার জন্য ব্যবহার করা হয় বলে মনে করা হয় না, তবে এটির কোনও প্রতিক্রিয়া আপনার পক্ষে পাওয়া সম্ভব নয় - বাস্তববাদী, সমস্যাটি নিজে থেকেই সম্ভবত সমাধান হওয়া বা পরিত্যাজ্য হওয়ার অনেক আগে থেকেই।
ক্রিস স্ট্রাটন

আসলে ক্রিস, এটি কিছুটা সরু। এম্বেডের জন্য লোকেরা এখনও এসডি কার্ডের জন্য কাস্টম ড্রাইভার লিখছেন, অন্য কারও সম্ভবত বগি লাইব্রেরি বা অন্যান্য গ্রন্থাগারগুলির উপর নির্ভর না করে খুব বড় বা অন্য কোনও কারণে অপ্রতুল। ফাইল সিস্টেম জ্ঞান হ'ল সেই জিনিসগুলির মধ্যে একটি যা শক্ত হয়ে আসছে এবং প্রায় কোনও তথ্য স্ক্র্যাপই প্রাসঙ্গিক। আমি যা পোস্ট করেছি তা মূল পোস্টারটিকে সহায়তা নাও করতে পারে তবে এটি অন্য কাউকে সাহায্য করতে পারে। আপনি কেন মন্তব্য করেছিলেন তা আমি নিশ্চিত নই, যেহেতু আপনি কোনও কার্যকর উপায়ে প্রযুক্তিগতভাবে কথোপকথনে কোনও কিছুই যোগ করছেন না।
জিএসএলআই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.