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

это флаги 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

Во-первых, не делайте while () вокруг 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.