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:DCAN 单位 ECC 错误检测问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1043080/tms570lc4357-dcan-single-bit-ecc-error-detection-issue

器件型号:TMS570LC4357

我们将针对单位和双位错误检测实施 DCAN ECC 测试。 在我们的实施中引用和使用 SafeTI 诊断库代码。

双位 ECC 错误工作正常、但对于单位类型、只能用于首次调用任何 DCAN (1/2/3/4)、当我们 调用 DCAN ECC 针对单位 ECC 功能的自检时  
第二次它只在 ECC CS 寄存器中设置 DEFLG (双位标志)、而不设置 SEFLG (单位标志)。
您能不能帮您解释一下为什么它设置双位而不是单位。  

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

    您好 Dhana、

    如果在与最后一个单位错误相同的位置检测到信号位 ECC 错误、则不会设置 SEFLG。  

    但不应针对单位 ECC 错误设置 DEFLG。

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

    您好、Wang、

    感谢您的回答。 为4个 DCAN 使用不同的 dcanrambase 地址、并尝试在不同的 RAM 位置读取。
    仍然看到 single-bit ECC 测试不起作用。 并观察到、在每个 DCAN ECC 测试后调用_memInit_函数时、它工作正常。
    但它会清除所有以前的全局数据。

    您能不能建议、在测试所有4个 DCAN ECC 测试时、如何使用不同的位置为每个 DAN 设置 ECC 错误。

    谢谢

    Dhanalakshmi

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

    是的、在访问 DCAN 消息 RAM 之前、应该先对其进行初始化以使 ECC 错误无效。

    如果您使用安全诊断库的 sl_DCAN-Selftest(),则不容易将 ECC 注入不同的位置。 您可以编写自己的代码来注入 ECC 错误:

    易失性 uint32*数据;

    对于(i=1;i<3;i++){

       数据=(易失性 uint32 *)(canRAM1+ I * 0x20u + 0x4);

       CANREG1->CTL = 0x5 << 10; //PMD = 0x5、禁用 SECDED

       canREG1->CTL |= (1 << 7);//启用测试模式

       canREG1->CTL |=(1 << 0)//init 位

       canREG1->test |= (1 << 9);//启用对 RAM 的直接访问

       canREG1->ECCDIAG = 0x5;//启用 ECC 诊断模式

       CANREG1->ECC_CS = 0x5 << 24; //启用 SECDED 单个位错误  

       canREG1->CTL &=~(0xF <<10);

       CANREG1->CTL |=(0xA <<10); //启用 SECDED

       daraRead =*数据;

       检查 ESM 寄存器和 CAN 状态寄存器;

       清除错误标志

      }

    您将看到第二个位置的错误

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

    您好、Wang、

    谢谢你。 我尝试使用以下行而不是安全 库(sl_selftest.c)代码行[ data =(volatile UINT32 *)(((((uint32) dcanRAMBase)+(msgNo* 0x20u)));
    Data++;]、它现在适用于所有 DCAN 单个位。 我观察  到在 sl_select.c  代码中使用 uint32将 dcanRAMBase 拼写错误增加1个字节(32位)、在1个字节以下增加4个字节。  例如 、如果 dcanRAMBase 地址= 0xFF1E0000;下面一行的代码偏移量更改为0xFF1E0110、而不是0xFF1E0044、则正常工作。  

    数据=(易失性 uint32 *)(canRAM1+ msgNo  * 0x20u + 0x4);其中 msgNo = 2U

    谢谢

    DhanaLakshmi