器件型号: 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;
}