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.

[参考译文] TMS570LC4357:CAN ECC 单位自检将 DEFLG 而非 CAN ECC CS 寄存器中的 SEFLG 进行设置

Guru**** 2460370 points
Other Parts Discussed in Thread: TMS570LC4357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1199330/tms570lc4357-can-ecc-single-bit-self-test-sets-deflg-instead-of-seflg-in-can-ecc-cs-register

器件型号:TMS570LC4357

我已将诊断库源代码集成到当前工程中、 仅 在 DCAN1 RAM 上运行 SL_SelfTest_CAN CAN_ECC_TEST_MODE_1位测试。 我遇到的问题是、当通过读取损坏的数据位置来生成1位故障时、通常会使用 DEFLG 而不是 DCAN1 ECC CS 寄存器中的 SEFLG 来标记发生的故障(尽管有时会使用 SEFLG 进行正确标记)。 下面是我的启动过程中的伪代码。 非常感谢有关如何纠正这一问题的任何指导。 谢谢!

初始化内核寄存器

初始化堆栈指针

启用到外设的时钟并释放外设复位

确定最后一次复位的源

初始化存储器

启用 CPU 事件导出

检查在加电期间是否有 ESM 组3错误

初始化系统-时钟、闪存、 器件级多路复用和 I/O 多路复用设置

备份 DCAN1控制寄存器

清除 DCAN1控制寄存器中的 CAN_INIT_BIT、并启用 ECC

在 DCAN1上运行 SL_SelfTest_CAN CAN_ECC_TEST_MODE_1位测试

恢复 DCAN1控制寄存器

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

    您好、Cameron、

    我最近遇到了一个类似的问题、请验证我在以下主题中的答案。

    (10) TMS570LC4357:将单位错误注入 CAN-RAM 时出现双位错误(ESM 1.73和1.21)-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    并在上一主题中验证以下答案。

    --

    谢谢。此致、
    Jagadish。

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

    感谢您的快速回复、Jagadish。 很抱歉、由于该主题已关闭、我无法验证您对该主题的回答。

    我回顾了您提供的示例代码、 它看起来与我正在执行的操作相同、但在 生成单个位错误时、我仍然看到 DEFLG 的频率略高于 SEFLG。 还有其他建议吗?

    谢谢!

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

    您好、Cameron、

    不应在调试模式下执行该测试、因为在调试/暂停模式和 RDA 模式下、消息 RAM 表示不同。 为了执行此测试、我们已使用 RDA 模式。因此、如果我们在调试模式下执行测试、内存表示会在两种模式之间改变、因此可能生成更多 RAM 错误(包括单一位错误和双位错误)。

    因此、为了在没有任何问题的情况下执行该测试、我在执行测试后将测试状态发送给 SCI

    我的测试代码中的 SCI 输出总共包含10个字节、其中前4个字节是执行损坏前的字、后4个字节是执行损坏后的字、后两个字节是"ECC 诊断状态寄存器"

    如果有两个字节

    00 01 -单个位错误

    01 00 -双位错误

    01 01 01 -单个和双位错误

    以下是我在执行 single-bit 错误时获得的输出

    下面是我在执行双位错误时获得的输出

    您可以  在代码的以下行更改单位和双位错误

    这是代码、请仔细检查、

    --

    谢谢。此致、
    Jagadish。

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

    感谢您的答复。

    我没有在调试模式下运行、而是使用 RDA 进行测试。 我使用表示(uint32) 0x1u 的 CAN_FLIP_DATA_1位破坏数据。 遗憾的是、我仍然经常看到   ECC 诊断状态寄存器中设置了 DEFLG 位而不是 SEFLG 位。

    Cameron

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

    您好、Cameron、

    您能否附上您的代码?

    --

    谢谢。此致、
    Jagadish。

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

    Jagadish、

    很遗憾、我无法 附上我的代码、但我正在使用 TMS570LC4357的 sl_SelfTest_can ()函数、而未对 SafeTI 诊断库2.4.0版(可在此处下载 https://www.ti.com/lit/sw/spnc043b/spnc043b.zip?ts=1669743014857&ref_url=https%253A%252F%252Fwww.ti.com%252Ftool%252FSAFETI_DIAG_LIB%253FkeyMatch%253DSAFETY%2BDIAGNOSTICS%2BLIBRARY )中的 sl_selftest.c 进行任何更改。

    目前、我只  对 DCAN1使用 CAN_ECC_TEST_MODE_1位测试 

    谢谢。

    Cameron

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

    您好、Cameron、

    我把代码附上正确、您有机会查看一下吗?  

    您的代码与我的代码相同、或者代码与之没有任何变化。

    如果可能、您可以使用我的代码进行测试、或者对我的代码进行必要的修改并告诉我吗?

    --

    谢谢  

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

    我能够 按如下方式稍微修改您的 sl_SelfTest_can()函数并在我的代码中进行测试。 我稍后检查了它们的值、而不是清除 ECC_CS 和 ECCDIAG_STAT 中的错误、因此我能够验证我仍然看到 DEFLG (位8)而非 SEFLG (位0)被置位了超过 ECC_CS 和 ECCDIAG_STAT 中一半的时间。

    我使用0级寄存器优化和无优化配置对其进行了测试、结果相同。

    另外,我注意到,您的代码将 msgNo 定义为1U,而我将其定义为2U。 我尝试了你的函数 两种方式、仍然看到 DEFLG 被标记的频率高于 SEFLG。

    有什么建议吗?

    谢谢。

    Cameron

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

    布尔 SL_SelfTest_CAN2 (SL_DCAN_Instance SL_DCAN_Instance)

    易失性 UINT32*数据;
    寄存器 UINT32 ramread32;
    uint32 dataVal;
    volatile 布尔值 testPassed =0;


    if (SL_DCAN_Instance == SL_DCAN1)

    sl_canREG = canREG1;
    dcanRAMBase =(UINT32 *)&canRAM1;
    }

    data =(volatile UINT32 *)((((UINT32) dcanRAMBase)+(msgNo*0x20u));
    数据= DATA++;

    /*禁用 SECDED -在 CANCTL 中写入 PMD */
    BF_SET (SL_CANREG->CTL、CAN_CTRL_SECDED_DIS、CAN_CTRL_SECDED_START、CAN_CTRL_SECDED_LENGTH);

    /*设置测试位以启用测试模式(选择测试模式- RDA 时需要)*/
    BIT_SET (SL_CANREG->CTL、BIT (CAN_CTRL_TEST_EN);

    /*设置 Init 位(进入软件初始化模式)并避免与消息处理器发生冲突
    *进入 RDA mode 前需要执行此步骤*/
    bit_set (sl_canREG->CTL、bit (CAN_CTRL_init));

    /*启用 RAM 直接访问(RDA)*/
    BIT_SET (SL_CANREG->TEST、BIT (CAN_TEST_RDA_EN);

    /*备份数据存储在此位置*/
    dataVal =*数据;
    //sciSendByte (sciREG1、(uint8_t)(*数据>>>24);
    //sciSendByte (sciREG1、(uint8_t)(*数据>>>16);
    //sciSendByte (sciREG1、(uint8_t)(*数据>>>8);
    //sciSendByte (sciREG1、(uint8_t)* data);

    /*启用 SECDED 诊断模式*/
    bf_set (sl_canREG->ECCDIAG、CAN_ECCDIAG_SECDED_EN、0、4);

    /*启用 ECC single-bit 错误事件*/
    bf_set (sl_canREG->ECC_CS、CAN_ECC_CS_SBE_EVT_EN、CAN_ECC_CS_SBE_EVT_START、CAN_ECC_CS_SBE_EVT_LENGTH);

    /*损坏数据*/
    *data ^= CAN_FLIP_DATA_2BIT;

    /*启用 SECDED */
    BF_SET (SL_CANREG->CTL、CAN_CTRL_SECDED_EN、CAN_CTRL_SECDED_START、CAN_CTRL_SECDED_LENGTH);

    //(void) sl_FLAG_SET (testType);

    /*创建错误*/
    ramread32 =*数据;
    //sciSendByte (sciREG1、(uint8_t)(*数据>>>24);
    //sciSendByte (sciREG1、(uint8_t)(*数据>>>16);
    //sciSendByte (sciREG1、(uint8_t)(*数据>>>8);
    //sciSendByte (sciREG1、(uint8_t)* data);

    //sciSendByte (sciREG1、(uint8_t)(SL_canREG->ECCDIAG_STAT>>8);
    //sciSendByte (sciREG1、(uint8_t) sl_canREG->ECCDIAG_STAT);

    if (GET_ESM_BIT_NUM (ESM_G1ERR_CAN1_ECC_SBERR)==
    (esmREG->SR7[0]和 GET_ESM_BIT_NUM (ESM_G1ERR_CAN1_ECC_SBERR)){
    testPassed = true;
    /*清除 ESM 错误状态*/
    esmREG->SR7[0]|= GET_ESM_BIT_NUM (ESM_G1ERR_CAN1_ECC_SBERR);
    }

    if (GET_ESM_BIT_NUM (ESM_G1ERR_CAN1_ECC_Uncorr)==
    (esmREG->SR1[0]和 GET_ESM_BIT_NUM (ESM_G1ERR_CAN1_ECC_Uncorr)){
    testPassed = true;
    /*清除 ESM 错误状态*/
    esmREG->SR1[0]|= GET_ESM_BIT_NUM (ESM_G1ERR_CAN1_ECC_Uncorr);
    }


    //添加以下内容以停止优化 ramread32
    ramread32 = ramread32;

    /*禁用 SECDED -在 CANCTL 中写入 PMD */
    BF_SET (SL_CANREG->CTL、CAN_CTRL_SECDED_DIS、CAN_CTRL_SECDED_START、CAN_CTRL_SECDED_LENGTH);

    /CCF MCU sbit 不清除任何 ECC_CS 或 ECCDIAG_STAT 错误状态位
    /*清除 single-bit 错误状态*/
    //SL_canREG->ECC_CS = BIT (CAN_ECC_SBERR);
    //SL_CANREG->ECCDIAG_STAT =位(CAN_ECC_SBERR);

    /*清除双位错误状态*/
    //SL_CANREG->ECC_CS = BIT (CAN_ECC_Uncorr_ERR);
    //SL_CANREG->ECCDIAG_STAT =位(CAN_ECC_Uncorr_ERR);

    /*禁用 SECDED -在 CANCTL 中写入 PMD */
    BF_SET (SL_CANREG->CTL、CAN_CTRL_SECDED_DIS、CAN_CTRL_SECDED_START、CAN_CTRL_SECDED_LENGTH);
    /*恢复数据;在其它情况下,应自动更正数据。 */
    *data = dataVal ;
    /*启用 SECDED */
    BF_SET (SL_CANREG->CTL、CAN_CTRL_SECDED_EN、CAN_CTRL_SECDED_START、CAN_CTRL_SECDED_LENGTH);

    /*禁用诊断模式*/
    BF_SET (SL_CANREG->ECCDIAG、CAN_ECCDIAG_SECDED_DIS、0、4);
    /*禁用 RAM 直接访问(RDA)*/
    BIT_CLEAR (SL_CANREG->TEST、BIT (CAN_TEST_RDA_EN);

    返回测试已通过;

    }

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

    您好!

    上周我在度假、我来验证您的代码并退款。

    --

    谢谢。此致、
    Jagadish。

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

    您好、Cameron、

    我上周在度假、所以没有机会查看您的代码。 我现在开始验证、并很快提供更新。

    --

    谢谢。此致、
    Jagadish。

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

    您好、Cameron、

    我没有在调试模式下运行,而我使用 RDA 进行测试

    如何验证错误标志(SEFLG 和 DEFLG )位、我可以看到您的代码没有正确使用任何串行打印选项?因此、您必须 正确验证调试模式下的标志状态?  

    您能否尝试创建 can_flip_data_1位并通过 SCI 通信发送错误标志?

    --

    谢谢。此致、
    Jagadish。

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

    实际上、在运行上述代码后、我将使用 SCI 发送包含 ECC_CS 和 ECCDIAG_STAT 内容的串行输出。 他们继续显示经常设置 DEFLG 而不是 SEFLG。

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

    您好、Cameron、

    因此、您的意思是、即使您使用  CAN_FLIP_DATA_1bit 翻转一位、也会收到"DEFLG"错误吗?

    在调用测试函数的地方、还有一件事是在 while (1)内部调用、还是在调用 while (1)外部调用 、如下所示。

    --

    谢谢。此致、
    Jagadish。

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

    正确、我使用 CAN_FLIP_DATA_1位(等于1)翻转单个位、并且我不调用 while 环路内的测试函数。

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

    您好、Cameron、

    我可以看到您提到的问题、对于它正在发生的一些问题。 在提供更新之前、让我在内部团队中进一步调试并与进行讨论。

    --

    谢谢。此致、
    Jagadish。

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

    您好、Cameron、

    内部团队说、如果我们更改数据位、它也可能更改这两个 ECC 位。 因此、我们应检查观察到的其他更改位是否为 ECC。

    --

    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    我已经确保测试期间数据中只有位0被改变。 我收集了几项试验的数据以如下所示,  在每次试验之间循环能量。

    试验1:

    ECC_CS:DEFLG 未被置位。 SEFLG 也被置位。

    ECCDIAG_STAT:DEFLG 未被置位。 SEFLG 也被置位。

    损坏前的数据备份(dataVal ): 5b3dff5d.

    损坏后的数据(ramread32):5b3dff5c

    试验2:

    ECC_CS: DEFLG 已置位。 SEFLG 未被置位。

    ECCDIAG_STAT:DEFLG 被置位。 SEFLG 未被置位。

    损坏前的数据备份(dataVal ): 593dff5d.

    损坏后的数据(ramread32):593dff5c

    试验 3

    ECC_CS: DEFLG 已置位。 SEFLG  未被 置位。

    ECCDIAG_STAT:DEFLG 被置位。 SEFLG  未被 置位。

    损坏前的数据备份(dataVal ): 533dff5d.

    损坏后的数据(ramread32):533dff5c

    试验 4

    ECC_CS: DEFLG 未被 置位。 SEFLG  也被置位。

    ECCDIAG_STAT:DEFLG 未被 置位。 SEFLG  也被置位。

    损坏前的数据备份(dataVal ): 533dff5d.

    损坏后的数据(ramread32):533dff5c

    试验 5

    ECC_CS: DEFLG 已 置位。 SEFLG 未被 置位。

    ECCDIAG_STAT:DEFLG 被 置位。 SEFLG 未被 置位。

    损坏前的数据备份(dataVal ): 791dfe5d.

    损坏后的数据(ramread32): 791dfe5c

    试用 6

    ECC_CS: DEFLG 已 置位。 SEFLG 未被 置位。

    ECCDIAG_STAT:DEFLG 被 置位。 SEFLG 未被 置位。

    损坏前的数据备份(dataVal ): 733dff5d.

    损坏后的数据(ramread32): 733dff5c

    试用 7

    ECC_CS: DEFLG 已 置位。 SEFLG 未被 置位。

    ECCDIAG_STAT:DEFLG 被 置位。 SEFLG 未被 置位。

    损坏前的数据备份(dataVal ): 593dff5d.

    损坏后的数据(ramread32): 593dff5c

    试用 8

    ECC_CS: DEFLG 未被 置位。 SEFLG  也被置位。

    ECCDIAG_STAT:DEFLG 未被 置位。 SEFLG  也被置位。

    损坏前的数据备份(dataVal ): 513dff5d.

    损坏后的数据(ramread32): 513dff5c

    试用 9

    ECC_CS: DEFLG 已 置位。 SEFLG 未被 置位。

    ECCDIAG_STAT:DEFLG 被 置位。 SEFLG 未被 置位。

    损坏前的数据备份(dataVal ): 513dff5d.

    损坏后的数据(ramread32): 513dff5c

    试用 10

    ECC_CS: DEFLG 已 置位。 SEFLG 未被 置位。

    ECCDIAG_STAT:DEFLG 被 置位。 SEFLG 未被 置位。

    损坏前的数据备份(dataVal ): 5b3dfe5d.

    损坏后的数据(ramread32): 5b3dfe5c

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

    您好、Cameron、

    感谢您提供更多数据。 与 DCAN RAM 的 SECDED 完全一致。

    请给我一些时间与内部团队进行讨论、然后重新讨论。

    --

    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    有任何更新?

    谢谢。

    Cameron

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

    您好、Cameron、

    很抱歉耽误你的时间、我正在就此联系内部团队。 请预计会有一些延迟。

    --

    谢谢。此致、
    Jagadish。

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

    谢谢您告诉我。 感谢您提供的任何帮助。

    Cameron

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

    您好、Cameron、

    感谢您的耐心等待、我将尽量在本周结束之前获得内部团队的回应、我们可以在本周内解决该问题。

    --

    谢谢。此致、
    Jagadish。

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

    您好、Cameron、您好、Jagadish、

    我们只是想让您知道、我们看到了 CAN ECC 的类似问题。
    在测试 ECC 和删除注入的 ECC 错误时、我们得到的 ESM 1bit 和2bit ESM 错误通常似乎无法正常工作。
    为了解决这个问题、我们目前只需要重置2位 erro。 测试完成后、作为清理步骤、我们会自动初始化 CAN-RAM。 (仅在上电期间进行测试)

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

    感谢您的更新、Max。 我想请问您如何实现 CAN RAM 的自动初始化吗?

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

    当然可以。 请注意、在激活 ECC 后和执行测试之前应完成自动初始化。
    这不能解决注入1位错误时的2位错误。 至少对我们来说是这样。

    再次使用 auto init 仅能在测试完成后清理 CAN RAM。
    这就是说,你必须做以下事情:

    1.在 MINITGCR 寄存器中启用"全局存储器硬件初始化"(TRM 第2.5.1.21章)
    2.设置 MSINENA 寄存器中用于激活 CAN-RAM 中的自动初始化 的位(TRM 第2.5.1.22章)
    3等待 MSTCGSTAT 寄存器中的 MINIDONE 位被置位 (TRM 第2.5.1.23章)
    4.开启自动初始化功能

    TRM 2.2.4.2中介绍了该序列。您需要使用表2-7来确定要设置的位

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

    大家好、Max 和 Jagadish、

    我 在激活 ECC 后和运行测试之前添加了 CAN RAM 的自动初始化、这似乎在最后解决了问题

    非常感谢您的帮助、

    Cameron