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.

[参考译文] TMS320F28379S:闪存 API 报告成功、但不是编程。

Guru**** 2535150 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/781890/tms320f28379s-flash-api-reporting-success-but-not-programming

器件型号:TMS320F28379S

我正在尝试了解如何在 TI Delfino 单核处理器上使用闪存。

我从以下几个方面开始:

Fapi_StatusType oReturnCheck;

InitFlash_BANK0 ();
InitFlash_BANK1 ();

EALLOW;
PUMPREQUEST = 0x5A5A0002;

oReturnCheck = Fapi_initializeAPI (F021_CPU0_W0_BASE_ADDRESS、200);
if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//
返回-1;
}

//
// Fapi_setActiveFlashBank 函数进一步设置闪存组和 FMC
//闪存操作将在组上执行
//
oReturnCheck = Fapi_setActiveFlashBank (Fapi_FlashBank0);
if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//
返回-2;
}

EDIS;

返回 oReturnCheck; 

然后我尝试写入存储器:

Fapi_StatusType ret;
uint32 * addr =(uint32 *) Bzero_SectorC_start + 8*SEL;
uint16 dbuf[2];

dbuf[0]= val & 0xFFFF;
dbuf[1]=(val>>16)和0xFFFF;
EALLOW;
while (fapi_checkFsmForReady()!= fapi_Status_FsmReady){}
RET = Fapi_issueProgrammingCommand (addr、dbuf、2、0、0、Fapi_DataOnly);
while (fapi_checkFsmForReady()!= fapi_Status_FsmReady){}
EDIS;
返回(int)转塔; 

然后回读:

Fapi_FlashStatusWordType 状态;
uint32 * addr =(uint32 *) Bzero_SectorC_start + 8*SEL;
uint32 rcvBuf = 0;
EALLOW;
if (fapi_doBlankCheck (addr、1、status)){
rcvBuf = status.au32StatusWord[1];
}否则{
返回0;
}

EDIS;
如果 onoff=0、///Shift 向下16
rcvBuf =(rcvBuf >>(16 *(!onoff)));
return (uint16) rcvBuf; 

我希望 rcvBuf 等于写入尝试期间提供的值、但它显示的是0x0001AA00、这与它开始时的值相同。

但是、调试时、闪存写入的返回值始终 为 Fapi_Status_Success、这意味着写入正确。 那么、无论我尝试写入多少次、回读值为什么不会从0x0001AA00更改?

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

    Dan、您好!

    编程之前是否擦除了扇区?  您提到过您对现有0x0001AA00数据编程了一些数据。  您应该先擦除该扇区、然后才能重新编程该扇区。 请检查并确认。

    此外,我建议您使用 fapi_doBlankCheck()来验证您编程的内容,而不是 fapi_doVerify()。  Fapi_doBlankCheck()用于验证是否擦除了扇区(我知道编码方式没有问题,但所提供函数的目的是不同的)。

    有关您从闪存 API 返回的成功问题、请在 processors.wiki.ti.com/.../C2000_Flash_FAQ 上的闪存 API wiki 中搜索以下问题

    -完成程序操作后,Fapi_issueProgrammingCommand()函数调用是否返回?  

    -如果 fapi_issueProgrammingCommand()函数不等待程序操作完成,我们如何知道程序操作是否成功?

    我还建议您在读取闪存存储器之前禁用 ECC (使用 Fapi_doVerify ()或您自己的代码),因为您不是在对 ECC 进行编程(您使用的是 Fapi_DataOnly)。  这有助于避免 ECC 错误。  您可以在验证后启用 ECC。  相反、您可以使用 Fapi_AutoEccGeneration 模式-此模式在对闪存进行编程时自动计算和编程 ECC。

    如果您有其他问题、请告诉我。

    F2837xS 闪存 API (V1.55)参考指南链接: http://www.ti.com/lit/pdf/spnu630

    谢谢、此致、

    Vamsi