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.

[参考译文] TMS320F28P550SJ:使用闪存 API v4.0.0 进行闪存编程时出现问题 (TMS320F28P550)

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1600659/tms320f28p550sj-issue-with-flash-programming-using-flash-api-v4-0-0-tms320f28p550

器件型号: TMS320F28P550SJ

您好:

我在使用 TMS320F28P550SJ9 上的闪存 API v4.0.0 将数据写入闪存时遇到问题。

设置:
MCU: TMS320F28P550SJ9
闪存 API: v4.0
中断: 禁用
组 4 完全为数据保留(无代码)
闪存 API 从运行 RAM

问题
我正在尝试将数据写入空组 4(地址 0x100000)。 数据被拆分为四个字的块 (U16):

1. 0x5A5A, 0x5A5A, 0x5A5A, 0x5A5A
2. 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF
3. 0xA5A5, 0xA5A5, 0xA5A5, 0xA5A5
4. 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF
5. 0x0001, 0x0002, 0x0003, 0x0004
6. 0x0005, 0x0006, 0x0006, 0x0007


在开始编程过程之前、我确认目标存储器为空:  
1.手动(逐字节比较)  
2.使用 Fapi_doBlankCheck 
3.通过 CCS 中的存储器视图  

在所有情况下、存储器都是 。  

before_flash.png

编程期间的行为:
1.数据以块 (4 ×U16) 的形式写入。
2.块 1–4 编程正确。
3.尝试对下一个块进行编程时、 Fapi_getFsmStatus返回 0x101 (十进制:257)。

chunk_1_4.png

根据 闪存 API v4.0.0 文档
第 8 位:由于尝试对存储的值进行编程、编程命令失败
2.位 0:命令完成

我已经检查了所有地址和偏移量、一切看起来都是正确的。
在 CCS 中手动擦除闪存组 4 并重新启动固件后、即所有数据 写入正确 。  

after_manual_erase.png



代码:

uint16_t CHUNKS = length / 4U;

uint16_t CHUNK_NUM = 0;
for(CHUNK_NUM = 0; CHUNK_NUM < CHUNKS; CHUNK_NUM++)
{
        Fapi_StatusType fapi_status_ret = Fapi_Status_FsmBusy;

    while(Fapi_checkFsmForReady() != Fapi_Status_FsmReady);

    volatile Fapi_FlashStatusType flash_status_ret = Fapi_getFsmStatus();

    if(flash_status_ret != 0 )
    {
        fapi_status_ret = Fapi_issueAsyncCommand(Fapi_ClearStatus);

        if(fapi_status_ret != Fapi_Status_Success)
        {
            __asm(" ESTOP0");
            return FALSE;
        }
    }

    flash_status_ret  = Fapi_getFsmStatus();

    uint16_t err = (Fapi_checkFsmForReady() == Fapi_Status_FsmReady) && 
                (flash_status_ret == 0x03U || (flash_status_ret == 0U)) ? FALSE : TRUE;

    if(err == TRUE)
    {
        __asm(" ESTOP0");
        return FALSE;
    }

    if(Fapi_setupBankSectorEnable((FLASH_WRAPPER_PROGRAM_BASE + FLASH_O_CMDWEPROTA), MASK_A) != Fapi_Status_Success)
    {
        __asm(" ESTOP0");
        return FALSE;
    }

    if(Fapi_setupBankSectorEnable((FLASH_WRAPPER_PROGRAM_BASE + FLASH_O_CMDWEPROTB), MASK_B) != Fapi_Status_Success)
    {
        __asm(" ESTOP0");
        return FALSE;
    }


    uint16_t offset = 4U * CHUNK_NUM;

    if(Fapi_Status_Success != Fapi_issueProgrammingCommand( (uint32_t*) (0x100000U + offset),
                                                            (uint16_t*) (data_to_save + offset), 
                                                            4U, NULL, 0U, Fapi_AutoEccGeneration))
    {
        __asm(" ESTOP0");
        return FALSE;
    }

    while(Fapi_checkFsmForReady() != Fapi_Status_FsmReady);

    flash_status_ret = Fapi_getFsmStatus();

    if (flash_status_ret != 0x0U && flash_status_ret != 0x3U)
    {
        __asm(" ESTOP0");
        return FALSE;
    }

}


问题:

什么可能导致无法对存储器进行编程、即使之前已将存储体验证为空白?


提前感谢您的帮助!

此致、
Karol

 
 

 

 

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

    您好、

    我很抱歉,因为该专家目前因美国的假期而离职。 假期结束后、请等待回复。

    此致、

    Aj Favel

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

    尊敬的 Karol:

    此问题在初始编程期间的故障状态是否可重复?

    谢谢。此致、

    Charles

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

    尊敬的 Charles:

    感谢您的答复。

    如果您要重现此问题、例如在具有我提供的代码的评估板上、我还不确定(我明天会查看)。 然而,我这边的情况是有点复杂,因为它涉及相当大的应用. 也就是说、该问题在以下情况下始终会发生:

    1. 更新我们的引导加载程序(使用 FAPI 进行编程)

    2. MCU 重新启动 (WDT)

    3. 更新应用程序(使用 FAPI 进行编程)

    4. MCU 重新启动 (WDT)

    5. 运行提供的代码–始终具有相同的效果

    引导加载程序和应用程序驻留在闪存组 0–3 中。
    第 5 步希望写入 组 4  

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

    您好:

    编程调用失败时、address 参数的值是多少? 在编程之前、与您尝试编程的区域相对应的 ECC 位是否也已被擦除? 每 64 位数据对应于 8 位 ECC。 存储体 4 ECC 区域从 0x0109 0000 开始。 请参阅 数据表中的闪存映射 、了解特定于扇区的地址。

    此致、

    Alex

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

    您好 Alex、
    很抱歉在回复时出现了长时间的延迟、但我无法访问硬件。

    那么、Alex、以下是详细信息:

    1.我擦除了整个 MCU 内存。 内存如下所示:



    2. 我编程了我们的固件,它看起来像这样:



    3. 开始数据编程前内存的外观如下:



    4. 我仔细检查了整个银行 4 使用:
      a) Fapi_doBlankCheck
      b) 比较组 4 中的所有值到 0xFFFF

      两次检查均返回“正常“、程序继续进行、没有任何问题。

    5.我开始了闪存编程过程:

    • 前 2 个块已正确编程 (0x100000 - 0x100007):
      值:

      0x5A5A, 0x5A5A, 0x5A5A, 0x5A5A,
      0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF


    • 接下来的 2 个块也已正确编程 (0x100008–0x10000F):
      值:
      0xA5A5, 0xA5A5, 0xA5A5, 0xA5A5,
      0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF

    内存如下所示:



    7.当我尝试在地址 0x100010 对下一个块进行编程时,我得到了之前描述的相同错误 ( 0x101 (十进制:257)。

    存储器如下所示:






    我理解 Fapi_doBlankCheck 函数告诉我:

    1. 未对闪存进行编程(空白)。

    2. 可以对测试的地址进行编程。

    是这样吗?

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

    您好:

    根据屏幕截图、 当您将固件编程到器件时、将写入闪存组 4 ECC 区域。 这是 FSM 错误的来源。 如果第一个数据段的 ECC 代码与闪存中已存在的代码匹配、则这些数据段可以正确编程、但当 FSM 尝试将 ECC 值编程为不同的值时、不能不进行擦除。  

    将固件编程到器件时、是否将任何代码或数据分配给组 4? 在重新编程该区域之前、您是否能够添加擦除调用?

    此致、

    Alex

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

    好的、感谢您的答复—这是关于我的问题的一个有用的领导。

    基于参考指南 TMS320F28P55x 闪存 API 版本 4.00.00.00 和函数 fapi_doBlankCheck ()






    有一些我不理解的地方、您可以帮助我澄清一下:

    1. 该函数检查的到底是什么? 在编程之前、我会检查整个过程 闪存存储体 4 使用此函数不会出现任何错误

    2. 该函数是否仅在闪存地址等于时检查0xFFFF、或者是否也检查相应的 ECC?

    3. 该功能是否能按预期工作?

    此外、在我的例子中、 BANK 4 在我们的解决方案中专门用于仿真 EEPROM。 此处未存储任何代码或任何其他内容。

    非常感谢您的回答。

    此致、
    Karol

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

    您好 Karol、

    该函数检查主阵列闪存是否 等于 0xFFFF、而不检查 ECC 值。 这是预期行为。

    组 4 是否以某种方式包含在固件映像中?

    此致、

    Alex

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

    Alex、非常感谢您提供的宝贵反馈。

    您是对的、事实证明这在我们的引导加载程序或十六进制文件中是一个问题。 其中一个十六进制文件很可能一直填充到最后一个闪存字节 (0xFFFF)。 但是、在手动清除内存后:

    • 闪存为空

    • ECC 为空

    →写入闪存没有问题。

    再次感谢—非常感谢!