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:闪存组7不能正确擦除

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/601896/rm57l843-flash-bank-7-does-not-erase-correctly

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

您好!

我使用组7在 RM48和 RM57上存储校准数据。  多年来、我们成功地使用了软件堆栈、包括 RM48上的 F021 API。 擦除扇区后、我通过检查每个地址处的0xFFFFFFFF 手动检查是否为空。

在对 RM57进行编程期间、我选择擦除组7扇区1。  程序加载后、我检查 CCSV7中的地址0xF0200000、并注意到数据是0xFFFFFFFF、0xFFFFFF7FF

我希望闪存擦除至0xFFFFFFFF、即使 ECC 已启用、我认为它始终位于 RM57上? ECC 应该在0x0100000处。

当我使用 F021 API 并按照描述的序列(与 RM48上使用的序列相同)执行操作时、我始终会为每个命令获取 Fapi_Success、但我的闪存不会擦除。

是否有人可以指出、尽管返回了成功代码、但会导致 CCSV7编程器和 F021API 不会擦除 Bank7的原因?

谢谢

Stomp。

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

    [引用 user="cingp">即使 ECC 已启用、我也希望闪存擦除至0xFFFFFFFF 该线程 为什么我的 RM57L843无法清晰地擦除? 似乎可以解释、情况并非如此。

    擦除后、如果您尝试随后将 0xFFFFFFFF 值与有效 ECC 一同编程、会发生什么情况?

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

    我读过这篇文章、但我认为它与我看到的情况不完全相同。

    擦除后、让我们假设我使用0xAA5555对0xF0200000进行编程、我会看到一些位从1变为0。 但情况并非如此、内存不会改变。

    我没有明确地对有效的 ECC 进行编程、我只是假设 F021 API 在 RM57上执行此操作。 我必须检查。

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

    [引用 user="cingp">擦除后、让我们假设我使用0xAA5555对0xF0200000进行编程、我会看到一些位从1更改为0。 在这种情况下、存储器不会更改。[/quot]默认情况下、当创建 HALCoGen 工程时、将启用高速缓存、并将闪存的 MPU 区域设置为 NORMAL _OIWTNOWA_NONSHARED "存储器类型 NORMAL OUR 和 INNER WRITE 直写、无写分配和非共享"。

    因此、CPU 可能缓存了已擦除的闪存值-请参阅 CCS/TMS570LC4357:使用 F021闪存库进行闪存编程时出现问题

    [我自己还没有测试过这个]

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

    我将 MPU 更改为 normal_OIWTNOWA_nonshared、存在一些差异。 我还没有尝试高速缓存刷新方法。

    我仍然很难使用在 RM48上成功写入组7的相同 F021例程。 由于 F021相同、因此其工作原理也应相同。

    TI 是否有一个使用 F021 API 从组7中任何扇区读取和写入阵列而不存在高速缓存或 ECC 问题的 RM57示例?

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

    我将把您的帖子转发给我们的一些 F021和 FEE 专家。 他们应能很快提供帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Stomp

    我将看到我是否可以编写一个简单的示例。 在此之前、我想澄清几点。

    1) 1)为组7配置的等待状态是什么。

    2) 2)擦除后、您提到很少有位置读取0xFFFFFF7F。 如果禁用 ECC、您是否仍然读取相同的内容?

    3) 3)您提到擦除后、您执行了空白检查。 空白检查是否通过。要确认您的擦除是否成功、您可以执行读取裕量1测试。

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

    您好!

    非常感谢您的帮助。

    我们位于 RM57L843上。

    1、3个等待状态

    据我所知、无法从 RM57的闪存中禁用 ECC。  如果这是错误的、请告知。

    3.要执行空白检查,我使用自己的算法(查找0xFFFFFFFF),由于 ECC,它显然不起作用。 我还使用 Fapi_doBlankCheck()函数,由于 ECC 限制,该函数无法工作。

    我不确定您的意思是读取 Margin1测试。 您有链接吗?

    我认为我遇到的问题与几件事有关。

    1.高速缓存。 通常在我复位器件后,我会看到编程内存的*部分*,有时内存内容会在相邻内存地址中重复。

    2. ECC。

    3、其他的事情也是随机的。 我注意 到,如果我设置了 Fapi_setActiveFlashBank (7);然后设置 while (Fapi_checkFsmForReady()== Fapi_Status_FsmBusy);while 循环可能永远不会在大约3/10程序运行时退出。

    我的流程如下所示:

    1. 使用基本的循环复制将整个组1扇区1加载到 RAM 中。
    2. 修改数组的一部分
    3. 将阵列重新写入闪存:
      1. Fapi_setActiveFlashBank()
      2. fapi_checkFsmForReady()  
      3. fapi_enableEpromBankSectors ()
      4. fapi_checkFsmForReady()
      5. Fapi_issue19 CommandWithAddress (Fapi_EraseSector...)
      6. 检查扇区是否被擦除
      7. fapi_checkFsmForReady()
      8. fapi_issueProgrammingCommand (...、16U、(LUint8*) 0U、0U、Fapi_AutoEccGeneration);
      9. fapi_checkFsmForReady()

    我认为我没有做任何特别错误的事情、因为这在 RM48上运行良好。

    谢谢

    太棒了!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    信息很好,谢谢!
    您能告诉我您当前使用的是什么版本的 F021闪存 API 吗?
    它是02.01.01吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我忘记了最重要的信息。

    我已经针对 F021 API 的02.00.01和02.01.01版本进行了测试。

    两个版本都在 RM48 LE 上工作、两个版本都不在 RM57 LE 上工作。

    谢谢。

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

    我注意到您说您使用3 WS 付费访问。 请注意、FEE 在 RM57上是一个不同的组类型并且需要一个更高数量的 WS 并且取决于 HCLK 的频率。 假设您将 HCLK 配置为最大150MHz、则 FEE 的 WS 配置应为 EWAIT = 8。 但这可能是术语的混淆、因为正常的程序闪存是 RWAIT = 3 WS 要求。 请注意寄存器位字段名称的差异。 EWAIT 中的 EEPROM WS 置1、RWAIT 中的正常闪存置1。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Chuck、

    只是为了澄清、我将组0、1作为3WS、将组7作为9WS。

    //设置闪存读取模式、地址等待状态和数据等待状态
    flashWREG->FRDCNTL =(LUint32) 0x000000U
    |((LUint32) 3U << 8U)
    |(LUint32) 3U;
    
    //设置闪存访问等待状态(对于组7
    FSM_WR_ENA_FSM = 0x5U;
    EEPROM_CONFIG_HL =(LUint32)
    
    
    
    
    2U);(LUint32)闪存= 0x0000U;(LUT_Un) Un = 0x000032;(LUint32) Un
    
    //设置闪存组电源模式
    flashWREG->FBPWRMODE =(LUint32) 0x00000000U
    
    //*组7*/|
    ((LUint32) SYS_ACTIVE << 14U)
    //*组1*/
    |((LUint32) SYS_ACTIVE << 2U)
    //*组0*/
    |(LUint32) SYS_ACTIVE; 

    我本应该更清楚一点。

    此致

    太棒了!

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

    您好、Stomp、

    很抱歉、我忘记了问。

    函数 Fapi_initializeFlashBanks (HCLK_FREQ)的返回值是多少? 是 Fapi_Status_Success (0)还是 Fapi_Error_InvalidHclkValue (8)?

    确保仅在 Fapi_initializeFlashBanks 返回零(Fapi_Status_Success)时继续任何闪存操作。

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

    您好!

    在 RM57上、我们有150MHz HCLK、300MHz GCLK、其余时钟为75MHz、但37.5MHZ 的 EMAC (VCLK4A_DIV)除外。

    我们的代码称为 Fapi_initializeFlashBanks (150U);

    我们检查状态、它始终是 Fapi_Status_Success。  如果不成功、 我们的驱动程序会返回报告。

    我们还检查了 Fapi_initializeFlashBanks (300U);使用 Fapi_Error_InvalidHclkValue 返回、以确保函数在不执行任何操作的情况下不返回0。

    如果有任何帮助、我也一直在探索 HalCoGen 提供的 FEE 驱动器。  由于与上层的兼容性以及所需的验证工作、我们无法在系统中使用此驱动程序。  但我确实注意到:

    FLASH_CONTROL_REGISTER->FrdCntL.FRDCNTRL_BITS.RWAIT = 0x3U;
    FLASH_CONTROL_REGISTER->FsmWrEna.FSM_WR_ENA_BITS.WR_ENA_BITS.WR_ENA_ENA_ENA=0x5U;
    FLASH_CONTROL_REGISTER->EEP_EEPROMODE.EEPROM.EEPROM_EEPROM_EEPROBLE.EWAIT = 0x4UVS_UVS_ENA=0x4UN.UN.UNA_CONTROL_ENA=0x
    
    

    默认情况下、FEE 驱动器还将 EEPROM 等待设置为4、而不是8??

    谢谢!

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

    您好、Stomp、

    请在 RM57x 器件上找到附加的简单 Bank7擦除和编程例程。

    e2e.ti.com/.../0068.F021_5F00_Sample.zip

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

    首先,非常感谢您本人和其他人迄今提供的帮助,即世界一流的服务。

    您的应用程序运行良好、与我的不同之处在于我只擦除一个扇区、而不是擦除整个组。 对于 RM57 (0x2000与0x1000)、您针对组大小所拥有的#defines 也稍微关闭了一点。

    通过测试您的应用程序、它使我能够进一步定义我在应用程序中看到的问题。 我无法在您的应用程序中重现相同的结果、可能只是因为您的应用程序的大小非常小。

    在 CCS 调试配置->闪存设置中、选择在编程期间擦除组7扇区1。
    2.将我的固件下载到 RM57并运行它。
    3.将整个 B7S1扇区读入 RAM 阵列。
    4.修改 RAM 阵列中的一些字节。
    擦除扇区 B7S1并重新编程阵列、所有 Fapi 命令返回成功。
    6.在0xF0200000处的内存观察窗口中,我可以看到闪存内容目前没有改变。
    7.将 RAM 阵列与闪存阵列进行比较会导致比较故障,但闪存未编程。
    8.重新启动调试器、但不要运行应用程序。 请注意、内存监视现在显示了一个正确编程的闪存!!!

    从本质上讲、闪存确实被正确编程、但在重新启动之前我不能再读回它、并且存储器调试窗口并不总是反映闪存的当前状态。

    这只是我看到的一个缓存问题吗?

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

    [报价]这只是我看到的一个高速缓存问题吗?[/quot]一些选项可以确定高速缓存是否导致了此问题:

    1) 1)在"Memory Watch"窗口显示 Cortex-R5 CPU 上下文中的闪存内容没有变化后、尝试在调试访问端口(DAP)上下文中查看相同的闪存地址。 这是因为 DAP 上下文读取存储器目录、绕过 Cortex-R5 CPU 缓存。 如果 Cortex-R5 CPU 和 DAP 查看的闪存不同、这表示 CPU 缓存了缓存的"过时"内容。 有关  使用 DAP 访问存储器的链接、请参阅手动启动。

    2) 2)在用于 FEE 地址空间的 HALCoGen PMU 配置中、尝试将类型更改为"device_sharedable"、以防止 FEE 的内容被缓存:

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

    您好、Stomp、

    让我再次确认。  
    您的问题是、对组7进行编程后、您无法在存储器窗口中看到数据、但在复位后、您可以看到数据。 对吗?  

    我进行了与您类似的实验、读取 BANK7-sector0并存储数据、擦除 BANK7 -扇区0并写入新的数据集。 它工作正常、我能够在存储器窗口中看到新数据、并能够通过代码读取。  

    对于我的代码、组7的 MPU 类型为 NORMAL OINC_NONSHARED。 (这是不可高速缓存的配置)。

    唯一需要注意的是 RM57x 器件 F021 API - Blankcheck 例程使用 DiagMode7、RM48x 器件则不是这种情况。

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

    我认为一个更简单的解释:

    "在编程期间擦除 Bank7 S1并首次运行应用程序后、尽管所有 Fapi 命令返回成功、但仍无法将任何数据编程到 B7处的闪存中"。

    确定闪存是否已正确编程的方法是执行验证检查(失败)或查看存储器窗口(显示闪存仍处于擦除状态且可看到 ECC 校正)。

    应用复位后、闪存按预期工作。

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

    您好、Stomp、

    /cfs-file/__key/communityserver-discussions-components-files/312/6840.F021_5F00_Sample_5F00_v2.zip

    我已附加 HALCoGen + CCS 项目。 它执行组7擦除、写入和验证。  

    有两个从 RAM 和闪存运行 Blankcheck 的选项。 这可以由预处理器宏 run_from _RAM 控制(必须在 CCS 项目属性的 Compiler and Linker 选项中更改)。  

    有关 MPU 设置、请参阅我附加的 HALCoGen 项目。  

    :我将 RAM 配置为不可高速缓存,只是为了执行它的代码。 如果从闪存运行、则不需要此设置。  

    希望这对您有所帮助。