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.

[参考译文] CCS/RM48L952:TI FEE 读取异步操作问题

Guru**** 2337880 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/871953/ccs-rm48l952-ti-fee-read-async-operation-question

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

工具/软件:Code Composer Studio

您好、TI、

FEE 驱动器有以下问题:我有两个虚拟扇区。 当我使用不同的块编号执行几个写入操作时、一切看起来都正常、因为我能够在内存浏览器上执行合理性检查、同时执行 FEE 读取操作来检查我的内部缓冲区内容。

但现在关键是:

当我再次写入之前已写入并相应检查的相同块编号 ID (WriteAsync)(=具有相同块编号 ID 的不同存储器位置上的数据)时、似乎正常。 当我通过  TI_FEE 对新写入的块执行回读时、读取不包含有效的数据样本、尽管在存储器浏览器上查看、新数据已正确写入。

当前设置:

2个虚拟扇区(1-2和3-4)

当前序列:

(请注意、此伪代码未显示在每次调用 TI 函数时调用的 TI_FEE 函数。 这只是为了演示)

TI_fee_WriteAsync (1U、SetBuffer)

TI_FEE 读取(1U、0U、ReadBuffer、10U)

//对照已写入和已读取的数据进行检查是可以的((SetBuffer equal ReadBuffer))

TI_fee_WriteAsync (1U、SetNewBuffer)

//在内存浏览器上看到的数据将在新的物理位置(第二个虚拟扇区)更新

TI_FEE 读取(1U、0U、ReadNewBuffer、10U)

//两个缓冲区之间的比较不正确,因为两个数据完全匹配(SetNewBuffer 不相等 ReadNewBuffer)

是否有需要考虑的事项(一些缺失的设置或设置、如首次使数据无效)?

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

    您好!

    您是否配置了 EEPROM 等待状态(EEPROM_CONFIG 寄存器)?

    RWAIT 值用于定义程序存储器闪存的等待状态数。 EWAIT 值用于定义组7中数据闪存的等待状态数。  您可以为 EEPROM 使用与 RWAIT 相同的值。

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

    QJ Wang、您好!

    是 TI FEE 初始化的寄存器部分、因为我假设连接到 EEPROM 的所有内容都在 FEE 驱动器库中。 EEPROM 等待状态配置位于闪存驱动程序初始化中、我想我没有触摸到任何内容、因为 Halcogen 的示例在一定程度上运行。

    这是我的当前过程。 如上所述、我有两个虚拟扇区、因此我开始使用"虚拟数据"填充第一个活动虚拟扇区、即使数据块较少。 我将使用相同的块编号(块编号1-16在循环中多次)写入虚拟数据、直到第一个虚拟扇区完全填满。 当我在激活下一个虚拟扇区之前执行回读时,我可以通过 TI_FEE 正确回读所有内容,即使同一个块编号已写入具有不同数据内容的多个 tme。

    当切换到下一个虚拟扇区并继续在 EEPROM 上写入数据时、我可以评估第二个虚拟内存扇区位置上的写入活动。 但如果我现在通过 TI_FEE ()读回数据、我始终会得到这样的结果:该作业未被接受、因此缓冲区中不会填充有效数据。

    我不知道我是否执行了错误的步骤、或者在不同虚拟扇区之间跳转时是否需要手动使数据无效。

    在调试会话期间、我始终跳转到 fee read.c 中 TI_fee_read ()的这一部分、而一个虚拟扇区已完全填充虚拟数据(标记为黄色)。

    if ((oResult =(uint8) E_NOT_OK)||(TI_FEE 全局变量[u8EEPIndex].FEE _u16JobResult = block_invalid)||
    (TI_fee_GlobalVariables[u8EEPIndex].fee_u16JobResult = job_failed))

    /*没有其他操作正在进行中,如果模块已初始化,则更改其状态*/
    if ((TI_FEE _oStatusWord[u8EEPIndex].FEE _StatusWordType_ST.EraseImadi调解== 0U)&&
    (TI_FEE _oStatusWord[u8EEPIndex].FEE 状态 WordType_ST.InvalidateBlock = 0U)&&
    (TI_FEE _oStatusWord[u8EEPIndex].FEE _StatusWordType_ST.WriteAsync == 0U)&&
    (TI_FEE _oStatusWord[u8EEPIndex].FEE _StatusWordType_ST.WriteSync = 0U)&&
    (TI_FEE _oStatusWord[u8EEPIndex].FEE _StatusWordType_ST.Read = 0U)
    )

    /*恢复模块状态*/
    TI_FEE 全局变量[u8EEPIndex].FEE 模态=模态;
    TI_FEE _oStatusWord[u8EEPIndex].FEE 状态 WordType_ST.Read = 0U;
    #if (STD_OFF = TI_FEE 轮询_MODE)
    TI_FEE NVM_JOB_ERROR_NOTIFICATION ();
    #endif

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

    您好、多路复用器、

    是的,EEPROM 等待状态在 system.c 的 setupFlash()中定义:  

    /**-为组7设置闪存访问等待状态*/

    FSM_WR_ENA_HL = 0x5U;

    EEPROM_CONFIG_HL = 0x00000002U
    |(uint32)((uint32) 3U <<16U);

    /**-禁用对闪存状态机寄存器的写入访问*/

    FSM_WR_ENA_HL = 0xAU;

    当您将数据写入 VS1时、驱动程序会检查 VS1中是否有足够的空间来存储数据。 如果空间不足、驱动程序会将所有有效块从 VS1复制到 VS2、并将当前数据写入 VS2。 这些过程由驱动程序自动完成。 如果数据写入不正确、则应返回错误(E_NOT _OK)。

    您可以在存储器浏览器中检查块状态。 块可能无效。 如果无效、您需要重新写入此块。

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

    QJ Wang、您好!

    我已经检查了该配置、它与您的配置相同。

    我正在使用一个简单的块集并将数据连续写入 EEPROM、以便查看一个或两个虚拟扇区都已满时的行为。 当我切换到激活"持续刷新更新"的存储器浏览器时、由于某种原因、整个数据列表会设置为"坏"。 我只使用 Halcogen 提供的示例代码、但我扩展了参考示例、以使数据不会失效、并按照示例中的方式对数据进行格式化。

    因此、在我的情况下、两个虚拟扇区在某个特定点都已满、我不知道这是触发器、因为我在短时间内只看到不良数据、直到数据再次写入 EEPROM。

    此外、FEE API 在这些交换和复制操作以及擦除操作之间消耗了一些时间。 我认为虚拟 Sectos 之间的切换更加顺畅。

    您知道这里发生了什么以及发生了什么错误吗? 我是否错过了一些步骤? 是否需要在两个虚拟扇区都已满时使数据无效? 用户指南中没有任何内容、因为整个皮肤都是抽象的 TI FEE 驱动程序库、其用法是直接的。 是否存在一些技术限制?

    在执行这些交换和复制操作时、TI 是否有一些基准? 对于擦除时间、我想您可以参考 RM48芯片的电气数据表。

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

    您好、多路复用器、

    两个虚拟扇区不应同时填满。 数据块的总大小应小于(或小于)虚拟扇区大小。 当2个虚拟扇区已满时、您是否在扇区标题中检查了这两个扇区的状态?

     你是对的。 擦除扇区需要很长时间、在最坏的情况下可能长达几秒钟。 我在之前做了很多测试、连续几个小时向各个部门写入数据、没有看到这种问题。  

    BTW、您正在使用哪个版本的 HALCoGen? 最新版本为4.07.01。 另请查看 HALCOGen FEE 驱动器中的已知问题:

    http://www.ti.com/lit/ml/spna203/spna203.pdf

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

    QJ Wang、您好!

    感谢您的反馈。 关于最新版本的 Halcogen、我偶然地达到了这一点、因为其他用户在 e2e 论坛上提到了这一点。  

    跳转至 IF 子句(黄色标记)是使用 halcogen 的最新版本修复的、 但是,当两个虚拟扇区都已满或从一个虚拟扇区到另一个虚拟扇区的副本交换得到完善时,我仍在努力解决这个问题,因为我正在不断地测量此操作所需的时间。 简单的写入和读取操作非常快、但当虚拟扇区已满且 EEPROM 上执行了内部复制/擦除以及交换时、需要一些时间。  

    我想知道我如何在您当前的 API (FEE 用户指南)的帮助下以很好的方式解决这个问题。 您在 Halcrogen 上的示例仅提供一些基本功能、 但是、在执行复制/交换和擦除时、没有说明如何处理该"耗时"过程的过程、因为我不想阻止 CPU 或调用 TI_FEE 函数进行大约20000次迭代、直到状态(TI_GetStaus())更新以离开循环

    您是否有任何建议可以轻松应对这种情况?

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

    您好!

    将4个数据块(每个块64字节)写入 EEPROM 20分钟、并且虚拟扇区被擦除和编程多次。 我看不到您提到的问题(不良数据)。

    是的、擦除虚拟扇区需要一些时间。 无法缩短擦除时间。