Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 17.05.2017
Сообщений: 10
1

FatFS форматирование QSPI Flash

25.06.2020, 05:55. Просмотров 270. Ответов 9

Всем привет.
Я пытаюсь создать Fat систему на QSPI flash S25FL127 для микроконтроллера ATSAME70Q21. Я использую FatFS версии ff14.
Если с SD картой, которая отформатирована на PC все работает, то QSPI flash приходится форматировать с помощью функции f_mkfs из пакета FatFS. Форматирование прошло успешно, монтирование раздела тоже успешно, но когда пытаюсь открыть рут директорию или создать файл возникает ошибка (2) Assertion failed.
При форматировании использую следующие параметры:
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    
#define DATA_SIZE 4096  
static uint8_t data_buffer[DATA_SIZE];
 
MKFS_PARM   param;
param.align=0;          //Data area alignment (sector)
param.au_size=512;      //Cluster size (byte)
param.fmt=FM_FAT;       //Format option (FM_FAT, FM_FAT32, FM_EXFAT and FM_SFD)
param.n_fat=1;          //Number of FATs
param.n_root=1;         //Number of root directory entries
        
res = f_mkfs(   "SD",           //const TCHAR* path-Logical drive number 
            &param,         //MKFS_PARM opt- Format option 
            data_buffer,            //void* work-Pointer to working buffer 
            DATA_SIZE);     //UINT len- Size of working buffer
В чем причина возникновения этой ошибки?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.06.2020, 05:55
Ответы с готовыми решениями:

stm32f373 + flash(at25df081) + fatFs
Добрый день, прошу помочь всех знатоков. Хочу смонтировать раздел с помощью fatfs, возвращает...

STM32F4Discovery аудио USB Flash Drive HAL CubeMX FATFS
Здравствуйте! Пробую написать аудиоплеер, который считывает песню с флешки (с помощью FATFS) и...

STM32: FatFS & USB Host & Flash - проблемы с чтением/записью
Уважаемые гуру! Ломаю голову, но найти разумное объяснение симптомам не могу. Есть...

Решено. Форматирование USB Flash в HTFS
Нужно отформатировать флешку в NTFS, стандартными средствами не получается. В Fat32 форматируется...

9
Эксперт .NET
6867 / 4469 / 1074
Регистрация: 25.05.2015
Сообщений: 13,677
Записей в блоге: 14
25.06.2020, 06:07 2
Например, стека не хватает.
Надо отладчиком проходить функцию, вызвавшую assert, и искать причину.
0
0 / 0 / 0
Регистрация: 17.05.2017
Сообщений: 10
25.06.2020, 06:35  [ТС] 3
Причина в том, что в структуре FATFS поле (LBA_t dirbase; /* Root directory base sector/cluster */) равно нулю.
Получается, что функция f_mkfs его не задает?
Его нужно задавать в ручную?
0
Эксперт .NET
6867 / 4469 / 1074
Регистрация: 25.05.2015
Сообщений: 13,677
Записей в блоге: 14
25.06.2020, 07:28 4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
  FATFS fs;
  FIL file;
  uint32_t bytesCounter = 0;
  FRESULT res;
  char path[4] = { '\0', '\0', '\0', '\0' };
  uint8_t buffer[512];
  bool result = false;
 
  if (f_mount(&fs, path, 1) == FR_OK) {
    f_mount(nullptr, path, 0);
  } else {
    if (f_mkfs(path, FM_ANY | FM_SFD, 512, buffer, sizeof(buffer)) == FR_OK) {
      if (f_setlabel("MYLABEL") == FR_OK) {
      }
    }
  }
 
  if (f_mount(&fs, path, 1) == FR_OK) {
    if (f_open(&file, "README.TXT", FA_CREATE_ALWAYS | FA_WRITE) == FR_OK) {
      uint32_t counter = 0;
      const char *pReadme = readmeFileContent;
      uint32_t length = strlen(pReadme);
 
      while (counter < length) {
        uint32_t len = length - counter;
 
        if (len > 512u) {
          len = 512u;
        }
 
        if (f_write(&file, pReadme, len, (UINT *)&bytesCounter) == FR_OK) {
        }
 
        pReadme += len;
        counter += len;
      }
 
      f_close(&file);
      result = true;
    }
 
    f_mount(nullptr, path, 0);
  }
 
  return result;
Добавлено через 3 минуты
FatFS 0.13a от 2017-10-27
0
1779 / 1109 / 109
Регистрация: 04.01.2010
Сообщений: 3,892
25.06.2020, 09:39 5
возможно, что драйвер этой флеши не правильно настроен в работе с FatFS. вторая должная учитывать размеры стирания секторов. Обычно в этом основная загвоздка - при переписывании FLASH происходит стирание большего региона чем ожидается.
1
0 / 0 / 0
Регистрация: 17.05.2017
Сообщений: 10
29.06.2020, 05:53  [ТС] 6
Действительно баг оказался в драйвере flash. Так как готового драйвера я не нашел, то написал сам.
Вот текст функции записи:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
uint8_t s25fl1_ram_2_mem(uint32_t addr, const void *ram)
{
    uint8_t * ram_buf= ram;
    uint32_t mem_addr=addr*S25FL1_SECTOR_SIZE;
    S25FL1D_QuadMode(ENABLE);
    uint32_t erase_sector_addr=(mem_addr>>12)<<12;
    if(S25FL1D_ReadQuadIO((uint32_t*)erase_sector_buf, erase_sector_size, erase_sector_addr, 0, 0)) 
        return CTRL_FAIL;
    for(int i=0;i<S25FL1_SECTOR_SIZE;i++)
    {
        erase_sector_buf[i+mem_addr-erase_sector_addr]=ram_buf[i];
    }
    
    if(S25FL1D_EraseSector(erase_sector_addr))  return CTRL_FAIL;
    if(S25FL1D_Write((uint32_t*)erase_sector_buf, erase_sector_size, erase_sector_addr, 0)) return CTRL_FAIL;
    
    if(S25FL1D_ReadQuadIO((uint32_t*)check_sector_buf, erase_sector_size, erase_sector_addr, 0, 0)) 
       return CTRL_FAIL;    
    for(int i=0;i<erase_sector_size;i++)
    {
        if(check_sector_buf[i]!=erase_sector_buf[i])
        {
            return CTRL_FAIL;
        }
    }
    return CTRL_GOOD;
}
Стирается сектор 4 кБ, а записываем 512 байт.
При проверке записанного выявилась ошибка.
0
Эксперт .NET
6867 / 4469 / 1074
Регистрация: 25.05.2015
Сообщений: 13,677
Записей в блоге: 14
29.06.2020, 06:50 7
Цитата Сообщение от MYA Посмотреть сообщение
C
1
uint32_t erase_sector_addr=(mem_addr>>12)<<12;
C
1
erase_sector_addr = mem_addr & 0xfffff000ul;
Если вы будете записывать блоками меньше стираемого, то убьёте флеш в соответствующее число раз быстрее.
0
0 / 0 / 0
Регистрация: 17.05.2017
Сообщений: 10
29.06.2020, 08:12  [ТС] 8
Попробовал вариант с сектором 4096 байт:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
uint8_t s25fl1_ram_2_mem(uint32_t addr, const void *ram)
{
    uint8_t * ram_buf= ram;
    uint32_t mem_addr=addr*S25FL1_SECTOR_SIZE;
    S25FL1D_QuadMode(ENABLE);
    if(S25FL1D_EraseSector(mem_addr))   return CTRL_FAIL;
    if(S25FL1D_Write((uint32_t*)ram_buf, S25FL1_SECTOR_SIZE, mem_addr, 0)) return CTRL_FAIL;
    
    if(S25FL1D_ReadQuadIO((uint32_t*)check_sector_buf, S25FL1_SECTOR_SIZE, mem_addr, 0, 0)) return CTRL_FAIL;   
    for(int i=0;i<S25FL1_SECTOR_SIZE;i++)
    {
        if(check_sector_buf[i]!=ram_buf[i])
        {
            printf("check_sector_buf[%i]=%i\n\r",i,check_sector_buf[i]);
            printf("ram_buf[%i]=%i\n\r",i,ram_buf[i]);
            return CTRL_FAIL;
        }
    }
    return CTRL_GOOD;
Возникает та-же ошибка (2) Assertion failed, а проблемы с записью в первом варианте возникали только в режиме JTAG отладки.
0
Эксперт .NET
6867 / 4469 / 1074
Регистрация: 25.05.2015
Сообщений: 13,677
Записей в блоге: 14
29.06.2020, 08:13 9
Цитата Сообщение от MYA Посмотреть сообщение
Возникает та-же ошибка (2) Assertion failed
Памяти наверно не хватает? Пошагово ищите, на чём вылетает assert.
0
0 / 0 / 0
Регистрация: 17.05.2017
Сообщений: 10
29.06.2020, 11:56  [ТС] 10
Обнаружил, что в функции move_window (ff.c)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
static FRESULT move_window (    /* Returns FR_OK or FR_DISK_ERR */
    FATFS* fs,      /* Filesystem object */
    LBA_t sect      /* Sector LBA to make appearance in the fs->win[] */
)
{
    FRESULT res = FR_OK;
 
 
    if (sect != fs->winsect) {  /* Window offset changed? */
#if !FF_FS_READONLY
        res = sync_window(fs);      /* Flush the window */
#endif
        if (res == FR_OK) {         /* Fill sector window with new data */
            if (disk_read(fs->pdrv, fs->win, sect, 1) != RES_OK) {
                sect = (LBA_t)0 - 1;    /* Invalidate window if read data is not valid */               
                res = FR_DISK_ERR;
                ff_DEBUGF(res);
            }
            fs->winsect = sect;
        }
    }
    return res;
}
после вызова функции disk_read(fs->pdrv, fs->win, sect, 1) меняется содержимое static FATFS* FatFs[FF_VOLUMES];
поля dirbase /* Root directory base sector/cluster */ и database; /* Data base sector */ становятся равны нулю.
После этого и возникает ошибка (2) Assertion failed
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.06.2020, 11:56

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Flash форматирование
У мну случилась беда...умерла моя флешка, но не совсем! проанализировав ее состояние я увидел, что...

Форматирование usb-flash
Здравствуйте. Хочу отфармотировать флешку, но выдает ошибку &quot;диск защищен от записи&quot;. вот, что смог...

Форматирование Flash-накопителей в файловую систему FAT
Возникла необходимость форматирования flash-носителей (в FAT) как функция программы. Как это можно...

Windows не удается завершить форматирование" / Flash-накопители
Всем привет... У меня такая проблема вставил сегодня флешку в компьютер и произашла такая беда.......

RichEdit или RTF форматирование текста, а лучше HTML форматирование
Привет формучани. Подскажите бесплатный компонент который позволил бы выводить текст в формате...

FATFS и HardFault
Доброго времени суток! Играюсь с LPC1769 (ARM M3). точнее прикручиваю Fat_FS. В процессе...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.