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.

[参考译文] RM46L852:闪存验证失败

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1588379/rm46l852-flash-verification-fail

部件号: RM46L852

我正在努力验证闪存内容。  

在刷写一个 4K 数据块后、我会进行回读、结果会失败。 但是、当查看调试器中的数据时、它已正确刷写  

闪存数据和回读之间是否存在需要注意的一些延迟?  (我正在使用闪存 API)。

如果我跳过整个验证过程、一切都正常、但我觉得这是错误的。 我尝试了仅对数据部分进行编程、还尝试了自动生成具有相同结果的 ECC 位。  

代码:

 
//刷写数据块:(重复此过程直到刷写 4K)
 
uint32_t flashload_programBlock (uint32_t *flashAddress、uint8_t *data){
    Fapi_Flash 状态类型 状态;
    uint8_t i;

    //编程 16 个字节
    状态 = Fapi_issueProgrammingCommand (flashAddress、 data、 16  、0、0、  Fapi_Auto EccGeneration);
    if (Fapi_Status_Success != status){
        返回 FAPI_PROGRAMMING_COMMAND_FAILED;
    }
    waitFlashReady ();
    if (0!= FAPI_GET_FSM_STATUS){
        返回 FAPI_FSM_not_zero;
    }

    返回 成功;
}
 
//验证:
uint32_t flashload_verify (uint8_t *地址、 uint32_t noOfBytes){
    uint32_t i;
    for (i = 0; i < noOfBytes;i++){
        if(*address++ != flashload_rxbuf[i]){
            返回 write_verify_error;
        }
    }
    返回 成功;
}
 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 la Ma:

    我在代码中使用的逻辑与您的相同、工作正常:

    请参阅我所附的项目一次:

    e2e.ti.com/.../FAPI_5F00_TEST_5F00_RM46-_2800_3_2900_.zip

    我正在对地址为 0xF0200000 的收费区域进行此测试、您在代码中的哪些位置执行此测试?

    --
    此致、
    Jagadish。

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

    我将使用地址 0x00020000 和转发 (Bank0/Sector7) 中的主闪存区域。 看起来您正在使用 EEPROM 部分。  

    我已经做了更多的调试,它接缝,如果我强制优化=0 的验证函数,它会接缝工作. (需要更多测试)

    通常、所有 C 代码都是使用 optimize=2 进行编译的。  

    如果我将“__attribute__((optimize(“0")“)))“放在验证过程的前面、它似乎可以正常工作。  

    我仍然不明白为什么,它可能只是一些时间的东西已经改变了,当去优化。

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

    尊敬的 la Ma:

    由于、您的验证失败 闪存包装程序数据高速缓存一致性问题 。 使用对闪存进行编程时Fapi_issueProgrammingCommand()、新编程的数据可能仍在闪存包装程序的流水线缓冲区/数据高速缓存中。 当您立即回读数据进行验证时、您可能会读取过时的缓存数据、而不是实际的编程闪存内容。

    禁用优化optimize=0 () 的原因似乎是“修复“该问题、因为它可能会引入足够的延迟并更改内存访问模式、以便可以刷新或绕过高速缓存、但这不是一个可靠的解决方案。

    因此、您能否按照以下流程操作并告诉我您的反馈意见:

    调用 Fapi_flushPipeline()在执行任何非 API 闪存读取之前对其进行编程。 根据闪存 API 文档:

    “该函数可刷新闪存包装程序数据高速缓存。 在进行擦除或编程操作后、必须在读取第一个非 API 闪存之前刷新数据高速缓存。

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

    那就算了。“ 谢谢

    我觉得这是一个缓存问题,并尝试使用 MCR P15 命令清除缓存,但它可能是错误的缓存。

    建议:
    将 flush 命令添加到 SPNU504x 文档第 5.2 节和第 5.3 节中推荐的程序流中  

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

    感谢您的建议和观察。