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.

[参考译文] TMS570LS1224:F021闪存 API:无法向闪存写入一个字节(基于 SPNA148)

Guru**** 2482105 points
Other Parts Discussed in Thread: LAUNCHXL2-TMS57012, TMS570LS1224, HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/712860/tms570ls1224-f021-flash-api-couldn-t-write-a-single-byte-to-the-flash-based-on-spna148

器件型号:TMS570LS1224
主题中讨论的其他器件:LAUNCHXL2-TMS57012HALCOGEN

尊敬的支持:

我尝试将一个字节写入闪存(正如 SPNA148中描述的那样)。 我从 RAM 中执行此操作、也看不到任何问题、因为闪存未更新。 我还尝试更新 EEPROM、但得到的结果相同。

void flash_write_byte (uint32_t 地址)
{
Fapi_StatusType oReturnCheck = Fapi_Status_FsmReady;
FwpWriteByteAccessorType * oFwpWriteByteAccessor = FWPWRITE_BYTE_ACCEMER_ADDRESS;

oReturnCheck = Fapi_initializeFlashBanks (160);//示例代码假设正在运行
180MHz */
if ((oReturnCheck = fapi_Status_Success)&&(flash_control_register->fmstat.fmstat_bits.busy)
!= Fapi_Status_FsmBusy))
{
oReturnCheck = Fapi_setActiveFlashBank (Fapi_FlashBank7);

flash_control_register->Fbprot.u32Register = 1U;//禁用1级保护
/*启用当前组的所有扇区以进行擦除和编程。 EEPROM 组的更多信息
必须为0xFFFF */
FLASH_CONTRAL_REGISTER->Fbse.u32Register = 0xFFFF;
flash_control_register->Fbprot.u32Register = 0U;//启用1级保护
/*解锁 FSM 寄存器以写入*/
FLASH_CONTRAL_REGISTER->FsmWrEna.u32Register = 0x5U;
/*将命令设置为"清除状态寄存器"*/
FLASH_CONTRAL_REGISTER->FsmCommand.FSM_COMMAND_BITS .FSMCMD =
Fapi_ClearStatus;
/*执行清除状态命令*/
flash_control_register->FsmExecute.FSM_execute _bits.FSMEXECUTE = 0x15U;
/*将地址写入 FADDR 寄存器*/
FLASH_CONTRAL_REGISTER->Faddr.u32Register = 0xF0000111;
/*在地址0x0102处放置字节*/
oFwpWriteByteAccessor[2]= 0xBB;
/*将命令设置为"Program"*/
FLASH_CONTRAL_REGISTER->FsmCommand.FSM_COMMAND_BITS .FSMCMD =
Fapi_ProgramData;
/*执行程序命令*/
flash_control_register->FsmExecute.FSM_execute _bits.FSMEXECUTE = 0x15U;
/*重新锁定 FSM 寄存器以防止写入*/
flash_control_register->FsmWrEna.u32Register = 0x2U;

/*等待 FSM 完成*/
while (flash_control_register->fmstat.fmstat_bits.busy)
=Fapi_Status_FsmBusy)
;
/*检查 FSM 状态以查看是否没有错误*/
if (flash_control_register->fmstat.u32Register!= 0)
{
/*在此输入错误处理代码*/
}
}

此外、我在论坛上发现了其他实施方案、我尝试了以下方案、但结果相同:

void flash_write_byte (uint32_t 地址)
{
Fapi_StatusType oReturnCheck = Fapi_Status_FsmReady;
FwpWriteByteAccessorType * oFwpWriteByteAccessor=
FWPWRITE_BYTE_ACCESER_ADDRESS;
uint8_t au8MainDataBuffer[16]={0xAA、0x17、0x19、0x2E、0x0A、 0xB9、0x11、0x70、0x5F、0xC1、 0x9C、0xFD、0x54、0x51、0xED、 0x86};
uint8_t au8EccDataBuffer[16];
uint32_t * pu32StartAddress =(uint32_t *)(0xF0000111);
uint8_t *p1;
uint8_t * eccp1;
P1 = au8MainDataBuffer;
eccp1 = au8EccDataBuffer;

oReturnCheck = Fapi_initializeFlashBanks (160);//示例代码假设正在运行
180MHz */
if ((oReturnCheck = fapi_Status_Success)&&(flash_control_register->fmstat.fmstat_bits.busy)
!= Fapi_Status_FsmBusy))
{
oReturnCheck = Fapi_setActiveFlashBank (Fapi_FlashBank7);
oReturnCheck = Fapi_enableEprom 组安全器(0xF、0);

while (fapi_checkFsmForReady ()=fapi_Status_FsmBusy)
;

if ((oReturnCheck = Fapi_Status_Success)
&&(Fapi_checkFsmForReady()!= Fapi_Status_FsmBusy)
{
oReturnCheck = Fapi_issueProgrammingCommand (&pu32StartAddress、
P1、
16、
null、
0、
Fapi_AutoEccGeneration);
/*等待 FSM 完成*/
while (fapi_checkFsmForReady ()=fapi_Status_FsmBusy)
;

if ((oReturnCheck = Fapi_Status_Success)
&&(Fapi_checkFsmForReady()!= Fapi_Status_FsmBusy)
{
/*检查 FSM 状态以查看是否没有错误*/
if (flash_control_register->fmstat.u32Register!= 0)
{
/*在此输入错误处理代码*/

}
}

}

可以帮帮我吗? 谢谢!

此致、

Keno

 

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

    在我看来、如果我不擦除孔扇区、那么我就无法写入闪存。 但很显然、我不想擦除空穴区、因为数据丢失。 如何在不擦除空穴扇区的情况下仅重写1个字节? 谢谢!

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

    您好、Keno、
    我从 SPNA148.pdf 重新创建了代码、它起作用。 组7从0xF020 0000开始。 请检查一下! 您正在尝试在代码中写入0xF0000111。

    此致
    米罗

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

    我尝试过、但它仍然不起作用。 您可以共享您的代码吗? 谢谢!

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

    您好、Keno、

    代码为 spna148.pdf。

    附件还包括"存储器浏览器"的打印屏幕、其中完成了两次连续写入。

    int main (void)
    {
    /*用户代码 begin (3)*/
    
    Fapi_StatusType oReturnCheck = Fapi_Status_Success;
    FwpWriteByteAccessorType * oFwpWriteByteAccessor = FWPWRITE_BYTE_ACCEMER_ADDRESS;
    FwpWriteByteAccessorType * oFwpWriteEccByteAccessor = FWPWRITE_ECC_BYTE_accor_address;
    FwpWriteDWordAccessorType * oFwpWriteDWordAccprocessor = FWPWRITE_DWORD_accor_address;
    UINT8 au8MainDataBuffer[16]={0x78、0x17、0x19、0x2E、0x0A、 0xB9、0x11、0x70、0x5F、0xC1、 0x9C、0xFD、0x54、0x51、0xED、0x86};
    uint32 u32索引;
    //要在执行任何闪存操作之前正确初始化器件,请参阅特定于器件的初始化文档。 假定、
    除非另有说明、否则器件具有144位宽的闪存组。 *
    oReturnCheck = Fapi_initializeFlashBanks (180);//示例代码假设运行频率为180MHz */
    if ((oReturnCheck = Fapi_Status_Success)&&(flash_control_register->fmstat.fmstat_bits.Busy!= Fapi_Status_FsmBusy))
    {
    oReturnCheck = Fapi_setActiveFlashBank (Fapi_FlashBank7);
    
    /*在此处放置特定的示例代码*/
    
    flash_control_register->Fbprot.u32Register = 1U;//禁用1级保护
    /*启用当前组的所有扇区以进行擦除和编程。 对于具有16个以上扇区的 EEPROM 组、该值必须为0xFFFF */
    FLASH_CONTRAL_REGISTER->Fbse.u32Register = 0xFFFF;
    flash_control_register->Fbprot.u32Register = 0U;
    /*启用1级保护*/
    /*解锁 FSM 寄存器以写入*/
    FLASH_CONTRAL_REGISTER->FsmWrEna.u32Register = 0x5U;
    /*将命令设置为"清除状态寄存器"*/
    flash_control_register->FsmCommand.FSM_command_bits。FSMCMD = Fapi_ClearStatus;
    /*执行清除状态命令*/
    flash_control_register->FsmExecute.FSM_execute _bits.FSMEXECUTE = 0x15U;
    /*将地址写入 FADDR 寄存器*/
    FLASH_CONTRAL_REGISTER->Faddr.u32Register = 0xF0200000U;
    /*在地址0x0102处放置字节*/
    oFwpWriteByteAccessor[0]= 0x13;
    /*将命令设置为"Program"*/
    flash_control_register->FsmCommand.FSM_command_bits。FSMCMD = Fapi_ProgramData;
    /*执行程序命令*/
    flash_control_register->FsmExecute.FSM_execute _bits.FSMEXECUTE = 0x15U;
    /*重新锁定 FSM 寄存器以防止写入*/
    flash_control_register->FsmWrEna.u32Register = 0x2U;
    
    
    /*等待 使 FSM 完成*/
    while (flash_control_register->fmstat.fmstat_bits.busy = fapi_Status_FsmBusy);
    /*检查 FSM 状态以查看是否没有错误*/
    if (flash_control_register->fmstat.u32Register!= 0)
    {
    /*在此输入错误处理代码*/
    }
    }
    
    
    
    while (1);
    
    /*用户代码结束*/
    
    返回0;
    } 

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

    它与我的相同。 我想知道您使用哪种处理器? 此外、我发现 FsmExecute 寄存器在我置位时不变、我也无法在参考手册(spnu607)中找到它。 谢谢!

    此致、
    Norbert
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Keno、
    我在 TMS570LS1224 (LAUNCHXL2-TMS57012 launchpad)上尝试了此代码。
    您是否使用不同的 MCU?
    您能告诉我您使用的是哪种 F021 API 库吗?

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

    您好、Miro、

    我使用的是同一个处理器。 我使用的是 v2.01.01。 F021闪存 API (F021_API_CortexR4_be.lib)。 此外、我想再次提到、如果我擦除空穴扇区、那么我可以写入闪存。 谢谢!

    此致、

    Keno

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

    您还能将您的孔项目与 Halcogen 项目一起发送给我吗? 谢谢!

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

    您好、Keno、

    附加的是项目。

    e2e.ti.com/.../4137.e2e_5F00_TMS570LS1224PGE_5F00_RW_5F00_EEPROM.zip

    此致

    米罗

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

    它也对我很有效。 我可以看到一个很大的差异。 我忘记启用 FEE、但我不确定应该如何使用它。 可以帮帮我吗? 谢谢!

    此致、
    Norbert
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Kenan、
    在 HALCoGen 的 DOCS 文件夹中、您可以找到"TI FEE 用户指南.pdf"、了解有关 FEE 驱动器的更多信息。
    您可以使用 F021 API 来访问内部闪存。 使用 FEE API 不是强制性的。

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

    您好、Miro、

    我检查了您的项目设置、发现您每次刷写 TMS570芯片时都会擦除空穴闪存。 如果我设置了"只写入必要的扇区"、那么您的项目会遇到与我的项目相同的问题->如果不擦除扇区、我就无法重写单字节。

    我还尝试了以下代码(我尝试连续将几个字节写入闪存、但结果非常不同):

    int main (void)
    {
    /*用户代码 begin (3)*/
    uint8_t i=0;
    
    Fapi_StatusType oReturnCheck = Fapi_Status_Success;
    FwpWriteByteAccessorType * oFwpWriteByteAccessor = FWPWRITE_BYTE_ACCEMER_ADDRESS;
    FwpWriteByteAccessorType * oFwpWriteEccByteAccessor = FWPWRITE_ECC_BYTE_accor_address;
    FwpWriteDWordAccessorType * oFwpWriteDWordAccprocessor = FWPWRITE_DWORD_accor_address;
    UINT8 au8MainDataBuffer[16]={0x78、0x17、0x19、0x2E、0x0A、 0xB9、0x11、0x70、0x5F、0xC1、 0x9C、0xFD、0x54、0x51、0xED、0x86};
    uint32 u32索引;
    //要在执行任何闪存操作之前正确初始化器件,请参阅特定于器件的初始化文档。 假定、
    除非另有说明、否则器件具有144位宽的闪存组。 *
    对于(i = 0;i< 0xCC;i++)
    {
    oReturnCheck = Fapi_initializeFlashBanks (180);//示例代码假设运行频率为180MHz */
    if ((oReturnCheck = Fapi_Status_Success)&&(flash_control_register->fmstat.fmstat_bits.Busy!= Fapi_Status_FsmBusy))
    {
    oReturnCheck = Fapi_setActiveFlashBank (Fapi_FlashBank7);
    
    /*在此处放置特定的示例代码*/
    
    flash_control_register->Fbprot.u32Register = 1U;//禁用1级保护
    /*启用当前组的所有扇区以进行擦除和编程。 对于具有16个以上扇区的 EEPROM 组、该值必须为0xFFFF */
    FLASH_CONTRAL_REGISTER->Fbse.u32Register = 0xFFFF;
    flash_control_register->Fbprot.u32Register = 0U;
    /*启用1级保护*/
    /*解锁 FSM 寄存器以写入*/
    FLASH_CONTRAL_REGISTER->FsmWrEna.u32Register = 0x5U;
    /*将命令设置为"清除状态寄存器"*/
    flash_control_register->FsmCommand.FSM_command_bits。FSMCMD = Fapi_ClearStatus;
    /*执行清除状态命令*/
    flash_control_register->FsmExecute.FSM_execute _bits.FSMEXECUTE = 0x15U;
    /*将地址写入 FADDR 寄存器*/
    FLASH_CONTRAL_REGISTER->Faddr.u32Register = 0xF0200000U + I;
    /*在地址0x0102处放置字节*/
    oFwpWriteByteAccessor[0]= 0x00 + I;
    /*将命令设置为"Program"*/
    flash_control_register->FsmCommand.FSM_command_bits。FSMCMD = Fapi_ProgramData;
    /*执行程序命令*/
    flash_control_register->FsmExecute.FSM_execute _bits.FSMEXECUTE = 0x15U;
    
    /*等待 使 FSM 完成*/
    while (flash_control_register->fmstat.fmstat_bits.busy = fapi_Status_FsmBusy);
    /*检查 FSM 状态以查看是否没有错误*/
    if (flash_control_register->fmstat.u32Register!= 0)
    {
    /*在此输入错误处理代码*/
    }
    }
    
    
    
    
    while (1);
    
    /*用户代码结束*/
    
    返回0;
    } 

    结果如下:

    仅修改了每16个字节。 为什么? 谢谢!

    此致、

    Keno

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Keno、
    EEPROM 仿真组为128位宽。
    FLASH_CONTRAL_REGISTER->Faddr.u32Register = 0xF0200000U -前128位的地址
    oFwpWriteByteAccessor[0]是第一个字节(在128位以内)

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

    好的、我看到了。 但它没有解释为什么我不能重写单个字节? 您能否按照上一封邮件中所述更改设置? 谢谢!

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

    您好、Keno、
    这样、您就可以直接使用闪存 API 访问 FEE。 在这种情况下、您应该注意部门管理。 当使用 FEE API 进行读取/写入时、用户无需负责扇区的管理。
    您可以在 c:\ti\Hercules \HALCoGen\v04.07.00\Docs 目录下查看 TI FEE 驱动程序用户 Guide.pdf。

    此外、 还有一个示例、说明如何在 c:\ti\hercules\HALCoGen\v04.07.00\examples\目录下读取/write fee

    此致
    米罗