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".
Jawaban:
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
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.
sumber
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.
sumber
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.
sumber