Tôi đang sử dụng PIC18F26K80 và trình biên dịch XC8. Tôi đang cố gắng khởi tạo thẻ SD và tạo một tệp. Tôi chỉ đơn giản là định dạng thẻ SD trên Windows để có hệ thống tệp "FAT32" và "Kích thước đơn vị phân bổ" là 512 byte. Dung lượng của thẻ SD là 2GB. Tôi đang sử dụng thư viện MDD từ phiên bản MLA Legacy. Chính của tôi là như sau:
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);
}
Chương trình bị kẹt bên trong chức năng "FSInit ()" và lỗi tôi gặp phải từ chức năng là "CE_BAD_PARTITION", có nghĩa là "Bản ghi khởi động bị lỗi".
Hàm "initIO ()" như sau:
//==============================================================================
// 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;
}
Hai byte cuối cùng của sector 0 là chữ ký khởi động và chúng có nghĩa là 0x55 và 0xAA và hình ảnh tôi đưa vào xác nhận điều đó. Tuy nhiên, bên trong chức năng "LoadMBR", kiểm tra sau đây được thực hiện:
if((Partition->Signature0 != FAT_GOOD_SIGN_0) || (Partition->Signature1 != FAT_GOOD_SIGN_1))
{
FSerrno = CE_BAD_PARTITION;
error = CE_BAD_PARTITION;
}
else
{
...
}
và mặc dù các byte giống nhau, điều kiện đầu tiên được đáp ứng và nó trả về với lỗi "CE_BAD_PARTATION".