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:闪存 ECC 自检中断问题

Guru**** 2535450 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/597324/f28m36p63c2-problem-with-flash-ecc-self-test-interrupt

器件型号:F28M36P63C2

您好!

我正在为协奏曲器件实施 ECC 自检例程。 我按照数据表中的详细说明操作、但在进入中断"单个闪存错误"时遇到问题。 在分步调试中、即使在启用 ECC 测试模式时 PIEFR12被正确设置为2、程序也永远不会进入 ISR。 代码执行一直停留在无条件循环中。 请参阅随附的代码并提出建议。

#pragma DATA_SECTION (gFlashAECCTest、"FlashAECCTestFile");
uint32_t gFlashAECCTest;

#pragma DATA_SECTION (gFlashBECCTest、"FlashBECCTestFile");
uint32_t gFlashBECTEST;

systemControlError_t testFlashECCLogic (const uint32_t * address、const eccFlashTestType_t testType){
   CHAR ECC;

   /*第5.3.10.3节中详述的准则*/
   EALLOW;
   ECC = Fapi_calculateEcc ((uint32_t)(address)<< 1、(uint64) 0x0000000000000000);
   FlashEccRegs.ERR_THRESHOLD.bit.ERR_THRESHOLD = 1;/*不能为0 -请参阅器件勘误表*/
   FlashEccRegs.FADDR_TEST.bit.ADDR =(testType = test_address_single_bit)? (uint32_t)(address)^ 0x1:(uint32_t)(address);
   FlashEccRegs.FDATAH_TEST =(testType = TEST_DATA_SINGLE_BIT)? 0x00000001:0x00000000;
   FlashEccRegs.FDATAL_TEST =(testType = TEST_DATAL_SINGLE_BIT)? 0x00000001:0x00000000;
   FlashEccRegs.fecc_test.bit.ecc =(testType = test_ecc_single_bit)? ECC ^ 0x1:ECC;
   FlashEccRegs.FECC_CTRL.bit.ECC_SELECT =(testType = test_DATA_Single_bit)? 0:1;
   FlashEccRegs.FECC_CTRL.bit.ECC_TEST_EN = 1;
   EDIS;

   asm (" NOP");

   EALLOW;
   FlashEccRegs.FECC_CTRL.bit.ECC_TEST_EN = 0;
   FlashEccRegs.ERR_CNT.bit.ERR_CNT = 0;
   EDIS;

   返回 SYS_CTL_NO_ERROR;

systemControlError_t testFlashBank (const uint32_t *地址){
   systemControlError_t ret;

   if ((ret = testFlashECCLogic (address、test_address_single_bit))< 0) return;
   if ((ret = testFlashECCLogic (address、test_DATA_Single_bit))< 0) return;
   if ((ret = testFlashECCLogic (address、test_DATA_single_bit))< 0) return;
   if ((ret = testFlashECCLogic (address、test_ecc_single_bit))< 0) return;

   返回 SYS_CTL_NO_ERROR;

systemControlError_t flashSelfTest (void){
   systemControlError_t ret;

   enableFlashECC();
   if ((ret = testFlashBank (&gFlashAECCTest))< 0) return;
   if ((ret = testFlashBank (&gFlashBECCTest))< 0) return;

   返回 SYS_CTL_NO_ERROR;

systemControlError_t 初始化 ECC (void){
   systemControlError_t 错误;

   /*直接中断信号到 ISR */
   EALLOW;
   PieVectTable.CFLSINGERR =&flashSingleError;
   PieVectTable.CRAMSINGERR =斜升错误(ramSingleError);
   EDIS;

   //启用 PIE
   PieCtrlRegs.PIECTRL.bit.ENPIE = 1;

   PieCtrlRegs.PIEIER12.bit.INTx2 = 1;   //启用 PIE 组12 INT2 (闪存单个错误)
   PieCtrlRegs.PIEIER12.bit.INTx4 = 1;   //启用 PIE 组12 INT4 (RAM 单错误)

   PieCtrlRegs.PIEACK.all = M_INT12;//启用 PIE 中的嵌套
   asm (" NOP");//等待 PIEACK 退出流水线参考 使用说明勘误表 SPRZ272H

   IER |= M_INT12;

   //启用全局中断和更高优先级的实时调试事件:
   EINT;  //启用全局中断 INTM
   ERTM;   //启用全局实时中断 DBGM

   //首先,我们验证 ECC 模块“SECDED”是否正常工作
   //我们将 RAM 置于测试模式并注入一些错误...
  // if ((err = RAMECCSelfTest ()< 0){
  //   DINT;  //禁用全局中断 INTM
  //   DRTM;   //禁用全局实时中断 DBGM
  //   返回错误;
  //}

   if ((err = flashSelfTest())<0){
      DINT;  //禁用全局中断 INTM
      DRTM;   //禁用全局实时中断 DBGM
      退货错误;
   }

   DINT;  //禁用全局中断 INTM
   DRTM;   //禁用全局实时中断 DBGM

   返回 SYS_CTL_NO_ERROR;

中断空 flashSingleError (void){
   EALLOW;
   gFlashECCSingleErrorAddress = FlashEccRegs.Single_ERR_ADDR;
   gFlashECrorStatus = FlashEccRegs.ERR_STATUS.all;
   gFlashECrrorPositionReg = FlashEccRegs.ERR_POS.ALL;
   gFlashCorrectedErrorCounter++;
   FlashEccRegs.FECC_CTRL.bit.ECC_TEST_EN = 0;
   EDIS;

我的 cmd 文件:

  FlashAECCTestFile                :> FLASHA、                PAGE = 0、         ALIGN (4)
  FlashBECCTestFile                :> FLASHB、                PAGE = 0、         ALIGN (4)

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

    我写信告诉您、C2000团队成员已被分配到您的职位、应该马上回答。

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

    Cedric、

    您是从 RAM 还是闪存执行此代码?

    您的代码停留在什么无条件循环中?  是否可以附加快照?

    谢谢、此致、

    Vamsi

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

    Cedric、

    我在您的代码中注意到的几件事:

    1、ECC_SELECT 的值应该根据地址而不是数据来分配。  

      如果地址属于128位对齐存储器位置的低64位、则 ECC_SELECT 应为0。  

      如果地址属于128位对齐存储器位置的高64位、则 ECC_SELECT 应为1。

      例如:

      如果地址为0x100000、ECC_SELECT 应该为0。

      如果地址为0x100004、则 ECC_SELECT 应为1。

    FDATAH_TEST 和 FDATAL_TEST 寄存器一起为给定地址的 ECC 逻辑提供64位数据。

      例如、如果地址为0x100000、

      FDATAL_TEST 应使用地址0x100000和0x100001 (32位格式)的数据进行初始化

      FDATAH_TEST 应使用地址0x100002和0x100003的数据进行初始化。

    3. 当您进行分步调试时,启用 ECC 测试模式后,您可能不会立即进入 ISR。  进入 ISR 需要几个周期。  如果您不等待 ISR、而是继续下一轮 ECC 测试、ECC 寄存器可能会更新为新的错误详细信息。  因此、在启用 ECC 测试模式后、不要进入下一轮 ECC 测试、而是在循环中等待一个变量在 ISR 中更新。  清除 ISR 中的 ECC_TEST_EN 位和 ERR_CNT。 请参阅下面的示例。  

    //为 ECC 评估选择低64位并启用 ECC 测试模式
    //
    FlashEccRegs.FECC_CTRL.bit.ECC_SELECT = 0;
    FlashECCRegs.FECC_CTRL.bit.ECC_TEST_EN = 1;
    
    //等待单位中断 ISR 被处理
    //
    while (SingleInterruptISRTErraken!= 1)=
    0;// SingleInterruptInterruptISR; 

    ISR 可以是:

    中断空 Flash_SingleError_ISR (空)
    {
    
    EALLOW;
    FlashSingleErrorISR_COUNT++;
    
    FlashEccRegs.FECC_CTRL.bit.ECC_TEST_EN = 0;
    FlashEccRegs.ERR_STATUS_CLR.bit.FAIL0CLR = 1;
    FlashEccRegs.ERR_STATUS_CLR.bit.FAIL1CLR = 1;
    FlashEccRegs.ERR_INTCLR.bit.Single_ERR_INTCLR = 1;
    FlashEccRegs.ERR_CNT.bit.ERR_CNT = 0;
    
    SingleErrptIntrISRTaken = 1;
    
    PieCtrlRegs.PIEACK.ALL |= 0x800;//发出 PIE ACK
    
    } 

    谢谢、此致、

    Vamsi

     

     

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

    感谢您的详细回答。 我的代码从闪存运行。 让我执行您的建议、我将与您联系、以便跟进。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Vamsi、

    我对函数进行了一些修改、创建了一 个非法的 ISR 函数。 在   FlashEccRegs.FECC_CTRL.bit.ECC_TEST_EN = 1后、我进入非法的 ISR 函数耦合时钟周期;

    这是更新后的函数。

    systemControlError_t testFlashECCLogic (const uint32_t * address、const eccFlashTestType_t testType){
       CHAR ECC;
       uint64 testPattern = 0;
       gFlashSingleErrorISRTaken = false;

       /*第5.3.10.3节中详述的准则*/
       EALLOW;
       ECC = fapi_calculateEcc ((uint32_t)(address)<< 1、testPattern);
       FlashEccRegs.ERR_THRESHOLD.bit.ERR_THRESHOLD = 1;/*不能为0 -请参阅器件勘误表*/
       FlashEccRegs.FADDR_TEST.bit.ADDR =(testType = test_address_single_bit)? (uint32_t)(address)^ 0x1:(uint32_t)(address);//通过切换一个位来破坏地址
       FlashEccRegs.FDATAH_TEST =(testPattern >> 32 & 0xFFFFFFFF)^(testType = TEST_DATA_SINGLE_BIT)? 0x00000001:0x00000000;//通过切换一个位来损坏数据
       FlashEccRegs.FDATAL_TEST =(testPattern & 0xFFFFFFFF)^(testType = test_DATAL_single_bit)? 0x00000001:0x00000000;//通过切换一个位来损坏数据
       FlashEccRegs.fecc_test.bit.ecc =(testType = test_ecc_single_bit)? ECC ^ 0x1:ECC;//通过切换一个位来破坏 ECC
       //闪存存储器是128位对齐的。 如果传递的地址在64 MSB 中、则必须将 ECC_SELECT 设置为1、否则设置为0。
       FlashEccRegs.Fecc_CTRL.bit.ecc_select =((uint32_t)(地址)& 0x4)? 1:0;
       FlashEccRegs.FECC_CTRL.bit.ECC_TEST_EN = 1;
       EDIS;

       while (!gFlashSingleErrorISRTaken);

       返回 SYS_CTL_NO_ERROR;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    根据该寄存器、它会产生不可纠正的错误、并按预期生成 NMI。 我的问题是、为什么...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我将添加一个新的屏幕截图、以表示在询问 DATAL (TEST_DATA_SINGLE_BIT)时遇到的错误。 上面的屏幕截图是 地址失败(test_address_single_bit)导致的。 在 I step FlashEccRegs.FECC_CTRL.bit.ECC_TEST_EN = 1之后。

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

    Cedric、

    TRM 的第5.3.10.3节 SECDED 逻辑正确性检查中所述、 ECC 测试模式应与从 RAM 而非闪存执行的代码一同使用。  ECC 测试模式寄存器(FDATAH_TEST、FDATAL_TEST、FECC_TEST)与来自闪存的数据进行多路复用。 因此、启用 ECC 测试模式时、CPU 不应从闪存读取/提取数据。  

    启用此模式时要执行的任何代码都必须映射到.TI.ramfunc 段。  

    谢谢、此致、

    Vamsi  

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

    我将 ISR 和运行测试的函数移到了 RAM 中、但同样的问题仍然存在。 即使 PIEIEFR12设置为0x2、也不会触发任何 ISR。

    从输出文件:

    FlashSingleErrorRamFunc
    *         0   00139ec1   0000003a    运行 ADDR = 00008cb2
                     00139ec1   0000003a    libSystemControlC28x_F28M36x.lib:libSystemControlC28x.obj (flashSingleErrorRamFunc:retain)

    ramSingleErrorRamFunc
    *         0   00139efb   0000001f    运行 ADDR = 00008cec
                     00139efb   0000001f    libSystemControlC28x_F28M36x.lib:libSystemControlC28x.obj (ramSingleErrorRamFunc:retain)

    illegalISRRamFunc
    *         0   00139f1a   00000011    运行 ADDR = 00008d0b
                     00139f1a   00000011    libSystemControlC28x_F28M36x.lib:libSystemControlC28x.obj (illegalISRRamFunc:retain)

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

    您能否随链接器中的更改一起附加最新代码?

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

    我明白了。 中断问题是由于我的 RAM 自检、在我将闪存 ISR 例程复制到闪存后、它清除了 RAM 内容。 现在一切都按预期工作。 谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Vamsi、


    现在、我的中断正常工作、但我不理解一些自检的结果。 我将使用以下例程自检闪存 ECC。 对于每个闪存组、我依次测试单个位地址错误、数据高单个位错误、数据低单个位错误和 ECC 单个位错误。 下面是我得到的结果、我用红色突出显示了我认为可疑的结果:

    • 地址0x0013E5C4 (FLASHA):
      • test_address_single_bit:生成单错误闪存 ISR
      • TEST_DATA_Single_Bit:生成单错误闪存 ISR
      • TEST_DATA_Single_Bit:生成单错误闪存 ISR
      • TEST_ECC_SINGLE_BIT:生成不可纠正的错误 ISR (NMI)
    • 地址0x0013C000 (FLASHB):
      • test_address_single_bit:生成单错误闪存 ISR
      • TEST_DATA_Single_Bit:生成单错误闪存 ISR
      • TEST_DATA_Single_Bit:生成不可纠正的错误 ISR (NMI)
      • TEST_ECC_SINGLE_BIT:生成不可纠正的错误 ISR (NMI)
    • 地址0x0013A000 (FLASHC):
      • test_address_single_bit:生成单错误闪存 ISR
      • TEST_DATA_Single_Bit:生成不可纠正的错误 ISR (NMI)
      • TEST_DATA_Single_Bit:生成不可纠正的错误 ISR (NMI)
      • TEST_ECC_SINGLE_BIT:生成不可纠正的错误 ISR (NMI)
    • 地址0x00139F8C (FLASHD):
      • TEST_ADDRESS_SINGLE_BIT:生成不可纠正的错误 ISR (NMI)
      • TEST_DATA_Single_Bit:生成不可纠正的错误 ISR (NMI)
      • TEST_DATA_Single_Bit:生成不可纠正的错误 ISR (NMI)
      • TEST_ECC_SINGLE_BIT:生成不可纠正的错误 ISR (NMI)
    • 地址0x00133180 (FLASHE):
      • TEST_ADDRESS_SINGLE_BIT:生成不可纠正的错误 ISR (NMI)
      • TEST_DATA_Single_Bit:生成单错误闪存 ISR
      • TEST_DATA_Single_Bit:生成单错误闪存 ISR
      • TEST_ECC_SINGLE_BIT:生成不可纠正的错误 ISR (NMI)
    • 地址0x00128000 (FLASHF):
      • TEST_ADDRESS_SINGLE_BIT:生成单错误闪存 ISR
      • TEST_DATA_Single_Bit:生成单错误闪存 ISR
      • TEST_DATA_Single_Bit:生成不可纠正的错误 ISR (NMI)
      • TEST_ECC_SINGLE_BIT:生成不可纠正的错误 ISR (NMI)


    对于其他扇区...

    代码如下:

    systemControlError_t testFlashECCLogic (const uint32_t * address、const eccFlashTestType_t testType){
       CHAR ECC;
       uint64 testPattern = 0;
       gFlashSingleErrorISRTaken = false;
       gFlashUncorrectableErrorISRTaken = false;

       /*第5.3.10.3节中详述的准则*/
       EALLOW;
       ECC = fapi_calculateEcc ((uint32_t)(address)<< 1、testPattern);
       FlashEccRegs.ERR_THRESHOLD.bit.ERR_THRESHOLD = 1;/*不能为0 -请参阅器件勘误表*/
       FlashEccRegs.FADDR_TEST.bit.ADDR =(testType = test_address_single_bit)? (uint32_t)(address)^ 0x1:(uint32_t)(address);//通过切换一个位来破坏地址
       FlashEccRegs.FDATAH_TEST =(testPattern >> 32 & 0xFFFFFFFF)^(testType = TEST_DATA_SINGLE_BIT)? 0x00000001:0x00000000;//通过切换一个位来损坏数据
       FlashEccRegs.FDATAL_TEST =(testPattern & 0xFFFFFFFF)^(testType = test_DATAL_single_bit)? 0x00000001:0x00000000;//通过切换一个位来损坏数据
       FlashEccRegs.fecc_test.bit.ecc =(testType = test_ecc_single_bit)? ECC ^ 0x1:ECC;//通过切换一个位来破坏 ECC

       //为 ECC 评估选择低64位并启用 ECC 测试模式
       FlashEccRegs.FECC_CTRL.bit.ECC_SELECT = 0;
       FlashEccRegs.FECC_CTRL.bit.ECC_TEST_EN = 1;//启用闪存测试模式
       EDIS;

       while (!gFlashSingleErrorISRT&&!gFlashUncorrectableErrorISRTaken);

       返回 SYS_CTL_NO_ERROR;


    systemControlError_t testFlashBank (const uint32_t *地址){
       systemControlError_t ret;

       if ((ret = testFlashECCLogic (address、test_address_single_bit))< 0) return;
       if ((ret = testFlashECCLogic (address、test_DATA_Single_bit))< 0) return;
       if ((ret = testFlashECCLogic (address、test_DATA_single_bit))< 0) return;
       if ((ret = testFlashECCLogic (address、test_ecc_single_bit))< 0) return;

       返回 SYS_CTL_NO_ERROR;


    systemControlError_t flashSelfTest (void){
       systemControlError_t ret;

       memcpy (&flashSingleErrorRamFuncRunStart、&flashSingleErrorRamFuncpLoadStart、(size_t)&flashSingleErrorRamFuncLoadSize);
       memcpy (&testFlashBankRamFuncRunStart、&testFlashBankRamFuncLoadStart、(size_t)&testFlashBankRamFuncLoadSize);
       memcpy (&testFlashECLogicRamFuncRunStart、&testFlashECLogicRamFuncLoadStart、(size_t)&testFlashECLogicRamFuncLoadSize);
       memcpy (&testMemoryUncorrectableErrorRamFuncRunStart、&testMemoryUncorrectableErrorRamFuncLoadStart、(size_t)&testMemoryUncorrectableErrorRamFunRamcLoadSize);

       /*直接中断信号到 ISR */
       EALLOW;
       PieVectTable.CFLSINGERR =&flashSingleError;
       PieVectTable.NMI =&testMemoryUncorrectableError;
       EDIS;

       PieCtrlRegs.PIEIER12.bit.INTx2 = 1;   //启用 PIE 组12 INT2 (闪存单个错误)

       PieCtrlRegs.PIEACK.all = M_INT12;//启用 PIE 中的嵌套
       asm (" NOP");//等待 PIEACK 退出流水线参考 使用说明勘误表 SPRZ272H

       IER |= M_INT12;

       //启用全局中断和更高优先级的实时调试事件:
       EINT;  //启用全局中断 INTM
       ERTM;   //启用全局实时中断 DBGM

       enableFlashECC();
       if (((ret = testFlashBank ((uint32_t *)&gFlashAECCTest))< 0){
          DINT;  //禁用全局中断 INTM
          DRTM;   //禁用全局实时中断 DBGM
          回程;
       }

       if (((ret = testFlashBank ((uint32_t *)&gFlashBECCTest))< 0){
          DINT;  //禁用全局中断 INTM
          DRTM;   //禁用全局实时中断 DBGM
          回程;
       }

       if (((ret = testFlashBank ((uint32_t *)&gFlashCECCTest))< 0){
          DINT;  //禁用全局中断 INTM
          DRTM;   //禁用全局实时中断 DBGM
          回程;
       }

    [...]


    //重路由 NMI ISR 以进行测试

    中断 void testMemoryUncorrectableError (void){
       ASM ("     ESTOP0");
       EALLOW;
       gFlashECrorStatus = FlashEccRegs.ERR_STATUS.all;
       gFlashECrrorPositionReg = FlashEccRegs.ERR_POS.ALL;
       FlashEccRegs.FECC_CTRL.bit.ECC_TEST_EN = 0;
       FlashEccRegs.ERR_STATUS_CLR.bit.FAIL0CLR = 1;
       FlashEccRegs.ERR_STATUS_CLR.bit.FAIL1CLR = 1;
       FlashEccRegs.ERR_STATUS_CLR.bit.UNCHRCLR = 1;
       FlashEccRegs.ERR_INTCLR.bit.UNC_ERR_INTCLR = 1;
       FlashEccRegs.ERR_CNT.bit.ERR_CNT = 0;
       NmiIntruptRegs.NMIFLGCLR.bit.C28FLLUNCERR = 1;
       NmiIntruptRegs.NMIFLGCLR.bit.NMIINT = 1;
       EDIS;

       gFlashUncorrectableErrorISRTaken = true;


    中断空 flashSingleError (void){
       EALLOW;
       gFlashCorrectedErrorCounter++;

       gFlashECCSingleErrorAddress = FlashEccRegs.Single_ERR_ADDR;
       gFlashECrorStatus = FlashEccRegs.ERR_STATUS.all;
       gFlashECrrorPositionReg = FlashEccRegs.ERR_POS.ALL;
       FlashEccRegs.FECC_CTRL.bit.ECC_TEST_EN = 0;
       FlashEccRegs.ERR_STATUS_CLR.bit.FAIL0CLR = 1;
       FlashEccRegs.ERR_STATUS_CLR.bit.FAIL1CLR = 1;
       FlashEccRegs.ERR_INTCLR.bit.Single_ERR_INTCLR = 1;
       FlashEccRegs.ERR_CNT.bit.ERR_CNT = 0;

       gFlashSingleErrorISRTaken = true;

       PieCtrlRegs.PIEACK.ALL |= M_INT12;
       EDIS;

    感谢您的帮助!

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

    Cedric、

    我之前尝试过 ECC 测试模式、它工作正常。  

    我今天可能无法检查您的代码。  几天后会回来。

    谢谢、此致、
    Vamsi  

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

    您能否共享写入 ECC 测试模式寄存器的实际值、而不是代码?
    这对我来说很容易分析。

    注:如 TRM 中所述、地址中的错误始终会生成不可纠正的错误、而不是单个位错误。

    谢谢、此致、
    Vamsi
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否希望上面显示的每个案例的 FlashEccRegs 观察视图?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Cedric、

    请提供您在每种情况下用于以下寄存器的值。
    FECC_CTRL
    FADDR_TEST
    FDATAH_TEST
    FDATAL_TEST
    FECC_TEST

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

    您好、Vamsi、

    我已附上前8项结果的结果。 如果找不到趋势,我可以再添加一些趋势。

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

    Cedric、

    我们的一名团队成员正在尝试使用您的数据复制结果。 将为您提供最新信息。

    谢谢、此致、
    Vamsi

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

    Cedric、

    对于每个快照、您能否提供正确值(地址或数据或 ECC)等详细信息、以及您合并的错误是什么? 如果没有此信息、我无法在测试寄存器配置上对齐以进行进一步调试。

    谢谢、此致、
    Vamsi

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

    您好、Vamsi、

    屏幕截图显示了以下内容的顺序测试:

    • FLASHA、错误注入地址(良好地址为0x3E414)
    • FLASHA、错误注入数据 LSB (正确的数据为0)
    • FLASHA、错误注入数据 MSB (正确的数据为0)
    • FLASHA、ECC 中注入的错误(正确数据为0)
    • FLASHB、错误注入地址(良好地址为0x3C000)
    • FLASHB、错误注入数据 LSB (正确的数据为0)
    • FLASHB、错误注入数据 MSB (正确的数据为0)
    • FLASHB、ECC 中注入的错误(正确数据为0)

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

    Cedric、

    考虑到以上列表中提到的第一个测试(FLASHA、错误注入地址-良好地址为0x3E414)、0x3E414是一个有效的闪存地址吗? 请检查 TRM 中 FADDR_TEST 寄存器的说明(第5.4.4.13节 ECC 测试地址寄存器- FADDR_TEST)。  

    您是否考虑将0x13E414作为正确的地址?  如果是、则必须将地址左移1位并在 FADDR_TEST 寄存器中写入0x27C828。

    此外、您可能已经在 TRM 中注意到"当从组获取的64个数据位和相关 ECC 位全部为1或0时、将绕过 ECC 逻辑。"

    希望这对您有所帮助。

    谢谢、此致、
    Vamsi

      

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

    感谢您的说明。 如果我从闪存 API 调用 fapi_remapEccAddress(),我似乎得到了正确的行为。 此外、另一个奇怪的现象是、Fapi_calculateEcc 返回的 ECC 值始终为0。 在此之前,我已经调用了函数 Fapi_initializeAPI(),并将整个 Fapi 复制到 RAM。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    因此我认为我已经解决了我的问题:Fapi_calculateEcc()返回0。 需要定义符号_Concerto,现在它将返回非零值。 (我包含了 F021.h 而不是 F021_Concerto C28x.h)。
    此外、是的、我传递的地址属于 FLASHA、为0x13E414。 当我将该地址馈送到 Fapi_remapEccAddress()时,我得到0xFFFFFFE 作为返回值。 我可能会误解此函数的用途。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    另一个问题,我是否必须使用 FADDR_TEST.ALL 或 FADDR_TEST.bit.ADDR?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的,它现在可以工作了,问题是我是用 FADDR_TEST.bit.ADDR 而不是.all 写入... 正如您提到的,测试模式需要不同于0和 FFFF ....

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

    如果只对 ADDR 位域执行写操作、则需要丢弃 TRM 寄存器说明中提到的地址的3个最低有效位。

    很高兴现在一切都正常。

    谢谢、此致、
    Vamsi
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、当我在数据表中看到它时、我就会发现它! )
    再次感谢所有的支持! 我希望这能为他人服务!