FSInit () - “CE_BAD_PARTITION” [ditutup]

9

Saya menggunakan PIC18F26K80 dan kompiler XC8. Saya mencoba menginisialisasi kartu SD dan membuat file. Saya hanya memformat kartu SD pada Windows untuk memiliki sistem file "FAT32" dan "Ukuran unit alokasi" sebesar 512 byte. Kapasitas kartu SD adalah 2GB. Saya menggunakan perpustakaan MDD dari versi MLA Legacy. Utama saya adalah sebagai berikut:

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 macet di dalam fungsi "FSInit ()" dan kesalahan yang saya dapatkan dari fungsi adalah "CE_BAD_PARTITION", yang berarti "Catatan boot buruk".

Fungsi "initIO ()" adalah sebagai berikut:

//==============================================================================
// 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;
}

Dua byte terakhir dari sektor 0 adalah tanda tangan boot dan mereka dimaksudkan untuk 0x55 dan 0xAA dan gambar yang saya sertakan mengonfirmasi hal itu. Namun, di dalam fungsi "LoadMBR", cek berikut dibuat:

if((Partition->Signature0 != FAT_GOOD_SIGN_0) || (Partition->Signature1 != FAT_GOOD_SIGN_1))
{
    FSerrno = CE_BAD_PARTITION;
    error = CE_BAD_PARTITION;
}
else
{
    ...
}

dan meskipun byte sama, kondisi pertama dipenuhi dan kembali dengan kesalahan "CE_BAD_PARTITION".

pengguna2344158
sumber
2
Apakah Anda yakin PIC mengharapkan FAT32 dan bukan FAT16?
Roger Rowland
@RogerRowland Saya mencoba dengan FAT16 juga tetapi itu memberi saya kesalahan yang sama.
user2344158
Posting terkait ini di forum Microchip terdengar serupa. Pernahkah Anda melihatnya?
Roger Rowland
@RogerRowland ya itu adalah kasus yang sama saya pikir. Tapi sepertinya tidak ada yang salah ... Saya akan mengedit pertanyaan saya
user2344158
1
Saya memberikan suara untuk menutup pertanyaan ini sebagai di luar topik karena telah ditinggalkan oleh penanya tanpa menindaklanjuti solusi selama empat tahun.
Chris Stratton

Jawaban:

1

Anda tidak menyediakan cukup kode untuk membantu men-debug ini, tetapi googling untuk fragmen yang telah Anda unggah menunjukkan bahwa itu berasal dari bagian perpustakaan FAT16.

Melihat tabel partisi yang Anda posting

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 00 | ................ |

itu adalah flag 0x00, CHS 0/3/0 - CHS 238/231/57 LBA 128 - 3837952 dan ketik 0xb

tipe 0xb mengindikasikan partisi FAT32, jadi tebakan saya juga

1) kode Anda menolak untuk melihatnya karena memiliki jenis partisi yang salah, atau

2) tidak mungkin, kode Anda kesal karena nilai CHS tidak cocok dengan nilai LBA.

coba atur tipe partisi itu ke 0x6 (FAT16), tulis ulang tabel partisi dengan nilai CHS yang waras (atau nilai CHS dummy), dan format partisi sebagai FAT16.

james
sumber
0

Saya mencoba sesuatu seperti ini beberapa waktu lalu dan menemukan perpustakaan Microchip sulit. Ada panggilan sistem FOSS FAT PetitFAT yang saya temukan sangat mudah untuk pergi. (Lib printf-nya juga bagus untuk platform tertanam kecil.) Harapan yang membantu.

danmcb
sumber
0

Pertama, jangan lakukan sementara () di sekitar FSINit (). Itu hanya malas. Sebut dan periksa hasilnya dan tangani sesuai sehingga program Anda tidak macet dalam satu lingkaran yang tidak diketahui.

Kedua, apakah Anda melihat definisi untuk 'FAT_GOOD_SIGN_0' dan 'FAT_GOOD_SIGN_1' untuk memastikan mereka mengharapkan 0x55 dan 0xAA?

Ketiga, sudahkah Anda memeriksa urutan byte tanda tangan? FAT-32 mencari 0xAA55, bukan 0x55AA.

GSLI
sumber
Ini ditanyakan empat tahun lalu dan ditinggalkan oleh pengguna yang bahkan belum kembali ke situs dalam dua tahun. "Jawaban" tidak seharusnya digunakan untuk mengajukan pertanyaan klarifikasi, karena kemungkinan besar Anda tidak akan mendapatkan jawaban - secara realistis, masalah itu sendiri mungkin sudah lama dipecahkan atau ditinggalkan.
Chris Stratton
Sebenarnya Chris, itu agak sempit. Orang-orang masih menulis driver khusus untuk kartu SD untuk dibenamkan, tidak bergantung pada perpustakaan orang lain yang mungkin bermasalah atau perpustakaan lain yang terlalu besar atau karena alasan lain tidak memadai. Pengetahuan sistem file adalah salah satu hal yang semakin sulit didapat, dan hampir semua memo informasi relevan. Apa yang saya posting mungkin tidak membantu poster aslinya, tetapi mungkin membantu orang lain. Saya tidak yakin mengapa Anda berkomentar, karena Anda tidak menambahkan apa pun ke percakapan secara teknis dengan cara apa pun yang bermanfaat.
GSLI