FSInit () -“ CE_BAD_PARTITION” [ปิด]


9

ฉันใช้ PIC18F26K80 และคอมไพเลอร์ XC8 ฉันพยายามเริ่มต้นการ์ด SD และสร้างไฟล์ ฉันเพิ่งฟอร์แมตการ์ด SD บน Windows เพื่อให้มีระบบไฟล์ "FAT32" และ "ขนาดหน่วยการจัดสรร" ที่ 512 ไบต์ ความจุของการ์ด SD คือ 2GB ฉันใช้ไลบรารี MDD จากรุ่น MLA Legacy หลักของฉันคือต่อไปนี้:

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
Roger Rowland

@RogerRowland ฉันลองกับ FAT16 เช่นกัน แต่มันทำให้ฉันมีข้อผิดพลาดเหมือนกัน
user2344158

โพสต์ที่เกี่ยวข้องในฟอรัมของ Microchip ฟังดูคล้ายกัน คุณเคยเห็นสิ่งนั้นไหม?
Roger Rowland

@RogerRowland ใช่มันเป็นกรณีเดียวกันฉันคิดว่า แต่ดูเหมือนว่ามีบางอย่างผิดปกติ ... ฉันจะแก้ไขคำถามของฉัน
user2344158

1
ฉันลงคะแนนเพื่อปิดคำถามนี้เป็นหัวข้อนอกเพราะผู้ถามถูกยกเลิกโดยไม่ติดตามผลการแก้ไขเป็นเวลาสี่ปี
Chris Stratton

คำตอบ:


1

คุณไม่ได้ให้รหัสเพียงพอที่จะช่วยในการแก้ไขปัญหานี้ แต่ googling สำหรับชิ้นส่วนที่คุณโพสต์แสดงว่ามาจากส่วนหนึ่งของห้องสมุด FAT16

ดูตารางพาร์ทิชันที่โพสต์ของคุณ

000001c0 03 00 0b e7 39 ee 80 00 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) ไม่น่าเป็นไปได้รหัสของคุณไม่พอใจที่ค่า CHS ไม่ตรงกับค่า LBA

ลองตั้งค่าประเภทพาร์ติชันนั้นเป็น 0x6 (FAT16) เขียนตารางพาร์ติชันอีกครั้งด้วยค่า CHS (หรือค่าตัวแทน CHS) และจัดรูปแบบพาร์ติชันเป็น FAT16


0

ฉันลองอะไรทำนองนี้เมื่อไม่นานมานี้และพบว่าห้องสมุดของ Microchip นั้นยาก มีระบบ FOSS FAT เรียกPetitFATซึ่งฉันพบว่าง่ายมากที่จะไป (lib printf ของเขายังยอดเยี่ยมสำหรับแพลตฟอร์มแบบฝังขนาดเล็ก) หวังว่าจะช่วยได้


0

ก่อนอื่นอย่าดำเนินการสักครู่ () รอบ ๆ FSINit () นั่นขี้เกียจ โทรหาและตรวจสอบผลลัพธ์และจัดการตามลำดับเพื่อให้โปรแกรมของคุณไม่ติดขัดในวงวนไม่รู้จบ

ประการที่สองคุณได้ดูคำจำกัดความของ 'FAT_GOOD_SIGN_0' และ 'FAT_GOOD_SIGN_1' เพื่อให้แน่ใจว่าพวกเขาคาดหวังว่า 0x55 และ 0xAA หรือไม่

ข้อสามคุณตรวจสอบคำสั่งของลายเซ็นไบต์หรือไม่ FAT-32 กำลังค้นหา 0xAA55 ไม่ใช่ 0x55AA


คำถามนี้ถูกถามเมื่อสี่ปีก่อนและถูกทอดทิ้งโดยผู้ใช้ที่ไม่ได้กลับไปที่เว็บไซต์อีกในสองปี "คำตอบ" ไม่ควรนำมาใช้เพื่อถามคำถามที่ชัดเจนซึ่งไม่น่าเป็นไปได้ว่าคุณจะได้รับการตอบกลับ - ตามความเป็นจริงปัญหาของตัวเองอาจจะยาวนานตั้งแต่ถูกแก้ไขหรือถูกทอดทิ้ง
Chris Stratton

จริงๆแล้วคริสนั่นมันแคบไปหน่อย ผู้คนยังคงเขียนไดรเวอร์แบบกำหนดเองสำหรับการ์ด SD เพื่อฝังตัว แต่ไม่ต้องพึ่งพาห้องสมุดที่มีขนาดใหญ่เกินไปหรือห้องสมุดอื่น ๆ ที่มีขนาดใหญ่เกินไปหรือด้วยเหตุผลอื่นที่ไม่เพียงพอ ความรู้เกี่ยวกับระบบไฟล์เป็นหนึ่งในสิ่งเหล่านั้นที่กำลังจะเกิดขึ้นโดยยากและข้อมูลส่วนใหญ่ที่เกี่ยวข้องนั้น สิ่งที่ฉันโพสต์อาจไม่ช่วยโปสเตอร์ต้นฉบับ แต่อาจช่วยคนอื่นได้ ฉันไม่แน่ใจว่าทำไมคุณถึงแสดงความคิดเห็นเนื่องจากคุณไม่ได้เพิ่มอะไรในการสนทนาทางเทคนิคในทางที่เป็นประโยชน์ใด ๆ
GSLI
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.