您好!
我尝试使用来自 C2000的闪存 API 将一些数据写入闪存。 当我想要验证写入闪存的数据时、 我遇到了一个奇怪的现象。 这是我的代码。
我有一个名为 blFlags 的全局结构和虚拟数据、应该写入闪存。 (该结构再次位于另一个结构体中、但我为了简单起见将其遗漏掉)。
struct STRUCT_bootloaderFlags { uint16_t appFlag; // = 0xFFFF uint16_t backupFlag; // = 0xFFFF uint16_t flashError; // = 22 uint16_t RS485Error; // = 44 uint16_t rsvd_1; // = 1 uint16_t rsvd_2; // = 2 uint16_t rsvd_3; // = 3 uint16_t rsvd_4; // = 4 }; struct STRUCT_bootloaderFlags blFlags;
首先、我按照 闪存 API 手册中所述初始化 API、初始化闪存组、Fapi_initiataleAPI ()、 Fapi_setActiveFlashBank()。 所有函数都放置在 RAM 中。
然后、我使用该代码写入数据。
// Issue program command oReturnCheck = Fapi_issueProgrammingCommand((uint32_t *)BOOTLOADER_FLAGS_START_ADDRESS, (uint16_t *)&objFlash.blFlags, 8, 0, 0, Fapi_AutoEccGeneration); // Wait until the Flash program operation is over while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady) if(oReturnCheck != Fapi_Status_Success) { objFlash.error |= ERROR_FAPI_WRITEFLAG; }
如果我现在对闪存地址进行 CPU 读取、我可以看到这些值是正确的。 但是,如果我使用 Fapi_doVerify()函数,它会导致我失败。 我尝试了一些不同的设置、我可以将 问题缩小到两个函数调用、其中一个 函数调用正常、另一个函数调用不起作用。
Fapi_StatusType oReturnCheck; Fapi_FlashStatusWordType oFlashStatusWord_1, oFlashStatusWord_2; uint16_t tempDataBlock[8]; uint32_t *tempPtr; memcpy((uint16_t *)&tempDataBlock, (uint16_t *)&objFlash.blFlags, sizeof(tempDataBlock)); tempPtr = (uint32_t *)&tempDataBlock; // = 0x00000438 oReturnCheck = Fapi_doVerify((uint32_t *)startAddress, 4, tempPtr, &oFlashStatusWord_1); // Works tempPtr = (uint32_t *)&objFlash.blFlags; // = 0x0000A813 oReturnCheck = Fapi_doVerify((uint32_t *)startAddress, 4, tempPtr, &oFlashStatusWord_2); // Do not work
workung 提供的函数的 oFlashStatusWord 中的返回值
oFlashStatusWord_1.au32StatusWord [0] 0x00000000 [1] 0x00100002 [2] 0x0005F8A0 [3] 0x0005F890
失败的是什么
oFlashStatusWord_2.au32StatusWord [0] 0x00082000 // address of first non-blank location [1] 0xFFFFFFFF // data read at first verify failure location [2] 0xFFFF0000 // value of compare data [3] 0x00000000 // N/A
因此 、正如我解释的那样、函数在读取全局结构时遇到问题。 这是可能的、还是我犯了另一个错误?
当然,我想避免 memcpy()函数并直接从结构中读取,以加快速度。
我希望有人能帮助我解决这个问题。 提前感谢。
此致、
Simon