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.

[参考译文] F28M36P63C2:RAM ECC 自检、错误计数器存在问题。

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/596625/f28m36p63c2-ram-ecc-self-test-problem-with-error-counter

器件型号:F28M36P63C2

尊敬的 TI 员工:

我正在执行一个例程来验证 RAM 的 ECC 模块是否正常工作。 我遇到单个校正错误计数器的问题、该错误计数器不会递增... 您可以查看我的以下代码并提出建议吗? 在观察窗口中、CCETRES 被正确设置为4、 当测试模式被禁用时、gRAMTestL0..3被正确地位翻转、然后被纠正回0。

#define DEFAULT_ECC_ERROR_THRESHOLD 4.

#pragma DATA_SECTION (gRAMTestL0、"RAMTestL0File");
volatile uint32_t gRAMTestL0;

#pragma DATA_SECTION (gRAMTestL1、"RAMTestL1File");
volatile uint32_t gRAMTestL1;

#pragma DATA_SECTION (gRAMTestL2、"RAMTestL2File");
volatile uint32_t gRAMTestL2;

#pragma DATA_SECTION (gRAMTestL3、"RAMTestL3File");
volatile uint32_t gRAMTestL3;

void enableRamECC (){
   EALLOW;
   RAMErrRegs.CCETRES = DEFAULT_ECC_ERROR_THRESHOLD;      //错误阈值
   RAMErrRegs.CCEIE.bit.C28CEIE = 1;                    //设置 CCEFLG 标志时会生成可纠正的错误中断。
   EDIS;

systemControlError_t RAMSelfTest (void){

   enableRamecc();

   EALLOW;
   //初始化 RAM 以进行自检。 相应地写入0x0数据和相应的 ECC/奇偶校验位。
   RAMRegs.CLxRTESTINIT1.bit.RAMINIT_L0 = 1;
   while (!RAMRegs.CLxRINITDONE.bit.RAMINITDONE_L0);
   RAMRegs.CLxRTESTINIT1.bit.RAMINIT_L1 = 1;
   while (!RAMRegs.CLxRINITDONE.bit.RAMINITDONE_L1);
   RAMRegs.CLxRTESTINIT1.bit.RAMINIT_L2 = 1;
   while (!RAMRegs.CLxRINITDONE.bit.RAMINITDONE_L2);
   RAMRegs.CLxRTESTINIT1.bit.RAMINIT_L3 = 1;
   while (!RAMRegs.CLxRINITDONE.bit.RAMINITDONE_L3);
   EDIS;

   // ECC 错误计数器应为0
   if (RAMErrRegs.CCECNTR){
       返回 ECC_RAM_ERRCNTR_FAILURE;
   }

   //应清除 ECC 错误标志。
   if (RAMErrRegs.CCEFLG.bit.C28CEFLAG){
       返回 ECC_RAM_CEFLAG_FAILURE;
   }

   //启用 RAM 测试模式(第5.1.1.8节),禁用奇偶校验/ECC 测试
   EALLOW;
   RAMRegs.CLxRTESTINIT1.bit.ECPARTEST_L0 = 1;
   RAMRegs.CLxRTESTINIT1.bit.ECCPARTEST_L1 = 1;
   RAMRegs.CLxRTESTINIT1.bit.ECCPARTEST_L2 = 1;
   RAMRegs.CLxRTESTINIT1.bit.ECCPARTEST_L3 = 1;
   EDIS;

   //准备错误... 翻转一位以产生可纠正的错误。
   //在 RAM 测试模式中,只更新数据,而不是 ECC。
   //因此,当测试模式关闭时,ECC 模块应该捕获这些错误。
   gRAMTestL0 ^= 0x1;
   gRAMTestL1 ^= 0x1;
   gRAMTestL2 ^= 0x1;
   gRAMTestL3 ^= 0x1;

   EALLOW;
   RAMRegs.CLxRTESTINIT1.bit.ECCPARTEST_L0 = 0;
   RAMRegs.CLxRTESTINIT1.bit.ECCPARTEST_L1 = 0;
   RAMRegs.CLxRTESTINIT1.bit.ECCPARTEST_L2 = 0;
   RAMRegs.CLxRTESTINIT1.bit.ECCPARTEST_L3 = 0;
   EDIS;


   //清除 CCEFLG
   EALLOW;
   RAMErrRegs.CCECLR.bit.C28CECLR = 1;
   EDIS;

   if (gRAMTestL0 || gRAMTestL1 || gRAMTestL2 || gRAMTestL3){
      返回 ECC_RAM_FAILURE;
   }

   返回 NO_ERROR;

我的命令文件:

 RAMTestL0文件                :> RAML0,                PAGE = 0
  RAMTestL1文件                :> RAML1,                PAGE = 0
  RAMTestL2文件                :> RAML2,                PAGE = 0
  RAMTestL3文件                :> RAML3,                PAGE = 0

(笑声) 可有效地将变量放置在预期的存储器组中(通过存储器浏览器验证)。

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

    您好、Cedric、

    只是想指出、L2和 L3 RAM 在这里具有奇偶校验、而不是 ECC。

    L0和 L1具有 ECC、因此 该代码  仍应 使可纠正的错误计数递增。 我将对此进行研究。

    此致、

    Vivek Singh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    发现了错误... 只有 L0和 L1被 ECC 检查... 啊!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Vivek、

    感谢您的关注... 如何检查奇偶校验是否正常工作?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Cedric、

    如果出现奇偶校验错误、它将生成 RAM 不可纠正的 NMI (与 ECC 的2位错误相同)、用户应检查该 NMI。

    此致、

    Vivek Singh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    明白了! 这是我的理解、但我想确认这一点。 再次感谢。