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.

[参考译文] TMS320F28379D:由于断电期间的闪存存储器操作、此程序在加电后未能运行

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1476530/tms320f28379d-the-program-failed-to-run-after-power-on-due-to-flash-memory-operations-during-power-off

器件型号:TMS320F28379D
主题中讨论的其他器件:UNIFLASH

工具与软件:

在使用 TMS320F28379DZWTS 微控制器时、我在电路板突然断电时遇到问题。 供电后、微控制器不会正常运行此程序(由意外的 EtherCAT 断开连接来指示)。 我怀疑 DSP 闪存数据可能会以某种方式从原来的内容发生改变。 因此、使用 TI UniFlash 工具、我读取闪存数据、然后将其与从另一个普通板读取的数据进行比较。 结果是它们是相同的! 然后、我使用 UniFlash 将原始".out"程序重新加载到故障电路板中、微控制器再次正常工作。 我的程序包含对使用 FAPI 接口的闪存执行"初始化、读取和写入"操作的频谱功能、只要检测到断电(即输入电压降低沿)、就会激活此功能。 所以我怀疑以上问题与这个闪存操作函数有关。 注释掉闪存操作代码后、问题就不再发生。 所以您看到我的猜测是正确的。下面是我的闪存操作码、包括初始化、擦除和写入数据:
UINT8 Flash_Init ()
Fapi_Status 3044返回检查;
//增益泵信标
SeizeFlashPump();
EALLOW;
Flash0EccRegs.ECC_ENABLE.bit.enable = 0x0;
EDIS;
EALLOW;
oReturnCheck = Fapi_initializeAPI (F021_CPU0_BASE_ADDRESS、200);//暂时将其保留在外
if (oReturnCheck!= Fapi_Status_Success)
返回1;
}
// Fapi_setActiveFlashBank 函数用于进一步设置闪存组和 FMC
//要在存储体上执行的闪存操作
oReturnCheck = Fapi_setActiveFlashBank (Fapi_Flash 0);
if (oReturnCheck!= Fapi_Status_Success)
返回2;
}
EDIS;
返回 Fapi_Status_Success;
}
uint16 Flash_Erase (uint32 section_base_addr)
Fapi_Status 3044返回检查;
Fapi_Flash 4.70 WordType oFlashStatusWord;
EALLOW;
//已选择擦除扇区
oReturnCheck = Fapi_issueAsyncCommandWithAddress (Fapi_Erase 3872、(uint32 *) section_base_addr);
//等待 FSM 完成擦除扇区操作
while (Fapi_checkFsmForReady()!=4072) Fapi_Status_Fsm {}
//验证扇区是否被擦除。
oReturnCheck = Fapi_doBlankCheck ((uint32 *) section_BASE_addr、0x1000、&oFlashStatusWord);
if (oReturnCheck!= Fapi_Status_Success)
返回3;
}
EDIS;
返回 Fapi_Status_Success;
}
uint16 Flash_Write (uint32 section_base_addr、uint16 * pBuff)
Fapi_Status 4.44返回检查= Fapi_Status_Success;
EALLOW;
oReturnCheck = Fapi_issueProgrammingCommand ((Uint32 *) write_addr、pBuf、len、0、0、 Fapi_Auto E.ccGeneration);
while (Fapi_checkFsmForReady()== Fapi_Status_Fsm y);
if (oReturnCheck!= Fapi_Status_Success)
//检查闪存 API 文档以了解可能的错误
返回4;
}
DELAY_US (10L);
EDIS;
返回 Fapi_Status_Success;
}
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我可以在下周早些时候查看此主题。

    此致、

    Rajeshwary

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

    谢谢你。 我期待您的及时回复。

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

    您好!  

    您能否在调用 delay_us (10L);函数之前添加以下代码片段、然后查看是否看到任何错误?  

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    //
    // Read FMSTAT register contents to know the status of FSM after
    // program command for any debug
    //
    oFlashStatus = Fapi_getFsmStatus();
    //
    // Verify the values programmed. The Program step itself does a verify
    // as it goes. This verify is a 2nd verification that can be done.
    //
    oReturnCheck = Fapi_doVerify((uint32 *)u32Index,
    4, Buffer32+(i/2),
    &oFlashStatusWord);
    if(oReturnCheck != Fapi_Status_Success)
    {
    //
    // Check Flash API documentation for possible errors
    //
    Example_Error(oReturnCheck);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    此致、

    Rajeshwary

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、但我无法验证您建议的方法、因为我的当前问题与断电期间闪存上的操作有关。 我看不到返回的结果、而且程序在加电后也无法启动。
    我现在有一些新的发现。 问题似乎发生在闪存擦除操作期间。 如果我保留了闪存初始化和擦除操作、但禁用了闪存写入操作、则这个问题可能会再次出现。 但是、如果我保留了闪存初始化、但同时禁用了擦除和写入操作、则不会出现任何问题。
    是否有可能在断电期间擦除闪存会导致程序失败? 我在读取闪存数据时没有发现任何异常。 系统可以在重新编程后正常启动。 我真的想了解这些问题背后的原因并找到解决方案。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     当您关闭电源 并开始闪存擦除操作时、您能确保您的电压电平处于数据表规定的范围之内吗?

    如果 电压不足可能导致器件处于不稳定状态、  

    此致、

    Rajeshwary

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果在闪存运行期间电源电压降至工作电压以下、问题将在哪个阶段发生、可能会出现哪种类型的问题?
    我在这里发现了一个新现象:在断电之前闪存操作正常执行。 当我注释掉加电后读取闪存数据的代码时、这个问题并不会再发生。 下面是用于读取闪存数据的代码:
    #pragma CODE_SECTION (ReadFlashOffsetData、"ramfuncs");
    UINT32 ReadFlashOffsetData (void)
      uint32分辨率;
      uint16 pData_H、pData_L;
      pData_L =*(UINT16 *)(0x0BE000);
      PData_H =*(UINT16 *)(0x0BE001);
      RES =((uint32) pData_H << 16)|(uint32) pData_L;
      返回分辨率;
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好

    我得出以下结论:在闪存操作过程中、如果断电过快、闪存的读取操作将在电源恢复后冻结。 您能解释一下发生这种情况的原因以及基本原则是什么吗?

    此致

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

    您好!

    如果在闪存操作期间断电、则闪存损坏。 这可能会在您尝试读取闪存时导致 ECC 错误。

    此致、

    Rajeshwary

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

    大家好、我已经验证了在上电后、在读取闪存之前禁用 ECC、然后在读取闪存之后启用 ECC、结果没有重现问题。 您能给我一些解决问题的建议吗?

    此致

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

    您好!

    如果触发了 ECC 错误、则这意味着闪存损坏。 您必须对其进行擦除和编程、或者在断电模式下提供足够的时间和电压电平才能完成闪存操作

    此致、

    Rajeshwary