请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F28P650DK主题:C2000WARE 中讨论的其他器件
TI 团队大家好、
我目前正在使用将数据编程到 F28P65x 器件上的特定闪存组(组 1)中 闪存 API v3.00.02.00 。
我能够成功地擦除以下地址的闪存扇区并对其进行编程:
FLASH_BANK1_START_ADDR 0x0A0000U“闪存组 1
但是、我发现编程次数多于时会出现可重复的问题 17 字节 最大差值。
#define FLASH_BANK0_START_ADDR 0x080000U
#define FLASH_BANK1_START_ADDR 0x0A0000U
#define FLASH_BANK2_START_ADDR 0x0C0000U
#define FLASH_BANK3_START_ADDR 0x0E0000U
#define FLASH_BANK4_START_ADDR 0x100000U
#define VIN_FLASH_ADDR FLASH_BANK1_START_ADDR
#define VIN_SECTOR_SIZE 0x0800U // 2 KB sector
#define VIN_LEN_BYTES 17U // VIN length
#define VIN_PAYLOAD_BYTES 24U // padded to 8-byte multiple
#define VIN_PAYLOAD_WORDS 12U // 24 / 2
#define VIN_MAX_HALFWORDS (VIN_PAYLOAD_BYTES / 2U)
#define FSM_STATUS_SUCCESS (0x3U)
状态= Fapi_doVerify (dest、4U、(uint32_t *)&VIN_buf[i]、&flashStatusWord);但当我注释该 Fapi_doverify 时、我可以写入扇区、但最多可以写入 16 字节的数据(8 字)。
注意:1.为什么每次尝试编程 16 个以上字节(例如 17 或 24 个字节)时、以下验证调用都会失败?
在
Fapi_issueProgrammingCommand() F28P65x 器件上的单次调用中可以编程到闪存扇区中的最大字节数(或半字)是多少? 是否可以在 F28P65x 上使用闪存 API v3.00.02.00 执行固件更新(应用内编程)? 回路。
Fapi_StatusType VIN_ProgramUsingAutoECC(const uint8_t *vin_bytes)
{
Fapi_StatusType status = Fapi_Status_Success;
Fapi_FlashStatusWordType flashStatusWord;
Fapi_FlashStatusType fsmStatus;
uint16_t vin_buf[VIN_PAYLOAD_WORDS + 8] __attribute__((aligned(8)));
uint16_t i;
uint32_t prog_halfwords;
memset(vin_buf, 0xFF, sizeof(vin_buf));
for (i = 0; i < VIN_LEN_BYTES; i += 2U) {
uint16_t lo = vin_bytes[i];
uint16_t hi = (i + 1U < VIN_LEN_BYTES) ? vin_bytes[i + 1U] : 0xFFU;
vin_buf[i / 2U] = (uint16_t)((hi << 8) | lo);
}
/* 2) pad to 4-halfword (8-byte) boundary */
prog_halfwords = VIN_WORDS_16BIT;
IPC_claimFlashSemaphore(IPC_FLASHSEM_OWNER_CPU1);
status = Fapi_setActiveFlashBank(Fapi_FlashBank1);
if (status != Fapi_Status_Success) {
printf("[VIN] Bank select failed: %d\n", status);
IPC_releaseFlashSemaphore();
return status;
}
Flash_disablePrefetch(FLASH0CTRL_BASE);
Flash_disableCache(FLASH0CTRL_BASE);
ClearFSMStatus();
Fapi_setupBankSectorEnable(FLASH_WRAPPER_PROGRAM_BASE + FLASH_O_CMDWEPROTA, 0x00000000U);
Fapi_setupBankSectorEnable(FLASH_WRAPPER_PROGRAM_BASE + FLASH_O_CMDWEPROTB, 0x00000000U);
DEVICE_DELAY_US(50);
for (i = 0; i < prog_halfwords; i += 4U) {
uint32_t *dest = (uint32_t *)(VIN_FLASH_ADDR + (i * 2U));
ClearFSMStatus();
status = Fapi_issueProgrammingCommand(
dest,
&vin_buf[i],
8U,
NULL,
0,
Fapi_AutoEccGeneration
);
if (status != Fapi_Status_Success) {
Flash_enablePrefetch(FLASH0CTRL_BASE);
Flash_enableCache(FLASH0CTRL_BASE);
IPC_releaseFlashSemaphore();
return status;
}
while (Fapi_checkFsmForReady() == Fapi_Status_FsmBusy) { }
DEVICE_DELAY_US(20);
fsmStatus = Fapi_getFsmStatus();
if (status != Fapi_Status_Success)
{
printf("[VIN] Programming failed @0x%06lX (status=%d, FSM=0x%08lX)\n",
(unsigned long)dest, (int)status, (unsigned long)fsmStatus);
Flash_enablePrefetch(FLASH0CTRL_BASE);
Flash_enableCache(FLASH0CTRL_BASE);
IPC_releaseFlashSemaphore();
return Fapi_Error_Fail;
}
status = Fapi_doVerify(dest, 4U, (uint32_t *)&vin_buf[i], &flashStatusWord);
if (status != Fapi_Status_Success) {
Flash_enablePrefetch(FLASH0CTRL_BASE);
Flash_enableCache(FLASH0CTRL_BASE);
IPC_releaseFlashSemaphore();
return status;
}
}
/* 10) Re-enable prefetch/cache (and ECC if you disabled it) */
Flash_enablePrefetch(FLASH0CTRL_BASE);
Flash_enableCache(FLASH0CTRL_BASE);
IPC_releaseFlashSemaphore();
return Fapi_Status_Success;
}