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();
}

У кого-нибудь есть опыт работы с этим пакетом?

Спасибо

0 ответов

Другие вопросы по тегам