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.

[参考译文] TMS320F28P650DK:擦除扇区会导致"由于验证错误、命令失败。"

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1607472/tms320f28p650dk-erasing-sector-results-in-command-failed-due-to-verify-error

器件型号: TMS320F28P650DK

芯片:f28p650DK6
(F28P650DK6 PZP) 问题:


有时、当扇区被擦除时、设置 STATCMD.FAILVERIFY。 根据闪存 API 数据表、命令会指示:“由于验证错误、命令失败。“
每次进行 STATCMD.FAILVERIFY 时、闪存 FSM 准备就绪需要大量的时间(从秒到几十秒)(Fapi_checkFsmForReady ()== Fapi_Status_Fsm)
在某些芯片上可能会注意到这种行为、但在其他芯片上则不会观察到这种行为。

下面是执行扇区擦除功能的代码。 您能告诉我们为什么会发生此延迟、以及为什么这个位仅在有时设置而不是始终设置。


//闪存 API 初始化
void FW_init (void){
    memset_ram (&g_fw、0、sizeof (g_fw));
    fw_switch_state (fw_state_init);    sysctl_disableWatchdog ();    EALLOW;
    IPC_init (IPC_CPU1_L_CPU2_R);
    IPC_claimFlashSemaphore (IPC_FLASHSEM_Owner_CPU1);    //将所有闪存存储体分配给 CPU1
    SysCtl_allocateFlashBank (SYSCTL_FLASH_BANK0、SYSCTL_CPUSEL_CPU1);
    SysCtl_allocateFlashBank (SYSCTL_FLASH_BANK1、SYSCTL_CPUSEL_CPU1);
    SysCtl_allocateFlashBank (SYSCTL_FLASH_BANK2、SYSCTL_CPUSEL_CPU1);
    SysCtl_allocateFlashBank (SYSCTL_FLASH_BANK3、SYSCTL_CPUSEL_CPU1);
    SysCtl_allocateFlashBank (SYSCTL_FLASH_BANK4、SYSCTL_CPUSEL_CPU1);     
Fapi_initializeAPI (FlashTech_CPU0_BASE_ADDRESS、DEVICE_SYSCLK_FREQ);
    Fapi_setActiveFlashBank (    EDIS、Fapi_Flash、Bank0);Fapi_Library、    InfoType fapi_info = Fapi_getLibraryInfo ();
}

//清除 FAPI 状态
INT FW_CLEAR_STATUS (void){
    while (Fapi_checkFsmForReady ()!=Fapi.Ready Fapi_Status_Fsm){}    if (Fapi_getFsmStatus ()!= 0){
        Fapi_Clear ret = Fapi_issueAsyncCommand (Int.Status);
        如果 (ret != Fapi_Status_Success ){
            返回–1;
        }
        while (Fapi_checkFsmForReady ()!= Fapi_Status_Fsm){}
    }
    返回 0;
}

//读取 FAPI_STATUS
INT FW_STATUS (void){
    int stat_word;    if (Fapi_checkFsmForReady ()!=Int Fapi_Status_Fsm){
        返回 flash_writer_busy;
    }    stat_word = Fapi_getFsmStatus();    if (stat_word & FAPI_STATCMD_FAILMISC){
        返回 FLASH_WRITE_FAIL_MISC;
    } else if (stat_word & FAPI_STATCMD_FAILINVDATA){
        返回 FLASH_WRITE_FAIL_INVDATA;
    } else if (stat_word & FAPI_STATCMD_FAILLADDR ){
        返回 FLASH_WRITE_FAIL_ILADDR;
    } else if (stat_word & FAPI_STATCMD_FAILVERIFY){
        返回 FLASH_WRITE_FAIL_VERIFY;
    } else if (stat_word & FAPI_STATCMD_FAILWEPROT){
        返回 FLASH_WRITE_FAIL_WEPROT;
    }    返回 FLASH_writer_OK;
}

//初始化扇区擦除
INT FW_ERASE_async (void){
    STATUSWordType FLASH_STATUS_WORD Fapi_Flash;
    uint32_t * sec_to_erase;
    内部 ret;
    SECTOR_INDEX_TYPE BANK_SECTOR_OFFSET = MC_REARED_SECTOR (g_fw.mi.sector);    

 

 //计算保护位
    g_fw.protection_bits_a = FW_GET_PROTECTION_BITS_A (BANK_SECTOR_OFFSET);
    g_fw.protection_bits_b = FW_GET_PROTECTION_BITS_b (BANK_SECTOR_OFFSET);    ret = FW_Clear_status ();
    如果 (RET < 0){
        转至完成;
    }     

//清除所需扇区上的保护位
    Fapi_setupBankSectorEnable (FLASH_WRAPPER_PROGRAM_BASE+FLASH_O_CMDWEPROTA、g_fw.protection_bits_a);
    Fapi_setupBankSectorEnable (FLASH_WRAPPER_PROGRAM_BASE+FLASH_O_CMDWEPROTB、g_fw.protection_bits_b);、    而 (Fapi_checkFsmForReady ()!= Fapi_Status_Fsm){}    

 sec_to_erase =(uint32_t *) MC_Sector_to_ptr (g_fw.mi.sector);)     

RET = Fapi_issueAsyncCommandWithAddress (Fapi_Erase 扇区、sec_to_erase);

完成:     
如果 (RET == Fapi_Status_Success){
        RET = 0;
    }其他{
        FW_SWITCH_STATE (FW_STATE_ERASE_ERR);
        RET =–1;
    }    返回 ret;
}


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

    您好:

    执行命令后、扇区实际上是否会被擦除?

    此致、

    Alex

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

    是的,扇区正在清理,但这是需要时间。

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

    问题已解决:等待状态配置错误。 发现 Fapi_initializeAPI 函数返回 Fapi_Error_Invalid HclkValue 错误、该错误未被代码检查。 从另一方面来看、当知道闪存 API 初始化错误时、无法理解为什么其他闪存 API 函数返回成功并做实际工作。 将闪存 API FSM 切换到某种错误状态并且在正确初始化之前不允许执行任何操作是合理的吗?  

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

    您好:

    很高兴听到您解决了您的问题、我将关闭此主题。 时钟值检查由闪存 API 在配置 FSM 之前完成、而不是 FSM 本身、因此处理这种情况的正确方法是检查函数返回值。

    此致、

    Alex