器件型号: 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 中的存储器视图
在所有情况下、存储器都是 空 。 
编程期间的行为:
1.数据以块 (4 ×U16) 的形式写入。
2.块 1–4 编程正确。
3.尝试对下一个块进行编程时、 Fapi_getFsmStatus返回 0x101 (十进制:257)。 
根据 闪存 API v4.0.0 文档 :
第 8 位:由于尝试对存储的值进行编程、编程命令失败
2.位 0:命令完成
我已经检查了所有地址和偏移量、一切看起来都是正确的。
在 CCS 中手动擦除闪存组 4 并重新启动固件后、即所有数据 写入正确 。 
代码:
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










