FSInit () - Nhật ký CE_BAD_PARTITION '[đã đóng]


9

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


2
Bạn có chắc chắn PIC đang mong đợi FAT32 chứ không phải FAT16?
Roger Rowland

@RogerRowland Tôi cũng đã thử với FAT16 nhưng nó cũng cho tôi lỗi tương tự.
dùng2344158

Bài đăng liên quan này trên diễn đàn của Microchip nghe có vẻ tương tự. Bạn đã thấy điều đó?
Roger Rowland

@RogerRowland vâng đó là trường hợp tương tự tôi nghĩ. Nhưng có vẻ như không có gì đó không ổn ... Tôi sẽ chỉnh sửa câu hỏi của mình
user2344158 06/07/2015

1
Tôi đang bỏ phiếu để đóng câu hỏi này ngoài chủ đề vì nó đã bị người hỏi bỏ rơi mà không theo dõi giải pháp trong bốn năm.
Chris Stratton

Câu trả lời:


1

Bạn không cung cấp đủ mã của mình để giúp gỡ lỗi này, nhưng việc tìm kiếm các đoạn bạn đã đăng cho thấy nó đến từ một phần của thư viện FAT16.

Nhìn vào bảng phân vùng đã đăng của bạn

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

đó là cờ 0x00, CHS 0/3/0 - CHS 238/231/57 LBA 128 - 3837952 và gõ 0xb

loại 0xb chỉ ra phân vùng FAT32, vì vậy tôi đoán là

1) mã của bạn đang từ chối xem nó bởi vì nó có loại phân vùng sai, hoặc

2) không có khả năng, mã của bạn buồn vì các giá trị CHS không khớp với các giá trị LBA.

hãy thử đặt loại phân vùng đó thành 0x6 (FAT16), viết lại bảng phân vùng với các giá trị CHS lành mạnh (hoặc các giá trị CHS giả) và định dạng phân vùng là FAT16.


0

Tôi đã thử một cái gì đó như thế này một thời gian trước và thấy thư viện của Microchip rất khó. Có một hệ thống FOSS FAT gọi là PetitFAT mà tôi thấy rất dễ để đi. (Lib printf của anh ấy cũng tuyệt vời cho các nền tảng nhúng nhỏ.) Hy vọng rằng sẽ giúp.


0

Đầu tiên, đừng làm một lúc () xung quanh FSINit (). Đó chỉ là lười biếng. Gọi cho nó và kiểm tra kết quả và xử lý nó cho phù hợp để chương trình của bạn không bị kẹt trong một vòng lặp vô tận.

Thứ hai, bạn đã xem định nghĩa cho 'FAT_GOOD_SIGN_0' và 'FAT_GOOD_SIGN_1' để chắc chắn rằng họ đang mong đợi 0x55 và 0xAA chưa?

Thứ ba, bạn đã kiểm tra thứ tự của các byte chữ ký chưa? FAT-32 đang tìm kiếm 0xAA55, không phải 0x55AA.


Điều này đã được hỏi bốn năm trước và bị bỏ rơi bởi một người dùng thậm chí đã không quay lại trang web trong hai năm. "Câu trả lời" không thực sự được sử dụng để đặt câu hỏi làm rõ, rất có thể bạn sẽ không nhận được câu trả lời - thực tế, vấn đề có lẽ đã được giải quyết hoặc từ bỏ từ lâu.
Chris Stratton

Thật ra Chris, đó là một chút hẹp. Mọi người vẫn đang viết trình điều khiển tùy chỉnh cho thẻ SD để nhúng, không dựa vào thư viện có thể có lỗi của người khác hoặc các thư viện khác quá lớn hoặc vì một số lý do khác không thỏa đáng. Kiến thức về hệ thống tập tin là một trong những điều ngày càng khó thực hiện và hầu như mọi thông tin đều có liên quan. Những gì tôi đăng có thể không giúp ích cho poster gốc, nhưng nó có thể giúp người khác. Tôi không chắc tại sao bạn thậm chí còn nhận xét, vì bạn không thêm gì vào cuộc hội thoại về mặt kỹ thuật theo bất kỳ cách hữu ích nào.
GSLI
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.