FATFS - kann nicht formatiert werden, FR_MKFS_ABORTEDC++

Programme in C++. Entwicklerforum
Anonymous
 FATFS - kann nicht formatiert werden, FR_MKFS_ABORTED

Post by Anonymous »

Ich implementiere ein Dateisystem im SPI -Flash -Speicher mit einem W25QXX -Chip und einem STM32F4xx auf STM32Cubeid. Ich habe die grundlegende I/O für den W25 über SPI erfolgreich erstellt, um Sektoren gleichzeitig zu schreiben und zu lesen. Verwenden Sie F_MKFS () , dann den freien Speicherplatz und öffnen Sie schließlich eine Datei. F_MKFS () kehrt jedoch immer wieder FR_MKFS_ABORTED zurück (FF_MAX_SS ist auf 16384 gesetzt).

Code: Select all

  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);
Bei der Untersuchung meines ff.c scheint der Code in Zeile 5617 zu stehen:

Code: Select all

if (fmt == FS_FAT12 && n_clst > MAX_FAT12) return FR_MKFS_ABORTED;    /* Too many clusters for FAT12 */

Code: Select all

n_clst
wird vor einer bedingten Logik in Zeile 5594 berechnet:

Code: Select all

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

Here is what the debugger reads the variables going in as:
Image

This results in n_clst being set to 4294935040 , da es nicht signiert ist, obwohl das tatsächliche Ergebnis der Berechnungen -32256 beträgt, wenn die Variable unterzeichnet würde. Wie Sie sich vorstellen können, scheint dies keine genaue Berechnung zu sein. Die minimale löschbare Blockgröße beträgt 32 Kilobit. Wenn Sie weitere Informationen zu dem von mir verwendeten Flash -Chip benötigen, beschreibt Seite 5 dieses PDF -Dokuments alle Spezifikationen.

Code: Select all

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 */
}
Ich habe versucht, mit den Parametern zu f_mkfs () herumzuwählen und fm_any gegen fm_fat, fm_fat32 und fm_exfat auszutauschen (zusammen mit der Aktivierung von Exfat in meinem ffconf.h fat. F_MKFS () Methode, die ich verwende, überprüfen Sie hier einige Variationen dieser Methode.>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post