Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 17.05.2017
Сообщений: 10

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

25.06.2020, 05:55. Показов 4671. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.06.2020, 05:55
Ответы с готовыми решениями:

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

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

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

9
Эксперт .NET
 Аватар для Rius
13027 / 7592 / 1662
Регистрация: 25.05.2015
Сообщений: 23,096
Записей в блоге: 14
25.06.2020, 06:07
Например, стека не хватает.
Надо отладчиком проходить функцию, вызвавшую assert, и искать причину.
0
0 / 0 / 0
Регистрация: 17.05.2017
Сообщений: 10
25.06.2020, 06:35  [ТС]
Причина в том, что в структуре FATFS поле (LBA_t dirbase; /* Root directory base sector/cluster */) равно нулю.
Получается, что функция f_mkfs его не задает?
Его нужно задавать в ручную?
0
Эксперт .NET
 Аватар для Rius
13027 / 7592 / 1662
Регистрация: 25.05.2015
Сообщений: 23,096
Записей в блоге: 14
25.06.2020, 07:28
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
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
25.06.2020, 09:39
возможно, что драйвер этой флеши не правильно настроен в работе с FatFS. вторая должная учитывать размеры стирания секторов. Обычно в этом основная загвоздка - при переписывании FLASH происходит стирание большего региона чем ожидается.
1
0 / 0 / 0
Регистрация: 17.05.2017
Сообщений: 10
29.06.2020, 05:53  [ТС]
Действительно баг оказался в драйвере 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
 Аватар для Rius
13027 / 7592 / 1662
Регистрация: 25.05.2015
Сообщений: 23,096
Записей в блоге: 14
29.06.2020, 06:50
Цитата Сообщение от 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  [ТС]
Попробовал вариант с сектором 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
 Аватар для Rius
13027 / 7592 / 1662
Регистрация: 25.05.2015
Сообщений: 23,096
Записей в блоге: 14
29.06.2020, 08:13
Цитата Сообщение от MYA Посмотреть сообщение
Возникает та-же ошибка (2) Assertion failed
Памяти наверно не хватает? Пошагово ищите, на чём вылетает assert.
0
0 / 0 / 0
Регистрация: 17.05.2017
Сообщений: 10
29.06.2020, 11:56  [ТС]
Обнаружил, что в функции 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.06.2020, 11:56
Помогаю со студенческими работами здесь

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

How to proceed to program QSPI Flash memory only once
AN4760 pg.58 How to proceed to program QSPI Flash memory only once During an application development, the user needs to debug its...

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

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru