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.

[参考译文] TMS570LS3137:F021闪存 API -访问闪存组1时的闪存错误值

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/888285/tms570ls3137-f021-flash-api---flasherrorreal-when-accessing-flash-bank-1

器件型号:TMS570LS3137
主题中讨论的其他器件:HALCOGEN

大家好、

对于一个项目、我将使用一个配备3137的 TMS570LS31x 开发套件。 在稍后的阶段、将过渡到配备3134的定制 PCB。

在这种情况下、我应该访问器件的闪存来存储数据。 由于工程要求、我需要同时使用 Bank1和7 (程序存储在 Bank0中时)。

但是、当我尝试在 BANK1上运行 Fapi 函数时、CPU 处于 dabort、flashErroral 模式。

以下代码生成错误。 您对此有什么意见吗?

请注意、我使用 HALCoGen、器件似乎已正确初始化。

此致、

Christophe


Fapi_FlashBankType 组= FlashBankX;// x 可以为1或7 (在我的情况
下为 uint32_t * startAdd =(uint32_t*) 0xXXXXXXXX;// 0x00180000 (对于 Bank1)、0xF0200000 (对于 Bank7
Fapi_FlashStatusType statusWord;

fapi_StatusType =



{uint_ereCLUSt =})(frate1)}(0xFapi_fluint_stalt)
RET = Fapi_setActiveFlashBank (bank);
}

IF (Fapi_Error_Fail > ret)
{
IF (Fapi_FlashBank7 =>闪存组)
{
RET = Fapi_enableEpromBankSecors (0xFFFFFFFF、0U);
}
其他
{
RET = Fapi_enableMainBankSectors (0xFFFF);
}

IF (Fapi_Status_Success == ret)
{
FAPI_CLEAR_FSM_DONE_EVENT;
}
}

while (Fapi_Status_FsmBusy = FAPI_CHECK_FSM_READY_BUSY);

if (Fapi_Status_Success = ret)
{
RET = Fapi_doBlankCheck (startAdd、1U、statusWord);//使用 Bank1时此处变为 flashErrorReal、不使用 Bank7
} 

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

    您好!

    在执行此空白检查之前、扇区是否已被擦除? 如果返回值不成功、statusWord 应该是非空位置的内容。  

    startAdd 应为32位对齐地址。

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

    大家好、感谢您的回复、

    我无法读取返回值、因为该过程此时会立即进入 dabort、flashErrorReal。

    我不显式擦除组/扇区、但我选择了在将代码刷写到目标时擦除所有闪存的选项(目的是在学习使用 API 时使用干净的空白闪存)。

    我认为 startAdd 是32位对齐的、因为它是组1的起始地址(0x0018_0000)。

    此致、

    Christophe

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

    您好 Christophe、

    当闪存被擦除时、ECC 空间也被擦除。 由于闪存的擦除状态不是一个有效的 ECC 条件、在进行闪存空白检查之前、闪存 ECC 检查应该被禁用。  

    如您所述、您遇到 flashErroral 错误、这意味着诊断模式已启用。 您是否使用 CCS 存储器浏览器或闪存 API 检查0x180000处的闪存内容:fapi_doMarginiad()?

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

    您好!

    我尝试在0x00180000处读取闪存内容、只需用Fapi_doBlankCheckFapi_doMarginRead一个调用替换该调用。 结果是相同的、即我得到了 flashErroral 错误。 我尚未尝试使用 CCS 存储器浏览器进行读取、我将在有机会时立即尝试。

    此致

    Christophe

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

    您好 Christophe、

    我想您在执行空白检查之前已经擦除了闪存。

    在执行闪存操作(擦除、编程、空白检查等)之前、您可以禁用闪存诊断测试吗? 将0xA 写入 FDIACTRL[19:16]。

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

    您好 Christophe、

    您是否已解决此问题?

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

    您好!

    我很抱歉,我的答复很晚,关于这一令人发指的情况,还有一些事情需要组织起来。

    FDIAGCTRL 在其 DIAG_EN_KEY 字段中已有0xA、位[19:16]、即禁用诊断模式。 其完整值为0x000A0007、因此 DIAG_MODE = ECC 故障测试模式1。

    当我尝试使用 CCS Memory Broweser 从0x00180000读取数据时、我会看到一组"?"、显示值的几个地址显示了"0xFFFFFFBF"或"0xFFFFFFFE"等内容、即非空值。

    您看到我在这里遗漏了什么吗?

    此致、

    Christophe

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

    相反、当程序运行时、它为组1中的每个地址读取0xBAD0BAD0、当程序处于中断模式时、这些不完整的值。

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

    如果闪存 ECC 被启用、CCS 窗口浏览器中被擦除的闪存扇区的内容不是0xFFFFFFFF。 读取的值被无效的 ECC 修改。

    请在读取和空白检查之前禁用闪存 ECC。

    _coreDisableFlashEcc_()、位于 sys_core.asm 中

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

    大家好、很抱歉回答得太晚了。

    我添加了一个对_coreDisableFlashEcc_()的调用,它似乎起到了作用,非常感谢您的帮助!

    此致、

    Christophe