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.

[参考译文] RM48L730:闪存 ECC 计算

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/702861/rm48l730-flash-ecc-calculation

器件型号:RM48L730
主题中讨论的其他器件:UNIFLASHNOWECCTMS570LC4357SEGGER

您好!

TI 团队是否提供了在 Linux 下生成 ECC 阵列的脚本或工具?

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

    Code Composer Studio (Windows 或 Linux)和 Uniflash 具有内置算法、可计算 ECC 并将 ECC 值编程到闪存 ECC 区域。 我们有另一个称为 nowECC 的工具、用于生成 ECC、但它仅用于 Windows。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    当使用闪存 API f021为 RM48L730生成 ECC 时,我将得到以下值 :

    我的二进制文件在地址0x8000编程、因此 ECC 位于0xF0401000、  

    这些 ECC 是否正确? 我不明白为什么每个连续的128位都能获得相同的 ECC?  

    此致、

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

    否、它们不是左侧数据和地址的正确 ECC。 64位数据+地址获得1字节 ECC 数据。

    1、0x00008000、ECC 为0x43
    2. 0x00008008、ECC 为0x11

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

    您好 QJ、

    感谢您的回复!

    我正在使用闪存 API 021中的函数"Fapi_issueProgrammingCommand":

    fapi_issueProgrammingCommand ((uint32_t *) dst、
    (uint8_t *) src、
    (uint32_t)字节、
    0、
    0、
    Fapi_AutoEccGeneration); 

    但是、正如您在上一次答复中所述、我得到了错误的结果、

    闪存 API 向 两个位置写入两倍相同的 ECC (即使错误),如下所示:

    计算得出的地址0x20000处数据的 ECC 与地址0x20010的 ECC 相同(0x92)、该地址尚未编程!

    我不明白为什么闪存 API 会将错误的内容写入 ECC 闪存区域、

    如果有任何帮助、我们将不胜感激、

    谢谢你

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

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

    您好!

    如第76页 RM48L730的数据表 SPNS176C 中所述、闪存数据 ECC 位于0xF040_0000:

    此致、

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

    0xEA00206F (位于0x20000)、0xEA00743E (位于0x20004)的 ECC 为0x92。 0x20008和0x2000C 处的0xFFFFFFFF ECC 为0xF3。

    闪存是否已成功擦除和编程(应用代码从0x20000开始)?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    是的、存储器被擦除和编程时没有任何问题、我检查返回值并始终等于"eFLASH_STATUS_OK"

    在这里的示例中、我只对前64个字节进行了编程、以确保闪存 API 不能正常工作...

    0x20000包含数据0xEA00206FEA00743E,ECC 应该等于 0x62,但我得到0x92。 未 对显示的其他地址进行编程  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    0x92适用于 cortex-R4 LE。 如何将显示屏连接到您的帖子中?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我正在使用 Eclipse 的存储器监视窗口。

    当我直接访问代码中的 ECC 位置时、我会得到相同的结果。

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

    您可以从0x20000开始向闪存写入更多数据(多个双字)吗? 我想知道 ECC 数据是如何在您的 MCU 存储器中排列的。

    我将一个文件编程为0x20000扇区、并检查 ECC、ECC 是正确的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    这是我的第一个帖子中提供的示例:

    从地址0x8000开始的6个64字节的写入字

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

    在0x00008000、ECC 为0xA7;与您的相同
    在0x00008008处、ECC 为0xE1;相同
    在0x00008020处、ECC 为0x5C
    在0x00008028处、ECC 为0x6D
    在0x00008030、ECC 为0x09 不同于您的(F2)
    (笑声)
    这些数据和地址的 ECC 正确。 但我不知道为什么0x00008008/0x00008010/0x00008018的 ECC 及其数据不正确(列在 ECC 窗口中)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    仍在为我的问题寻找解决方案。

    是的、某些 ECC 正确  

    这是我的 FAPI 021初始化函数:

    ------------------------------------------------------------------

    ------------------------------------------------------------------

    它是初始化闪存 API 的正确方法吗?

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

    您好!

    请尝试 TI 引导加载程序中的闪存擦除/编程函数、以查看 ECC 是否计算和写入正确。

    e2e.ti.com/.../6204.bl_5F00_flash.c

    e2e.ti.com/.../4555.bl_5F00_flash.h

    e2e.ti.com/.../1057.bl_5F00_config.h

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

    您可以在 main()的开头调用闪存擦除/编程函数:

    DATA[32]=...

    Fapi_BlockErase (1、0x180000、32);

    Fapi_BlockProgram (1、0x180000、&data[0]、32);

    e2e.ti.com/.../0702.flash_5F00_defines.h

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

    你好!

    我在之前的回复中使用了附加文件、但仍然得到错误的 ECC:

    我唯一改变的是主频率:

    #define SYS_CLK_FREQ 40 //MHz 

    已插入  

    #define SYS_CLK_FREQ 160 //MHz 

    结果如下:

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

    您好!

    我使用 F021Flash API 生成了 ECC、并将其编程到闪存中。 正确答案:

    这是我使用的代码:


    uint32_t 成功[]={0xea0004bd、0x00000000、
    0x00000000、0x00000000、
    0x00000000、0x00000000、
    0x00000000、0x00000000、
    0x4605b538、0x2d06460c、
    0x2d08d005、0x2d0ed003、
    0x2005bf18、0x2010d108、
    0xfa34f000、0x60044803};

    状态= Fapi_BlockErase (0、0x08000、0x2000);

    状态= Fapi_BlockProgram (0、0x8000、(无符号长整型)&Success、64);

    如果您在对闪存进行编程之前未擦除闪存、请先擦除闪存。  

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

    您好!  

    再次感谢您的回复!

    我使用了您的主程序、但仍然得到了一些错误的 ECC:

    以下是我的源文件:

    e2e.ti.com/.../6332.dev.zip

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

    您好、Ratid、

    您是否对 Fapi_BlockProgram (...)的函数进行了任何更改?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不会对此函数进行任何更改、
    我使用了您之前发送给我的文件(bl_flash.c)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请参阅主题"CCS/TMS570LC4357:Fapi EEPROM 编程"
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Ratid、

    您能否发布项目、包括链接器 cmd 文件和 out 文件? 谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我使用了下面的项目、得到了相同的错误 ECC:

    (项目已编译、输出文件位于"flashEccIssue\Debug_TI\flashEccIssue.out"中  

    e2e.ti.com/.../2727.flashEccIssue.zip

    此致、

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

    您好、Ratid、

    这是使用输出文件的测试结果:

    ECC 正确。

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

    我将代码编程为0x8000、0xF04001000处的 ECC 也是正确的

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

    您好!

    感谢您的回复!

    我在"RM48 Hercules 开发套件"上测试了代码、并在使用板载 XDS100v2 JTAG 时获得与您相同的结果。

    但是当我使用 Jlink Segger 时、我认为它能够写入正确的值、但读取错误的值!

    此致、

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

    一次读取2个以上字节时、ECC 错误。 (我想 Segger Jlink 使32位读取访问成为可能、这就是我们获得错误值的原因)

    下面的结果(1)不等于结果(2)! 即使我使用  板载 XDS100v2 JTAG 也是如此

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

    0xf0410003处的 ECC 值为0xCC。

    如果您执行字节读取操作、则0xf0410003处的 ECC 为 ECC2、即0xCC。