FSInit () - "CE_BAD_PARTITION" [закрито]


9

Я використовую PIC18F26K80 і компілятор XC8. Я намагаюся ініціалізувати SD-карту та створити файл. Я просто відформатував SD-карту в Windows, щоб мати файлову систему "FAT32" і "розмір одиниці розподілу" 512 байт. Ємність SD-карти становить 2 Гб. Я використовую бібліотеку 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?
Роджер Роуленд

@RogerRowland Я спробував і з FAT16, але це дало мені таку ж помилку.
user2344158

Ця схожа публікація на форумах Microchip звучить схоже. Ви це бачили?
Роджер Роуленд

@RogerRowland так, я думаю, що це той самий випадок. Але це не схоже на щось не так ... Я відредагую своє запитання
user2344158

1
Я голосую за те, щоб закрити це питання поза темою, тому що він відмовився від запитувача без подальшого пошуку рішення протягом чотирьох років.
Кріс Страттон

Відповіді:


1

Ви не надаєте достатньо свого коду, щоб допомогти налагодити це, але гугл для опублікованих вами фрагментів показує, що він надходить із частини бібліотеки 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 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, який мені здалося дуже легким. (Його накладка printf також чудово підходить для невеликих вбудованих платформ.) Сподіваюся, що це допомагає.


0

По-перше, не робіть деякий час () навколо FSINit (). Це просто ледачий. Зателефонуйте та перевірте результат та обробляйте його відповідно, щоб програма не застрягла у нескінченному невідомому циклі.

По-друге, ви подивилися на визначення для "FAT_GOOD_SIGN_0" та "FAT_GOOD_SIGN_1", щоб переконатися, що вони очікують 0x55 та 0xAA?

По-третє, ви перевірили порядок байтів підпису? FAT-32 шукає 0xAA55, а не 0x55AA.


Про це запитали чотири роки тому і відмовились користувач, який навіть два роки навіть не повертався на сайт. "Відповіді" насправді не слід використовувати для роз'яснення питань, на це навряд чи ви отримаєте відповідь - реально, сама проблема, мабуть, вже давно вирішена або відмовлена.
Кріс Страттон

Власне, Кріс, це трохи вузько. Люди все ще пишуть власні драйвери для SD-карт для вбудованих, не покладаючись на чужу, можливо, непогану бібліотеку чи інші бібліотеки, занадто великі або з інших причин недостатньо. Знання файлової системи - одна з тих речей, до яких стає важче підійти, і майже будь-який запит інформації є актуальним. Те, що я розмістив, може не допомогти оригінальному афіші, але може допомогти комусь іншому. Я не впевнений, чому ви це навіть прокоментували, оскільки технічно жодним корисним способом ви нічого не додаєте до розмови.
GSLI
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.