Я использую 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».
Ответы:
Вы не предоставляете достаточно своего кода, чтобы помочь отладить это, но поиск фрагментов, которые вы опубликовали, показывает, что он происходит из части библиотеки FAT16.
Глядя на вашу опубликованную таблицу разделов
это флаги 0x00, CHS 0/3/0 - CHS 238/231/57 LBA 128 - 3837952 и тип 0xb
Тип 0xb указывает на раздел FAT32, поэтому я думаю, что либо
1) ваш код отказывается смотреть на него, потому что он имеет неправильный тип раздела, или
2) маловероятно, что ваш код расстроен тем, что значения CHS не соответствуют значениям LBA.
попробуйте установить для этого типа раздела значение 0x6 (FAT16), переписать таблицу разделов с использованием нормальных значений CHS (или фиктивных значений CHS) и отформатировать раздел как FAT16.
источник
Я попробовал что-то подобное некоторое время назад и нашел библиотеки Microchip трудными. Существует системный вызов FOSS FAT PetitFAT, который я нашел очень простым для начала. (Его библиотека printf также отлично подходит для небольших встроенных платформ.) Надеюсь, это поможет.
источник
Во-первых, не делайте while () вокруг FSINit (). Это просто лень. Вызовите его, проверьте результат и обработайте его соответствующим образом, чтобы ваша программа не застряла в бесконечном неизвестном цикле.
Во-вторых, вы смотрели на определение для 'FAT_GOOD_SIGN_0' и 'FAT_GOOD_SIGN_1', чтобы убедиться, что они ожидают 0x55 и 0xAA?
В-третьих, вы проверили порядок байтов подписи? FAT-32 ищет 0xAA55, а не 0x55AA.
источник