This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RM57L843:使用 F021 API 在仿真 EEPROM 上实现 LittleFS 文件系统。

Guru**** 703620 points
Other Parts Discussed in Thread: HALCOGEN
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1240131/rm57l843-implementing-a-littlefs-filesystem-on-the-emulated-eeprom-using-the-f021-api

器件型号:RM57L843
主题中讨论的其他器件:HALCOGEN

我一直在尝试将 littlefs 文件系统实施到 RM57Lx 上的仿真 EEPROM 以存储配置值。

EEPROM 具有错误校正代码、最初使用链接器脚本生成的 ECC 代码进行编程。

我像这样初始化闪存存储体、然后提供回调函数、以便将数据写入和读取到由小 FS 处理的特定地址。

Fapi_initializeFlashBanks(150);
Fapi_setActiveFlashBank(Fapi_FlashBank7);
Fapi_enableEepromBankSectors(0xFFFFFFFF, 0);

读取函数的实现方式如下:  

int eeprom_read(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, 
                void *buffer, lfs_size_t size) {

    struct lfs_context *ltxt = c->context;
    uint32_t addr = (ltxt->flash_sectors.u32BankStartAddress + (c->block_size * block) + off);

    while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady)
    {
      
    }

    Fapi_StatusType status = Fapi_doMarginRead(
        (uint32_t *)addr,
        (uint32_t *)buffer,
        size / 4,
        Fapi_NormalRead);
    if (status != Fapi_Status_Success) {
        fapiIndicateError(status);
    }
    return status;
}

程序函数的实现方式如下:

int eeprom_prog(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, 
                const void *buffer, lfs_size_t size)
{

    struct lfs_context *ltxt = c->context;

    while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady)
    {
      ;
    }

    Fapi_StatusType status = Fapi_issueProgrammingCommand(
          (uint32_t *)(ltxt->flash_sectors.u32BankStartAddress + (c->block_size * block) + off), 
          (uint8_t *) buffer, 
                        size,
                        NULL, 
                           0, 
      Fapi_AutoEccGeneration);
   
    if (status != Fapi_Status_Success) {
        fapiIndicateError(status);
    }
    return status;
}

我还会通过以下方式格式化扇区:

int eeprom_erase(const struct lfs_config *c, lfs_block_t block)
{
    struct lfs_context *ltxt = c->context;

    while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady)
    {
        ;
    }
 
    Fapi_StatusType status = Fapi_issueAsyncCommandWithAddress(
        Fapi_EraseSector, 
        (uint32_t *)(ltxt->flash_sectors.u32BankStartAddress + (c->block_size * block)));

    if (status != Fapi_Status_Success) {
        fapiIndicateError(status);
    }
    return status;
}

编程后、EEPROM 被擦除、看起来正确:

0xf0200000:     0xffffffff      0xffffffff      0xffffffff      0xffffffff
0xf0200010:     0xffffffff      0xffffffff      0xffffffff      0xffffffff
0xf0200020:     0xffffffff      0xffffffff      0xffffffff      0xffffffff
0xf0200030:     0xffffffff      0xffffffff      0xffffffff      0xffffffff
0xf0200040:     0xffffffff      0xffffffff      0xffffffff      0xffffffff
0xf0200050:     0xffffffff      0xffffffff      0xffffffff      0xffffffff
0xf0200060:     0xffffffff      0xffffffff      0xffffffff      0xffffffff
0xf0200070:     0xffffffff      0xffffffff      0xffffffff      0xffffffff
0xf0200080:     0xffffffff      0xffffffff      0xffffffff      0xffffffff
0xf0200090:     0xffffffff      0xffffffff      0xffffffff      0xffffffff
0xf02000a0:     0xffffffff      0xffffffff      0xffffffff      0xffffffff

不过、在最初创建和写入一些文件后:

该位会再次翻转。 在此、如果能让 EEPROM 正常工作、我希望收到任何建议或指导。 位翻转显示为文件系统的错误、会导致文件系统将该块视为不可写、从而锁定文件系统。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Rahul:

    我们已开始处理您的问题、并将尽快提供更新。

    --
    谢谢。此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jagdish、您好!

    您能否提供任何更新? 我们已经被这个问题困扰了一段时间,不知道硬件继续。 该文档并未明确如何写入单个地址、而是针对 EEPROM_Bank_width 的所有读取和写入操作。

    此致、

    拉胡尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的  Rahul:

    为了使用 EEPROM (组7)、HALCOGen 生成 FEE 驱动程序。 您无需编写代码来从 EEPROM 读取数据/向 EEPROM 写入数据。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、QJ:

    我曾研究过使用 FEE 驱动器、但限制是它写入数据块。 应用程序中的用例是将小配置值存储在文件中并从中进行读写。我可以重组项目以使用 FEE 驱动程序、但我想知道是否可以将较小的8字节数据直接写入 eeeprom 地址?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、您可以使用 F021闪存 API 将数据直接写入闪存组7。 闪存内容发生翻转是由未使用的闪存的无效 ECC 引起的。

    1.可以启用闪存控制寄存器的 EOCV。

    2.或者从链接器 cmd 文件对整个存储体7的 ECC 进行编程

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    因此、我们目前使用链接器 cmd 文件清除初始程序上的 EEPROM、并正确编程 ECC。 这种 方法可以正常工作、我们还设置了 EOCV 以及 EZCV 位、但我们仍然看到内存中的随机位发生翻转。 使用 JLink 调试器进行调试也很困难、因为调试器在重置 gdb 服务器之前不会发现内存变化。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们也设置了 EOCV 以及 EZCV 位,但我们仍然看到内存中的随机位翻转。

    擦除后、EEPROM 内容为0xFFFFFFFFF、因此只需要设置 EOCV 位就足够了。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Fapi_issueAsyncCommandWithAddress (Fapi_EraseSector、0xf0200000)是否可能导致 ECC 值不正确? 我注意到、该位仅在我们编程数据/擦除其扇区的时候翻转。

    更新:我们跟踪到内存地址的读取和编程、发现失败原因是无法覆盖先前写入的地址:

    在下面的示例中、最后一次写入不起作用、我们将再次读取之前的值。  

    '0xf0200000':['写入0xf7ff0ff00001'、 
    '读数0xf7ff0ff000000001'、 
    '读数0xf7ff0ff000000001'、
    '读数0xf7ff0ff000000001'、
    '读数0xf7ff0ff000000001'、
    '读数0xf7ff0ff000000001'、
    '读数0xf7ff0ff000000001'、
    '读数0xf7ff0ff000000001'、
    '写入0xf7ff0ff000000003'、
    '读数0xf7ff0ff000000001']


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Fapi_issueAsyncCommandWithAddress (Fapi_EraseSector、0xf0200000)是否可能导致 ECC 值不正确? [/报价]

    它擦除闪存扇区及其 ECC 空间。 两个存储器空间(组7扇区及其 ECC 空间)中的内容都是0xFFFFFFFF、因此 ECC 无效。

    在下面的示例中,最后一次写入不起作用,我们再次读取以前的值。  [/报价]

    不能向未擦除的位置(其内容不是0xFFFFFFFF)写入数据。

    [/quote]