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.

[参考译文] TMS320F28377S:闪存 API Fapi_doVerify 失败

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1048991/tms320f28377s-flash-api-fapi_doverify-fails

器件型号:TMS320F28377S

您好!

我尝试使用来自 C2000的闪存 API 将一些数据写入闪存。 当我想要验证写入闪存的数据时、 我遇到了一个奇怪的现象。 这是我的代码。

我有一个名为 blFlags 的全局结构和虚拟数据、应该写入闪存。 (该结构再次位于另一个结构体中、但我为了简单起见将其遗漏掉)。

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
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;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

首先、我按照  闪存 API 手册中所述初始化 API、初始化闪存组、Fapi_initiataleAPI ()、 Fapi_setActiveFlashBank()。 所有函数都放置在 RAM 中。
然后、我使用该代码写入数据。

Fullscreen
1
2
3
4
5
6
7
8
9
// 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;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

如果我现在对闪存地址进行 CPU 读取、我可以看到这些值是正确的。 但是,如果我使用 Fapi_doVerify()函数,它会导致我失败。 我尝试了一些不同的设置、我可以将 问题缩小到两个函数调用、其中一个 函数调用正常、另一个函数调用不起作用。

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

workung 提供的函数的 oFlashStatusWord 中的返回值  

Fullscreen
1
2
3
4
5
oFlashStatusWord_1.au32StatusWord
[0] 0x00000000
[1] 0x00100002
[2] 0x0005F8A0
[3] 0x0005F890
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

失败的是什么

Fullscreen
1
2
3
4
5
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
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

因此 、正如我解释的那样、函数在读取全局结构时遇到问题。 这是可能的、还是我犯了另一个错误?

当然,我想避免 memcpy()函数并直接从结构中读取,以加快速度。

我希望有人能帮助我解决这个问题。 提前感谢。

此致、

Simon

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

    您好、Simon、  

    我将在星期一之前回来。  

    谢谢、  

    Anu

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

    您是否尝试直接将地址(在地址字段中输入(uint32_t *)&objFlash.blFlags)传递给 Fapi_doVerify 函数、而不是将其分配给 tempPtr? 分配可能会导致错误。  

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

    尊敬的 Anu:
    感谢你的答复。

    您的建议解决了问题。 我的软件的结构使我不得不依赖指针。 然后、我将能够通过对软件进行结构更改来解决这个问题。
    再次感谢!

    此致、
    Simon