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.

[参考译文] TMS570LC4357:无法擦除 TMS570LC4357上的闪存

Guru**** 2448780 points
Other Parts Discussed in Thread: TMS570LC4357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/627743/tms570lc4357-unable-to-erase-flash-on-tms570lc4357

器件型号:TMS570LC4357

我正在修改 TMS570LS31的引导加载程序示例、以便使用  以太网通信在 TMS570LC4357上工作。 在开始时、Fapi 函数从闪存复制到 RAM (LR 寄存器值为0x8015637)、但它一直到

while (fapi_get_FSM_status!= fapi_Status_Success);

Fapi_BlockErase 中 。 FMSTAT 寄存器的读数为0x0990。

我在 Constants.h 中更改了一些常量值、如下所示:

/*指定用于确定不包括最详细地址的所有地址位的位掩码
由存储器映射寄存器*/拼版
#define F021_program_address_mask 0x07FFFFFFU

/*指定 TI OTP 的偏移量*/
#define F021_program_TIOTP_OFFSET 0xF008000080000U

/* FMC 内存映射定义*/
#define F021_FLASH_MAP_BEGIN 0x000000000000
#define F021_FLASH_MAP_END 0x003FFFFFU /
#define F021_OTP_MAP_BEGIN 0xF0000000U  
#define F021_OTP_MAP_END 0xF000FFFFU  
#define F021_OTPECC_MAP_BEGIN 0xF0040000U  
#define F021_OTPECC_MAP_END 0xF0041FFFU
#define F021_EEPROMAC_MAP_BEGIN 0xF0100000U  
#define F021_EEPROMICC_MAP_END 0xF01FFFFFU
#define F021_EEPROM_MAP_BEGIN 0xF0200000U  
#define F021_EEPROM_MAP_END 0xF03FFFFFU  
#define F021_FLASHECC_MAP_BEGIN 0xF0400000U  
#define F021_FLASHECC_MAP_END 0xF05FFFFFU  

#define F021_CPU0_REGISTER_ADDRESS 0xFFF87000U

/*特定 TI OTP 偏移*/
#define F021_TIOTP_PER_BANK_SIZE 0x2000U
#define F021_TIOTP_SETTINGS_BASE 0x150U
#define F021_TIOTP_BANK_Sector 偏移量0x158U

我不确定 F021_CPU0_REGISTER_ADDRESS 是否定义、因为我在数据表中找不到此信息。

感谢您的任何帮助/建议。

此致

Valentina

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

    我正在使用库"F021_API_CortexR4_BE_L2FMC.lib"

    此外:FBSE 值为0xFFFF。

    在以下代码中,我可以看到 Fapi_issue19nCommandWithAddress 返回 Fapi_Status_Success,但它在第二个代码中停留了一段时间:

    执行{
    Fapi_issue19 CommandWithAddress (Fapi_EraseSector、eraseStartAddr);
    while (fapi_check_FSM_ready_busy =fapi_Status_FsmBusy);
    while (fapi_get_FSM_status!= fapi_Status_Success);

    // remaining -= flash_sector[j++].length;
    剩余--= FLASH_Sector [(bk*15)+(j++)].length;
    eraseStartAddr = FLASH_Sector[j].start;

    }while (((剩余> 0)&&(j < flash_bank[bk].numOfSecors));
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Valentina、

    我对迟迟不作出答复表示歉意。 您的问题在某种程度上都被漏掉了。

    首先、您能否查看 FAPI_GET_FSM_STATUS 返回的内容? 我很好奇、它是否会返回与无效数据相关的任何内容或有助于我们弄清所发生情况的其他线索。

    其次、TMS570LC4357和 LS3137之间的一个主要区别是 LC4357具有高速缓存。 这可能会在代码放置和执行方面玩一些游戏。 是否可以尝试关闭缓存以便在引导代码中执行? 这可以通过将 MPU 设置为 Write Through (写操作)来实现。

    最后、请仔细检查以确保所有必要的例程都被复制到 RAM 中、因为如果您在尝试编程的同一组中执行、则可能会出现问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Chuck、
    首先、感谢您的回复。 我对延迟回复感到非常抱歉。
    我按照您的建议运行了一些测试、并且:
    -卡在 while 中时、FAPI_GET_FSM_STATUS = 0x90
    -禁用高速缓存无效

    您是否有任何关于如何测试是否所有必要例程都已复制到 RAM 的建议?
    提前感谢。

    此致、

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

    您在哪个扇区卡住(起始地址)? 在代码被卡住之前、您是否成功擦除了任何扇区?
    当您初始化组时、应使用系统时钟频率。 在擦除和编程之前需要激活扇区。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    王先生、您好! 

    感谢您的回复。

    我卡在第一个扇区、因此我无法成功擦除任何扇区。 我的起始地址为0x0008 0000

    在擦除之前、该扇区被激活、并且系统时钟频率被使用。 我有:

      FREQ_IN_MHz = SYS_CLK_FREQ;

    fapi_initializeFlashBanks (Freq_in_MHz);
    
    for (bk = ucStartBank;bk < EnducBank+1;bk++){
    
    Fapi_setActiveFlashBank ((Fapi_FlashBankType) bk);
    
    Fapi_enableMainBankSectors (0xFFFF); 
    
    while (fapi_check_FSM_ready_busy =fapi_Status_FsmBusy);
    
    执行{
    
    while (fapi_check_FSM_ready_busy =fapi_Status_FsmBusy);
    
    while (fapi_get_FSM_status!= fapi_Status_Success);
    
    ...
    } 

    它不是用于激活扇区的函数吗?

    感谢您的关注。

    此致、

    Valentina

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉、我滥用了"插入代码"函数。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Valentina、

    在 BL_CONFIG.h 中定义了 SYS_CLK_FREQ、请确保它与 PLL 设置的值相同(可能为300MHz)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    王先生、您好!

    SYS_CLK_FREQ 设置为150。 我使用的是 LaunchPad 开发套件 LUANCHXL2-570LC43。 这是错误的设置吗?

    感谢你的帮助。

    此致

    Valentina