FATFS - не может форматировать Drive, fr_mkfs_abortedC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 FATFS - не может форматировать Drive, fr_mkfs_aborted

Сообщение Anonymous »

Я внедряю файловую систему на флэш -памяти SPI с использованием чипа W25QXX и STM32F4XX на STM32Cubeide. Я успешно создал базовый ввод -вывод для W25 Over SPI, способный писать и читать секторы за раз. Используя f_mkfs () , затем получите свободное пространство и, наконец, откройте и закройте файл. Тем не менее, f_mkfs () продолжает возвращать fr_mkfs_aborted (ff_max_ss установлен на 16384).

Код: Выделить всё

  fresult = FR_NO_FILESYSTEM;
if (fresult == FR_NO_FILESYSTEM)
{
BYTE work[FF_MAX_SS]; // Formats the drive if it has yet to be formatted
fresult = f_mkfs("0:", FM_ANY, 0, work, sizeof work);
}

f_getfree("", &fre_clust, &pfs);

total = (uint32_t)((pfs->n_fatent - 2) * pfs->csize * 0.5);
free_space = (uint32_t)(fre_clust * pfs->csize * 0.5);

fresult = f_open(&fil, "file67.txt", FA_OPEN_ALWAYS | FA_READ | FA_WRITE);
f_puts("This data is from the FILE1.txt. And it was written using ...f_puts... ", &fil);
fresult = f_close(&fil);

fresult = f_open(&fil, "file67.txt", FA_READ);
f_gets(buffer, f_size(&fil), &fil);
f_close(&fil);
При расследовании моего ff.c кажется, что код останавливается в строке 5617:

Код: Выделить всё

if (fmt == FS_FAT12 && n_clst > MAX_FAT12) return FR_MKFS_ABORTED;    /* Too many clusters for FAT12 */
рассчитывается несколько строк перед какой -то условной логикой, в строке 5594:

Код: Выделить всё

n_clst = (sz_vol - sz_rsv - sz_fat * n_fats - sz_dir) / pau;

Вот что отладчик читает переменные, идущие как:

4294935040 , как это не знаковое, хотя фактический результат выполнения вычислений будет -32256 , если переменная была подписана. Как вы можете себе представить, это не кажется точным расчетом. Минимальный размер блока составляет 32 килобита. Если вам понадобится больше информации об использовании Flash, который я использую, страница 5 этого PDF -документа описывает все спецификации.

Код: Выделить всё

DRESULT USER_ioctl (
BYTE pdrv,      /* Physical drive number (0..) */
BYTE cmd,       /* Control code */
void *buff      /* Buffer to send/receive control data */
)
{
/* USER CODE BEGIN IOCTL */
UINT* result = (UINT*)buff;
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_SET);

switch (cmd) {
case GET_SECTOR_COUNT:
result[0] = 512; // Sector and block sizes of
return RES_OK;
case GET_SECTOR_SIZE:
result[0] = 4096;
return RES_OK;
case GET_BLOCK_SIZE:
result[0] = 32768;
return RES_OK;
}
return RES_ERROR;

/* USER CODE END IOCTL */
}
Я пробовал обезьяну, разбираясь с параметрами на f_mkfs () , обмениваясь fm_ony out for fm_fat, fm_fat32 и fm_exfat (наряду с включением exfat в моем ffconf.h file. Я также попробовал несколько значений, а не документирование, а не для Defakation. f_mkfs () Метод, который я использую, проверьте здесь.>

Подробнее здесь: https://stackoverflow.com/questions/663 ... fs-aborted
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»