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.

[参考译文] F28M35H52C:F021 Flash API Fapi_issue3cedCommandWithAddress未擦除M3上的闪存扇区

Guru**** 2587345 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/657537/f28m35h52c-f021-flash-api-fapi_issueasynccommandwithaddress-not-erasing-the-flash-sector-on-m3

部件号:F28M35H52C
主题:controlSUITE中讨论的其他部件

我正在尝试使用闪存API功能擦除M3闪存(扇区L)的其中一个扇区。 我已遵循闪存API应用程序说明中建议的所有必要步骤,并使用了控制套件示例中使用的相同F021库和函数集。  

当软件执行通过 Fapi_issue3cCommandWithAddress(Fapi_EraseSector,(UINT32 *)Bzero_SectorL_start)并在这之后通过While条件时,我尤其会遇到挑战。 当我观察扇区L的内存浏览器时,我没有看到它被刷新,但它仍然保留相同的代码。  

下面是我在尝试擦除扇区时观察到的一些屏幕截图。  

这里是我调用来执行一些闪存操作的功能。

#pragma code_section (CallFlashAPI,"ramfuncs");
布尔CallFlashAPI (无效)

UINT32 u32索引= 0;
UINT16 I = 0;

FAPI_StatusType oReturnCheck;
Volatile Fapi_LibraryInfoType oLibInfo;
Volatile Fapi_FlashStatusType oFlashStatus;
FAPI_FlashBankSectorsType oFlashBankSecors;
FAPI_FlashStatusWordType oFlashStatusWord;

//此函数是初始化基于系统的Flash API所必需的
//执行任何其他Flash API操作之前的频率

#IF CPU_FRQ_125MHz
oReturnCheck = Fapi_initializeAPI(F021_CPU0_BACK_ADDRESS,125);
#endif

#IF CPU_FRQ_100MHz
oReturnCheck = Fapi_initializeAPI(F021_CPU0_BACK_ADDRESS,100);
#endif

#IF CPU_FRQ_75MHz
oReturnCheck = Fapi_initializeAPI(F021_CPU0_BACK_ADDRESS,75);
#endif

#IF CPU_FRQ_60MHz
oReturnCheck = Fapi_initializeAPI(F021_CPU0_BACK_ADDRESS,60);
#endif

IF (oReturnCheck!= Fapi_Status_Success)

//查看Flash API文档以了解可能的错误
错误(oReturnCheck);
}

// Fapi_getLibraryInfo函数可用于获取信息
//特定于API库的编译版本
oLibInfo = Fapi_getLibraryInfo();

// Fapi_setActiveFlashBank函数设置闪存库和FMC
//用于在银行上执行进一步的闪存操作
oReturnCheck = Fapi_setActiveFlashBank(Fapi_FlashBank0);
IF (oReturnCheck!= Fapi_Status_Success)

//查看Flash API文档以了解可能的错误
错误(oReturnCheck);
}

// Fapi_getBankSecors函数返回银行的起始地址,
//部门数量,部门规模和银行技术类型
//以上信息以类型为的结构oFlashBankSecors返回
// Fapi_FlashBankSectorsType
oReturnCheck = Fapi_getBankSecors(Fapi_FlashBank0,&oFlashSecBankectors);
IF (oReturnCheck!= Fapi_Status_Success)

//查看Flash API文档以了解可能的错误
错误(oReturnCheck);
}

//擦除扇区L
//扇区N具有示例代码,因此请保持编程状态
oReturnCheck = Fapi_issue3cCommandWithAddress(Fapi_EraseSector,
(UINT32 *) Bzero_SectorL_start);

//等待FSM完成擦除扇区操作
while (Fapi_checkFsmForReady()!= Fapi_Status_FsmReady){}

//验证扇区L是否被擦除。 “擦除”步骤本身执行验证
//。 此验证是可以执行的第二次验证。
oReturnCheck = Fapi_doBlankCheck((UINT32 *) Bzero_SectorL_start,
/*Bzero_32KSector_u32length*/420,
&oFlashStatusWord);
IF (oReturnCheck!= Fapi_Status_Success)

//查看Flash API文档以了解可能的错误
//如果Erase命令失败,请使用Fapi_getFsmStatus()函数获取
// fmstat寄存器内容
//查看是否有任何EV位,ESUSP位,Cstat位或VOLTSTAT
//位已设置(有关详细信息,请参阅API文档)
错误(oReturnCheck);
}

//擦除扇区K
//扇区N具有示例代码,因此请保持编程状态
oReturnCheck = Fapi_issue3cCommandWithAddress(Fapi_EraseSector,
(UINT32 *) Bzero_SectorK_start);

//等待FSM完成擦除扇区操作
while (Fapi_checkFsmForReady()!= Fapi_Status_FsmReady){}

//验证SectorK是否已擦除。 “擦除”步骤本身执行身份验证
//开始了。 此验证是可以执行的第二次验证。
oReturnCheck = Fapi_doBlankCheck((UINT32 *) Bzero_SectorK_start,
Bzero_16KSector_u32length,
&oFlashStatusWord);

IF (oReturnCheck!= Fapi_Status_Success)

//查看Flash API文档以了解可能的错误
//如果Erase命令失败,请使用Fapi_getFsmStatus()函数获取
// fmstat寄存器内容
//查看是否有任何EV位,ESUSP位,Cstat位或VOLTSTAT位
//设置(有关详细信息,请参阅API文档)
错误(oReturnCheck);
}

//示例:将闪存扇区K中的0xFF字节与自动生成的ECC一起编程

//在这种情况下,只需用数据填充缓冲区,即可编程到闪存中。
对于(i=0;i<=bytes_in_flash_buffer;i++)

缓冲区[i]= i;
}

//示例:在闪存扇区K中对0xFF字节进行编程,不带ECC
//禁用ECC,以便在读取闪存时不生成错误
//不带ECC的内容
HWREG (FLASH_ERROR_BASE + FLASHERR_O_ECC_ENABLE)= 0x0;

对于(i=0,u32Index = Bzero_SectorK_start;
(u32Index <(Bzero_SectorK_start + bytes_in_flash_buffer))
&&(oReturnCheck == Fapi_Status_Success);i+=16,u32Index+=16)

oReturnCheck = Fapi_issueProgrammingCommand(UINT32 *)u32Index,
Buffer +I,
16岁
0,
0,
FAPI_DataOnly);

while (Fapi_checkFsmForReady()== Fapi_Status_FsmBusy);

IF (oReturnCheck!= Fapi_Status_Success)

//查看Flash API文档以了解可能的错误
错误(oReturnCheck);
}

//读取fmstat寄存器内容以了解FSM的状态
// program命令进行任何调试
oFlashStatus = Fapi_getFsmStatus();

//验证编程的值。 程序步骤本身进行验证
//。 此验证是可以执行的第二次验证。
oReturnCheck = Fapi_doVerifyByByByByByByByByByte(((uint8 *)u32Index,
16岁
Buffer +I,
&oFlashStatusWord);

IF (oReturnCheck!= Fapi_Status_Success)

//查看Flash API文档以了解可能的错误
错误(oReturnCheck);
}
}

//擦除扇区K
//扇区N具有示例代码,因此请保持编程状态
oReturnCheck = Fapi_issue3cCommandWithAddress(Fapi_EraseSector,
(UINT32 *) Bzero_SectorK_start);
//等待FSM完成擦除扇区操作
while (Fapi_checkFsmForReady()!= Fapi_Status_FsmReady){}
//验证SectorK是否已擦除。 “擦除”步骤本身执行身份验证
//开始了。 此验证是可以执行的第二次验证。
oReturnCheck = Fapi_doBlankCheck((UINT32 *) Bzero_SectorK_start,
Bzero_16KSector_u32length,
&oFlashStatusWord);
IF (oReturnCheck!= Fapi_Status_Success)

//查看Flash API文档以了解可能的错误
//如果Erase命令失败,请使用Fapi_getFsmStatus()函数获取
// fmstat寄存器内容
//查看是否有EV位,ESUSP位,Cstat位或VOLTSTAT位
//已设置(有关详细信息,请参阅API文档)
错误(oReturnCheck);
}

//启用ECC
HWREG (FLASH_ERROR_BASE + FLASHERR_O_ECC_ENABLE)= 0xA;

//保持对泵的控制
FlashLeavePumpe();

返回gTRUE;

}

我还 将M3配置为75MHz频率。  

有什么暗示我可能做错了??

谢谢

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

    正如SPNU595 (2.3 章节3闪存API使用的关键事实)和controlSUITE示例中所示,在调用闪存API函数以允许其写入受保护的寄存器之前,您是否配置了MWRALLOW? 请检查。

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

    Preetham,

    请搜索"当Flash API擦除或编程失败时,我们可以考虑哪些常见调试提示?" 在Flash API常见问题页面中: http://processors.wiki.ti.com/index.php/C2000_Flash_FAQ  

    可能是在调用Flash API函数之前,您没有声明M3的泵信号-我在您的代码中没有看到它。

    谢谢,此致,
    Vamsi

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

    我执行

    1. /*
    *禁用保护
    */
    HWREG (sysctl_MWRALLOW)= 0xA5A5A5A5;



    2. FlashGainPumper();

    在调用任何Flash API之前。 我想这就是你所说的??

    我指的是控制套件示例-> controlSUITE/device_support/f28m35x/v208/F28M35x_examples_Dual/flash_prog
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Preetham,

    是的,这就是我所说的。 您的代码中是否已包含这些代码?

    谢谢,此致,
    Vamsi
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,我的代码中包含这些代码,它们在调用任何闪存API之前执行...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Preetham,

    是否可以擦除任何其他闪存扇区?  如果是,则可能是安全调试-您可以检查GRABECT和密码位置,以了解该扇区是否受到保护。  如果它是安全的,您必须将其解锁或从与故障扇区属于同一安全区域的RAM中执行Flash API。   

    谢谢,此致,

    Vamsi