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.

[参考译文] TMS570LS3137-ECC:tms570ls3137的闪存 EP 验证

Guru**** 2551110 points
Other Parts Discussed in Thread: UNIFLASH, TMS570LS3137

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1307089/tms570ls3137-ep-flash-ecc-verification-of-the-tms570ls3137

器件型号:EP
主题中讨论的其他器件:UNIFLASHTMS570LS3137

大家好、

客户有问题需要您的帮助:

首先、我使用 uniflash 将.out 文件编程到芯片的闪存中。 Uniflash 具有自己的自动 ECC 生成功能、可自动对 ECC 区域进行编程。

然后、我将代码添加到了我的项目的启动代码中、

/*启用 CPU 事件导出*/
/*这允许 CPU 发出任何单个位或双位错误信号
检测到
*通过其 ECC 逻辑访问程序闪存或数据 RAM。
*/
_coreEnableEventBusExport_();
/*用户代码开始(9)*/
/*用户代码结束*/

/*启用对 CPU 指示的 ECC 错误的响应来访问闪存*/
flashWREG->FEDACCTRL1 = 0x000A060AU;

/*用户代码开始(10)*/
/*用户代码结束*/

/*为 ATCM 启用 CPU ECC 检查(闪存访问)*/
_coreEnableFlashEcc_();

这将启用芯片的闪存 ECC 验证。

我想验证芯片的闪存 ECC 校验。 我发现芯片的 Flash 有7种诊断模式。 我在 sys_selftest.c 文件中找到了 void checkFlashECC (void)函数。  此函数使用诊断模式7自动修改 CPU 读取的 ECC 值、以设置单位和双位错误、从而验证闪存 ECC 的正确性。  

但我发现、在该函数中、打开诊断模式7后、访问的地址不是闪存、但选择了闪存的镜像映像。

#define flashBadECC1 (*(volatile UINT32 *)(0x20000000U))
#define flashBadECC2 (*(volatile UINT32 *)(0x20000000U))

Volatile UINT32 flashread = 0u;
/*用户代码开始(40)*/
/*用户代码结束*/

/*已启用闪存模块 ECC 响应*/
flashWREG->FEDACCTRL1 = 0x010A060AU;

/*启用诊断模式并选择诊断模式7 */
flashWREG->FDIAGCTRL = 0x00050007U;

/*选择 ECC 诊断模式,要损坏的单一位*/
flashWREG->FPAROVR = 0x00005A01U;

/*设置诊断模式的触发器*/
flashWREG->FDIAGCTRL |= 0x01000000U;

/*从镜像存储器映射中读取闪存位置*/
flashread = flashBadECC1;

/*禁用诊断模式*/
flashWREG->FDIAGCTRL = 0x000A0007U;

通过这种方式、向该函数添加一些调试代码可以发现单位错误和双位错误可以改变寄存器 flashWREG->FEDASTATUS 的值、即 CPU 检测到错误。

但是、当我将上面的  flashBadECC1 flashBadECC2更改为闪存区域时、我发现寄存器 flashWREG->FEDASTATUS 的值仍然为0、也就是说、CPU 无法检测到错误。

发生什么事了?  或者是否有任何其他方法来检查闪存 ECC 的功能。

谢谢。此致、

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

    尊敬的 Ben:

     诊断模式7必须与通过总线2接口进行的从器件访问结合使用。 地址0x20000000是从器件通过总线2接口访问闪存。 这就是  将 flashBadECC1映射到 0x20000000U 的原因、后者是位于0x0处闪存的镜像地址。 有关详细信息、请参阅 TRM。 您不能将0x0和3MB 之间的正常闪存地址用于诊断模式7。  

     这周也是一个美国假日周。 请预计响应会延迟。  

    5.6.2.6 ECC 数据校正诊断模式7:DIAGMODE = 7
    测试 CPU 中的纠错和 ECC 逻辑涉及破坏返回到
    模块。 通过反转一个或多个 ECC 位、CPU 将检测所选数据或 ECC 位中的错误、或
    ECC 返回的任何可能的值。
    要设置特定位的误差、请使用以下故障条件、请参阅表5-3。 例如、如果您想破坏
    然后将值70h 放入测试寄存器。
    该方法使用 FPAR_OVR 寄存器中的 DATA_INV_PAR 值来更改 ECC 在从器件期间
    访问周期。 DATA_INV_PAR 寄存器中的值将与当前 ECC 进行异或运算、以产生错误的
    到 CPU 的 ECC 值。 这仅在 DIAG_MODE 为7、PAR_OVR_KEY 为5且二极管处于
    FDIAGCTRL 寄存器中的 DIAG_EN_KEY 为5、且访问是一个从周期。
    该模式可以设置 FEDASTATUS 状态错误位 ECC_MUL_ERR 或 ERR_ZERO FLG、但它将
    未设置 D_UNC_ERR 和 D_COR_ERR。 此外、还显示了支持 ECCx_MAL_ERR 和
    不会对 CPU 路径实施 COMx_MAL_GOOD 位、因此不会设置这些位。
    执行此测试的顺序为:
    1.确保真正的 dma 模块已关闭。
    2.将0101b 放入 FPAR_OVR_KEY 寄存器、将101b 放入 FPAR_INV_PAR 字段(00005Axxh)中
    寄存器(0x7C)中。
    3.将所需的值放入 FPAR_OVR 寄存器的 DAT_INV_PAR 字段中。
    4.将7置于 DIAG_MODE、将5置于 FDIAGCTRL 的 DIAG_EN_KEY (0x6C)。
    5.对所需的地址进行从器件访问。
    6.将0置于 DIAG_MODE 或 A 中的一个关键字段中、以关闭此测试。
    7.检查错误寄存器是否存在 ECC 错误。 (0x14、0x1C、0x20)。
    8.根据需要重复测试 ECC。
    9.将0置于 DIAG_MODE 和 A 的两个关键字段中、以在
    完成。
    10.将5400h 写入 FPAR_OVR (0x7C)以清除 DAT_INV_PAR、并将2写入 PAR_OVR_KEY。

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

    尊敬的 Charles:

    我发现数据表中 ECC 校验代码生成的原理与普通 ECC 校验代码生成的原理不一致。 对于 tms570ls3137芯片、我是否有任何方法可以获取 ECC 检查原理?  例如、为什么要添加19位地址位? 为什么 ecc0-ecc7的7位是相应位数据的异或运算? 如何确保可以纠正单个位错误并可以检测到双位错误。

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    例如,为什么要添加19位地址位?

    您好!

     TMS570LS3137上的 ECC 不仅基于数据、而且基于地址的数据。 这将确保您从恰好与预期地址具有相同数据的错误地址读取时也会通过 ECC 校验。 例如、假设地址0x1000的值为0x55555555、地址0x1004的值也为0x55555555、而不包含 ECC 生成中所含的地址、 从0x1000读取 会生成与从0x1004读取相同的 ECC。 如果地址生成故障导致从0x1004 (错误地址)读取而不是从0x1000 (预期地址)读取、会发生什么情况?

    为什么 ecc0-ecc7的7位是相应位数据的 XOR?

    这是为了特意操作 ECC 位以使 ECC 逻辑检测到故障。 通常、位于特定地址位置的相应数据有一个 ECC 校验和。 ECC 逻辑将验证沿数据和地址读取的 ECC 校验和是否匹配。 如何知道 ECC 逻辑是否正在执行持续验证 ECC 校验和的任务? 如果 ECC 逻辑发生故障而从不执行 ECC 检查、会发生什么情况? 这就是使用 ECC 诊断模式7的原因。 该器件特意将 ECC 校验和操纵为不同于预期值的值、以便 ECC 可以检测到该值。 这样您就知道 ECC 逻辑正常工作。  

    有关详细信息、请参阅 TRM。  

    5.6.2.6 ECC 数据校正诊断模式7:DIAGMODE = 7
    测试 CPU 中的纠错和 ECC 逻辑涉及破坏返回到
    模块。 通过反转一个或多个 ECC 位、CPU 将检测所选数据或 ECC 位中的错误、或
    ECC 返回的任何可能的值。
    要设置特定位的误差、请使用以下故障条件、请参阅表5-3。 例如、如果您想破坏
    然后将值70h 放入测试寄存器。
    该方法使用 FPAR_OVR 寄存器中的 DATA_INV_PAR 值在从设备运行期间更改 ECC
    访问周期。 DATA_INV_PAR 寄存器中的值将与当前 ECC 进行异或运算、以产生错误的
    到 CPU 的 ECC 值。 这仅在 DIAG_MODE 为7、PAR_OVR_KEY 为5且二极管处于
    FDIAGCTRL 寄存器中的 DIAG_EN_KEY 为5、且访问是一个从周期。
    该模式可以设置 FEDASTATUS 状态错误位 ECC_MUL_ERR 或 ERR_ZERO FLG、但它将
    未设置 D_UNC_ERR 和 D_COR_ERR。 此外、还显示了支持 ECCx_MAL_ERR 和
    不会对 CPU 路径实施 COMx_MAL_GOOD 位、因此不会设置这些位。
    执行此测试的顺序为:
    1.确保真正的 dma 模块已关闭。
    2.将0101b 放入 FPAR_OVR_KEY 寄存器、将101b 放入 FPAR_INV_PAR 字段(00005Axxh)中
    寄存器(0x7C)中。
    3.将所需的值放入 FPAR_OVR 寄存器的 DAT_INV_PAR 字段中。
    4.将7置于 DIAG_MODE、将5置于 FDIAGCTRL 的 DIAG_EN_KEY (0x6C)。
    5.对所需的地址进行从器件访问。
    6.将0置于 DIAG_MODE 或 A 中的一个关键字段中、以关闭此测试。
    7.检查错误寄存器是否存在 ECC 错误。 (0x14、0x1C、0x20)。
    8.根据需要重复测试 ECC。
    9.将0置于 DIAG_MODE 和 A 的两个关键字段中、以在
    完成。
    10.将5400h 写入 FPAR_OVR (0x7C)以清除 DAT_INV_PAR、并将2写入 PAR_OVR_KEY。