SPIFFS_open() завершается ошибкой после форматирования
Я пытаюсь реализовать SPIFFS, но не могу выйти за рамки монтажа.
мой тестовый код выполняет следующее: mount > unmount > format > re-mount и затем пытается SPIFFS_open(), внимательно следуя https://github.com/pellepl/spiffs/wiki/Using-spiffs Однако я получаю SPIFFS_ERR_FULL (-10001) ошибка
Детализация внутри Я заметил, что SPIFFS_open завершается ошибкой при вызове spiffs_gc_check(), который возвращает SPIFFS_ERR_FULL
Я использую Adesto AT45DB641E и попробовал несколько настроек различных физических / логических комбинаций страниц / блоков. "Обычные" функции стирания / чтения / записи флэш-памяти работают как положено.
Я использую следующие настройки spiffs_config.h:
SPIFFS_BUFFER_HELP 1
SPIFFS_GC_STATS 0
SPIFFS_USE_MAGIC/SPIFFS_USE_MAGIC_LENGTH 1
SPIFFS_SINGLETON 1
SPIFFS_CFG_PHYS_SZ (4 * 1024 * 256)
SPIFFS_CFG_PHYS_ERASE_SZ (8*256) // tried also (1024*256)
SPIFFS_CFG_LOG_PAGE_SZ (256)
SPIFFS_CFG_LOG_BLOCK_SZ (8*256) // tried also (1024*256)
прикрепленный тестовый код:
#define LOG_PAGE_SIZE 256
static u8_t spiffs_work_buf[LOG_PAGE_SIZE*2];
static u8_t spiffs_fds[32*4];
static u8_t spiffs_cache_buf[(LOG_PAGE_SIZE+32)*4];
static spiffs fs;
s32_t my_spi_read(u32_t addr, u32_t size, u8_t *buf)
{
spiflash_read(addr, size, buf, NULL, NULL);
return 0;
}
s32_t my_spi_write(u32_t addr, u32_t size, u8_t *buf)
{
spiflash_write(addr, size, (uint8_t*)buf, false, NULL, NULL);
return 0;
}
s32_t my_spi_erase(u32_t addr, u32_t size)
{
spiflash_erase(addr, size, 0, false, NULL, NULL);
return 0;
}
void my_spiffs_mount(bool forceFormat)
{
spiffs_config cfg;
char str[50];
int res;
cfg.hal_read_f = my_spi_read;
cfg.hal_write_f = my_spi_write;
cfg.hal_erase_f = my_spi_erase;
res = SPIFFS_mount(&fs, &cfg, spiffs_work_buf, spiffs_fds, sizeof(spiffs_fds),
spiffs_cache_buf,sizeof(spiffs_cache_buf), 0);
if(forceFormat) {
res = SPIFFS_ERR_NOT_A_FS;
}
if(res != SPIFFS_OK) {
SPIFFS_unmount(&fs);
if(res == SPIFFS_ERR_NOT_A_FS) {
res = SPIFFS_format(&fs);
sprintf(str, "format res: %i\n", res);
LOG_INFO_MESSAGE_LINE(str);
res = SPIFFS_mount(&fs, &cfg, spiffs_work_buf, spiffs_fds, sizeof(spiffs_fds),
spiffs_cache_buf,sizeof(spiffs_cache_buf), 0);
}
}
sprintf(str, "mount res: %i\n", res);
LOG_INFO_MESSAGE_LINE(str);
u32_t total, used;
res = SPIFFS_info(&fs, &total, &used);
return;
}
void my_spiffs_create_and_write()
{
spiffs_file fd;
int ret;
char str[50];
// create a file, delete previous if it already exists, and open it for reading and writing
fd = SPIFFS_open(&fs, "my_file", SPIFFS_CREAT | SPIFFS_TRUNC | SPIFFS_RDWR, 0); // << Returns SPIFFS_ERR_FULL
if (fd < 0) {
sprintf(str, "SPIFFS_open: errno %i\n", SPIFFS_errno(&fs));
LOG_ERROR_MESSAGE_LINE(str);
return;
}
// write to it
ret = SPIFFS_write(&fs, fd, (u8_t *)"Hello world", 12);
if ( ret < 0) {
sprintf(str, "SPIFFS_write: errno %i\n", SPIFFS_errno(&fs));
LOG_ERROR_MESSAGE_LINE(str);
return;
}
// close it
ret = SPIFFS_close(&fs, fd);
if (ret < 0) {
sprintf(str, "SPIFFS_close: errno %i\n", SPIFFS_errno(&fs));
LOG_ERROR_MESSAGE_LINE(str);
return;
}
}
void my_spiffs_read()
{
spiffs_file fd;
int ret;
char str[50];
char buf[12];
// open it
fd = SPIFFS_open(&fs, "my_file", SPIFFS_RDWR, 0);
if (fd < 0) {
sprintf(str, "SPIFFS_open: errno %i\n", SPIFFS_errno(&fs));
LOG_ERROR_MESSAGE_LINE(str);
return;
}
// read it
ret = SPIFFS_read(&fs, fd, (u8_t *)buf, 12);
if (ret < 0) {
sprintf(str, "SPIFFS_write: errno %i\n", SPIFFS_errno(&fs));
LOG_ERROR_MESSAGE_LINE(str);
return;
}
// close it
ret = SPIFFS_close(&fs, fd);
if (ret < 0) {
sprintf(str, "SPIFFS_close: errno %i\n", SPIFFS_errno(&fs));
LOG_ERROR_MESSAGE_LINE(str);
return;
}
sprintf(str, "Read from file: '%s'", buf);
LOG_INFO_MESSAGE_LINE(str);
}
// called from main() during initialization
void SB_spiffs_init(void)
{
my_spiffs_mount(true);
my_spiffs_create_and_write();
my_spiffs_read();
}
У кого-нибудь есть опыт работы с этим пакетом?
Спасибо