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.

[参考译文] TMS320F280049:ECC 错误

Guru**** 2395845 points
Other Parts Discussed in Thread: ADS131E08, UNIFLASH

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/860773/tms320f280049-ecc-error

器件型号:TMS320F280049
主题中讨论的其他器件:ADS131E08UNIFLASH

您好、Vamsi、

我的客户遇到 ECC 导致 NMI。

它们使用 TMS320F280049PZSR,100引脚和 CCS 版本8.3.0。

这种‘发生在4个客户的电路板上、但无法复制到 controlCARD 或 Launchpad 上。(我假设我们的控制卡或 LaunchPad 未连接到某些外部电路、因此无法运行到相关代码。 因此它不会触发 ECC NMI)、所以我认为他们的代码有一些错误。

它可以由"仅 CANB 模块代码"或 "仅 SPI 模块代码"触发。

SPI 基本上与 ADS131E08进行通信。

CANA 还将采用引导加载程序功能。

仅对于 CANB 模块,、在将数据加载到 CANB 后、NMI 中断在传输过程中被触发(未完成)、并且在 NmiIntrupt 的 NMIFLG 寄存器中、 FLLUNCERR 为1。

这是可显示 ECC 错误的调试窗口。

我在其代码中搜索了闪存 API、如下所示:


状态= Fapi_initializeAPI (F021_CPU0_BASE_ADDRESS、100);

状态= Fapi_setActiveFlashBank (Fapi_FlashBank0);

状态= Fapi_issueWithCommandAddress (Fapi_EraseSector、pu32addr);

状态= Fapi_doBlankCheck (32StartStatusWord、Pudr);

状态= Fapi_issueProgrammingCommand (((uint32 *) u32Index、u16ptr+I、8、0、0、Fapi_AutoEccGeneration);

状态= Fapi_doVerify ((((uint32 *) u32Index、4、u32ptr+(I/2)、&oFlashStatusWord); 

您能否指出客户是否使用了错误的闪存 API? 但是、它可以在不使用引导加载程序的情况下触发 ECC NMI、只需运行应用程序代码即可。

如果您真的需要、客户不想共享代码。 我可以通过电子邮件与您分享。

您能不能告诉我、我应该重点关注哪些方面来找出根本原因?

BR  

Emma

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

    Emma、

    1) 1)发生闪存 ECC 错误的地址是什么? 您可以从闪存 ECC 寄存器获取此信息。  

    2) 2)一旦找到地址、请检查该地址是在运行时还是在客户生产线上由客户应用程序编程。

      如果它在运行时由客户应用程序编程、那么我们需要专注于闪存 API 的使用。

      如果在客户生产线上对其进行编程、则我们需要专注于客户使用的生产计划工具。

    确认上述问题的答案后、我可以进一步建议。

    此致、

    Vamsi

    闪存 Wiki http://processors.wiki.ti.com/index.php/C2000_Flash_FAQ

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

    您好、Vamsi、

    感谢您的快速响应。

    对于问题1:

    我们检查了两个资源箱:

    UNC_ERR_ADDR_LOW

    UNC_ERR_ADDR_HIGH

    遗憾的是、它没有固定。

    • 如果运行完整的程序、则地址相对随机、
    • 如果我阻止其他程序并且只运行 SPI 模块、它相对固定在 _c_int00 ()中。
    • 如果 我阻止其他程序并且只运行 CANB 模块、它也可能出现在_c_int00 ()中。

    对于问题2:

    这是应用程序代码、因为它们在问题板上进行调试、因此使用 JTAG 仿真器对代码进行编程。

    期待您的反馈。

    BR

    Emma

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

    Emma、

    他们使用什么工具对器件进行编程?  CCS 还是 UniFlash?

    他们是否尝试在工具中搜索更新并安装(如果有)?

    在 UniFlash 和 CCS 中、默认情况下会启用 AutoEccGeneration。  请检查是否已禁用。  应启用它以正确对 ECC 进行编程。

    谢谢、此致、

    Vamsi

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

    您好、Vamsi、

    客户使用 CCS  版本8.3.0。 选中此复选框后、将启用 AutoEccGeneration。

    他们是否可以通过更新 CCS 版本来解决此问题?

    BR

    Emma

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

    Emma、

    我认为这不是工具问题。  但是、我建议检查更新并进行安装(如果有)。

    他们是否在其应用中嵌入了闪存 API (闪存中加载了闪存 API)?  如果是、应用程序是否调用闪存 API 函数?

    您是否检查它们是否已正确初始化闪存(检查等待状态- 100MHz 时需要4个等待状态)?   

    谢谢、此致、
    Vamsi

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

    您好、Vamsi、

    对于 嵌入在其应用中的闪存 API、我找不到任何闪存 API。 我将通过 Box 向您发送引导加载程序代码和应用程序代码。 请帮帮我。

    对于等待状态、我在此处插入代码:

    #if CPU_FRQ_100MHz
    if ((ClkCfgRegs.CLKSRCCTL1.bit.OSCCLKSRCSEL = 0x0)||
    (ClkCfgRegs.CLKSRCCTL1.bit.OSCCLKSRCSEL == 0x2)||
    (ClkCfgRegs.CLKSRCCTL1.bit.OSCCLKSRCSEL == 0x3))
    {
    Flash0CtrlRegs.FRDCNTL.bit.RWAIT = 0x5;
    }
    其他
    {
    Flash0CtrlRegs.FRDCNTL.bit.RWAIT = 0x4;
    }
    #endif 

    我认为这意味着他们有足够的时间。

    BR

    Emma

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

    Emma、

    如果不是应用程序、它们的自定义引导加载程序中是否嵌入了闪存 API? 请检查。

    谢谢、此致、
    Vamsi

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

    您好、Vamsi、

    是的、以下是嵌入在定制引导加载程序中的闪存 API:

    状态= Fapi_initializeAPI (F021_CPU0_BASE_ADDRESS、100);
    
    状态= Fapi_setActiveFlashBank (Fapi_FlashBank0);
    
    状态= Fapi_issueWithCommandAddress (Fapi_EraseSector、pu32addr);
    
    状态= Fapi_doBlankCheck (32StartStatusWord、Pudr);
    
    状态= Fapi_issueProgrammingCommand (((uint32 *) u32Index、u16ptr+I、8、0、0、Fapi_AutoEccGeneration);
    
    状态= Fapi_doVerify ((((uint32 *) u32Index、4、u32ptr+(I/2)、&oFlashStatusWord);
    

    他们是否错误地使用它们?

    BR

    Emma

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

    Emma、

    复制的命令看起来正确。   

    在擦除和编程操作之后、客户是否检查了 fmstat? 它会指示编程期间是否存在任何错误。

    他们是否检查了擦除和编程命令的返回状态? 这些函数是否返回任何错误?

    请建议他们浏览闪存 API wiki: http://processors.wiki.ti.com/index.php/C2000_Flash_FAQ

    这将有助于进一步调试。

    谢谢、此致、

    Vamsi

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

    Emma、

    对此进行了任何更新?

    谢谢、此致、

    Vamsi

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

    您好、Vamsi、

    您提到了 fmstat、因此我查看了 FLASH_API 应用手册。

    然后,我在引导加载程序代码中选中 Fapi_getFsmStatus()。 有两个函数调用此函数。 自定义函数 FLASH_WRITE 和 FLASH_ERASE。

    我在此附上代码段。

    #pragma CODE_SECTION (flash_write、"ramfuncs");
    fapi_StatusType flash_write (uint32 startAddr、uint32 u16len、void *数据源)
    {
    
    uint32 i、len、u32Index、Flash* u32ptr;
    Uint16 * u16ptr;
    fapi_StusType 状态;Fapi_StatusType;
    FlashFlatus_Stonapi_StonType;Flash_StonusType;
    
    
    len=startAddr+u16len;
    u32Index = startAddr;
    
    //flash µØÖ·ºÏ·¨ÅжÏ
    if (startAddr 0xA0000)
    {
    return fapi_Error_InvalidAddress;
    }
    
    u16ptr =(uint16*)(pissuatas();
    u32ptr =(uint32*)(pdatasource);
    
    //д闪
    存 for (i=0;u32Index < len;i+8、u32Index+= 8)
    {
    uintrafulameTemp =
    8、u32、uintegra = u32、uF = uatureCommand + uintegra (uintegra)、u32、uintegra = ueFP32、uintegra = uintegra = uintegra = u32、uF、uintegra = uF、uintegra = u32、uature
    
    while (fapi_checkFsmForReady()=fapi_Status_FsmBusy)
    {
    ;
    }
    
    if (status!= Fapi_Status_Success)
    {
    uiJumpText1 = uiJumpText1 + 100;
    break;
    }
    
    JumpSta = Fapi_getFsmStatus();
    if (
    
    
    
    
    
    Verify flashSta!= FapiStatus_Success+)
    
    = 32;if = UFlashStapiStapiStapi_Out_Out_Out_Outr= UStatus+(U41)
    
    
    
    
    
    ;if)= uStapiStapiStapiStapi= 32 (U64uStapi= uStapiStapi_Success+ UfuStapi_Out_Out_Out_Out_Outr= uStapiStapi= uStapiStapiStapiStapi_Out_Outr=
    
    #pragma CODE_SECTION (FLASH_ERASE、"ramfuncs");
    Fapi_StatusType FLASH_ERASE (UINT32 sectorStartAddr、UINT16 sectorNum)
    {
    UINT16 I;
    UINT32 * pu32Startaddr;
    Fapi_StatusType status;
    Fapi_FlashStatusType flashSta;
    FFlashSton_Ston_FlashWord_FlashStatusWord
    
    //FLASH µØÖ·ºÏ·¨ÅжÏ
    if (sectorStartAddr bon_Sector15_start
    ||(sectorStartAddr+sectorNum*0x1000)>bon_Sector15_start)
    {
    return Fapi_Error_InvalidAddress;
    }
    
    
    for (i = 0;i < sectorNum;++i)
    {
    //²Á³ýflash
    
    pu32Startaddr=(uint32 *)(sectorStartAddr+i);
    
    状态= Fapi_issueAppiCommandAppiAddress (Fapi_EraseSector、pu32Startaddr);
    while (fapi_checkFsmForReady()!= fapi_Status_FsmReady){}
    if (status!= Fapi_Status_Success){break;}
    flashSta = fapi_getFsmStatus();
    if (flashSta!= 0)
    {
    status=(Fapi_StatusType) 1;
    break;
    }
    状态= Fapi_doBlankCheck (pu32Startaddr、Sector8KB_u32length、&oFlashStatusWord);
    if (status!= Fapi_Status_Success){break;}
    
    }
    
    返回状态;
    
    } 

    我不确定他们是否正确使用它。 您能帮您回顾一下吗?

    BR

    Emma

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

    Emma、

    它们从擦除和编程函数以及 Fapi_getFsmStatus()中获取返回值。

    但是、我不知道当这些函数返回错误时它们会执行什么操作。

    在故障情况下(出现 ECC 错误时)、它们是否在引导加载程序执行期间检查上述函数是否存在任何错误?

    谢谢、此致、

    Vamsi

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

    您好、Vamsi、

    感谢您的通知、我已向客户提出问题。

    此外、我循环使用闪存 API 用户指南、并找到以下内容:

    //

    //读取 fmstat 寄存器内容以了解之后 FSM 的状态

    //程序命令,查看是否存在任何与程序操作相关的错误

    //

    oFlashStatus = fapi_getFsmStatus();

    if (oFlashStatus!= 0)

    //

    //Check FMSTAT 并进行相应的调试

    //

    fmstat_fail();

    问题是我找不到 fmstat_fail()的定义;

    此函数将执行什么?

    BR

    Emma

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

    Vamsi、

    我与客户进行了核对、他们告诉我他们稍后会进行更改、但现在是这样。 他们认为这不是根本原因。

    原因如下:

    它们没有跳到引导加载程序的 main 中、而只是跳转到另一个代码。

    由于另一个原因、在没有引导加载程序的情况下运行代码时、它们将遇到 ECC 错误。

    我的问题是,ECC 是否在不使用闪存 API 的情况下发生?

    BR

    Emma

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

    Emma、

    无论是闪存编程工具还是闪存 API、如果 ECC 未编程或编程错误、都将发生 ECC 错误。

    请让客户检查他们的应用分支到的代码是否对 ECC 进行了编程。  如果未正确编程、它们将会出现 ECC 错误。

    谢谢、此致、

    Vamsi

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

    Vamsi、

     [引用 user="Vamsi Gudivada"]如果 ECC 未编程或编程错误,[/quot]

    如何判断 ECC 未正确编程、我确定他们通过检查下载设置下的自动 ECC 生成、片上闪存对其进行编程。

    BR  

    Emma

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

    Emma、

    如果使用启用了 AutoEccGeneration 的 CCS 片上闪存工具对其进行编程、则 ECC 应该正确。

    我想知道客户是否使用没有 ECC 的闪存 API 对任何内容进行了编程。    

    如果您想知道 ECC 未正确编程或根本未编程的位置、可以将一个简单的代码加载到 RAM 中、该代码在启用 ECC 的情况下读取闪存。  请注意、不可纠正的 ECC 错误将导致 NMI。  他们可以读取 NMI ISR 中的闪存 ECC 错误寄存器来了解 ECC 错误的位置。   

    您说他们没有跳转到引导加载程序的 main。  我想知道闪存是否未针对读取进行正确初始化(因为它们的自定义引导加载程序未执行)、因此问题出在哪里?

    也许他们跳到的位置由于某种原因没有对 ECC 进行编程? 请检查。  

    生产计划后是否立即发现这些问题? 还是在使用器件一段时间后?   

    谢谢、此致、

    Vamsi

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

    Emma、

    您对此有更新吗?

    谢谢、此致、

    Vamsi

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

    Vamsi、

    非常感谢您的宝贵建议。 现在、我们发现了一些不好的设计、例如时钟、复位电路和内核电源。

    因此他们将进行新设计。 我将监控新设计、看看它们是否有类似的误差。

    BR

    Emma

     

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

    Emma、

    感谢您的更新。 我要关闭此 TT。  如果您在监控新设计后对类似错误有任何相关问题、请打开新主题。

    此致、

    Vamsi