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.

[参考译文] RM48L952:无法写入组7

Guru**** 2456980 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/642770/rm48l952-unable-to-write-to-bank-7

器件型号:RM48L952
主题中讨论的其他器件:HALCOGEN

您好!

这是完全相同的问题、没有解决方案
https://e2e.ti.com/support/microcontrollers/hercules/f/312/t/323571?tisearch=e2e-quicksearch&keymatch=PGV

因此、我得到与错误标记相同的 PGV 和 CMat 位。

对组7执行擦除操作看起来正常(不返回错误、不能说任何其他操作、因为组已被擦除、因此数据不会改变)。

组0和1擦除和写入工作正常、因此 flashAPI 使用逻辑应该正常。

根据 SPNU501G.pdf 第5.3章、Bank7中唯一的区别应该是使用不同的"启用组功能"。

但我看了 FEE 驱动器是如何实现的、对于未使用 FlashAPI 的写入命令、FlashAPI 仅用于擦除操作、我感到惊讶... 为什么它不会使用 FlashAPI、因为它会将其用于其他操作?


关于 EWAIT:还尝试了 FlashAPI 宏、相同的结果(也没有更改寄存器)和 system.c 设置正确的 EWAIT 值(3)(使用 halcogen 生成的文件)、因此如果理解正确、不应有任何理由调用该宏...

此外、还尝试了'Fapi_DataOnly"并尝试写入0xFF、0xFF 数据、所有这些都失败。

我正在尝试写入0xF0200000地址(通过 RAM 函数内的 R0寄存器验证)、因此应是有效的 EEPROM 地址(扇区0)

=========== 代码===================
#define USed_EEPROM_Sectors 0x1 //也尝试了0xFFFF
       FAPI_RET_ON_ERROR (Fapi_initiataleFlashBanks (HAL_u32SystemClockMHz ()));//用于 API Rev2.01 *
       FAPI_RET_ON_ERROR (Fapi_enableEpromBankSecitors (USED_EEPROM_Sectors,0U));

       while (fapi_check_FSM_ready_busy =fapi_Status_FsmBusy);
       FSM_STATUS_RET_ON_ERROR (FAPI_GET_FSM_STATUS);
       //这在 RAM 中
       fapi_RET_ON_ERROR (tFapi_Program ((UINT32*) u32Dst、(uint8*) u32Src、(UINT32)u32Bytes));

其中 tFapi_Program-Function 为:
//此代码需要位于 RAM 中
#pragma LOCATION ="RAMCODE"
静态 Fapi_StatusType tFapi_Program (uint32* pu32dst、uint8* pu8src、uint32 u32字节)

   fapi_rt_on_error (fapi_issueProgrammingCommand (pu32dst、pu8src、u32bytes、0、0、 Fapi_AutoEccGeneration));

   while (fapi_check_FSM_ready_busy =fapi_Status_FsmBusy);
   FSM_STATUS_RET_ON_ERROR (FAPI_GET_FSM_STATUS);//// 代码如此之远、因此 API 接口返回 OK

   返回 Fapi_Status_Success;

=========== 代码结束======

关于 Fapi_issueProgrammingCommand()的一般问题,如果它用作 FAP_AutoEccGeneration,则只能说给 API 和内部 API 的5个字节将被“填充”为8个字节,或者我是否需要给8/16/32字节数组复制5字节有效负载 (保留其他字段我想说0xFF 的任何数据)并将长度指定为8/16/32? 从 3.3.1中了解到、最有可能在 API 中执行自动填充 (或在 ECC 计算中自动使用至少全部8个字节、因此只能将5个字节分配给 API、这意味着无法同时尝试再次写入此剩余数据、因为 ECC 已通过它计算得出。

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

    我将您的问题转发给 Prathap、以便他可以从 SW 端解决。 他应该能够缩小其不起作用的原因、以及为什么在收费司机内以不同方式完成它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Jarkko、

    附件是我对 Bank7擦除和编程执行的一个简单程序。  希望这对您有所帮助。 我也有 HALCoGen 项目供参考。

    我假定 RM48x 器件。 该代码在我的工作台板中工作正常。 我没有 RM48 HDK 板。  

    我尝试按照您在 Bank7 - Sector0中的要求对5字节有效载荷进行编程。

    /cfs-file/__key/communityserver-discussions-components-files/312/1768.RM48_5F00_Bank7.zip

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

    您好!

    这确实很有帮助(让我相信您不需要从 HALCoGen 启用 FEE 驱动器、因为我从您的项目中禁用了 FEE 驱动器、并且您的代码仍然有效)。 在自己的代码中发现如此明显的错误仍然需要一段时间、或者可能只是因为错误太愚蠢。

    我错过了 bank7处理中的1个函数调用(因为我执行该组的方式与主组处理方式稍有不同)...
    FAPI_RET_ON_ERROR ( Fapi_setActiveFlashBank( Fapi_FlashBank7 ));

    -->有了这一变化,就可以了
           FAPI_RET_ON_ERROR (Fapi_initiataleFlashBanks (HAL_u32SystemClockMHz ()));//用于 API Rev2.01 *
           FAPI_RET_ON_ERROR ( Fapi_setActiveFlashBank( Fapi_FlashBank7 ));
           FAPI_RET_ON_ERROR (Fapi_enableEpromBankSecitors (USED_EEPROM_Sectors,0U));

    所以 Bank7现在可以工作了!

    现在想知道中断的擦除命令是做了什么或没有做什么、因为在 FSM_STATUS 为0之后、它很可能不做任何事情、但也没有标记任何错误...



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

    我没有库的源代码、但在发出命令之前、他们不会检查该库是否处于活动状态。
    因此、如果您在 BANK7未处于活动状态的情况下调用了擦除、则 API 将返回成功、因为它是异步、它会启动擦除命令并发出、但如果您选中"FAPI_GET_FSM_STATUS"、它将返回擦除失败(FMSTAT 寄存器中的0x00000400)...
    我发送的代码中确实有这种签入...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果/当组处于"出厂状态"时(例如、发出该命令时已擦除)、它是否会显示擦除失败? 只是要求确保我的代码中没有关于 FSM 状态检查的其他错误...

    因为这是我针对 bank7的擦除代码(没有我现在添加的设置组行)-与编程版本类似

    静态 uint8 u8Fapi_EepromBlockErase (uint32 u32Address)

    uint8 u8Status = FLASH_EEPROM_ILLEGAL_SECTOR;

    if (bEepromValidArea( u32Address ))

    FAPI_RET_ON_ERROR (Fapi_initiataleFlashBanks (HAL_u32SystemClockMHz ()));//用于 API Rev2.01 *
    ////FAPI_RET_ON_ERROR (Fapi_setActiveFlashBank (Fapi_FlashBank7));//代码丢失
    FAPI_RET_ON_ERROR (Fapi_enableEpromBankSecitors (USED_EEPROM_Sectors,0U));

    while (fapi_check_FSM_ready_busy =fapi_Status_FsmBusy);
    FSM_STATUS_RET_ON_ERROR (FAPI_GET_FSM_STATUS);

    //这在 RAM 中
    FAPI_RET_ON_ERROR (tFapi_Erase ((UINT32*)u32Address);

    U8Status = FLASH_OPER_OK;


    返回 u8Status;


    #pragma LOCATION ="RAMCODE"
    静态 Fapi_StatusType tFapi_Erase (uint32* pu32Sector)

    fapi_rt_on_error (fapi_issueCommand23预扣地址(fapi_EraseSector、pu32Sector));

    while (fapi_check_FSM_ready_busy =fapi_Status_FsmBusy);
    FSM_STATUS_RET_ON_ERROR (FAPI_GET_FSM_STATUS);

    返回 Fapi_Status_Success;


    其中
    #define FSM_STATUS_RET_ON_ERROR (status) if ((status)!= 0U){return (Fapi_Error_FAIL);}

    Flash_Oper_OK = 0、//与 Fapi_Status_Success 相同

    因此、该代码返回0、我还在退出擦除函数之前使用调试器检查了 FSM_STATUS、它是0……
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好

    工厂条件无关紧要。 上述代码将以相同的方式工作。

    奇怪的是、为什么要执行擦除 RAM? 如果它仅是组7、则您可以从组0执行擦除操作。
    如果您要维护通用代码并且您的应用需要 Bank0和 Bank7扇区擦除、我了解从 RAM 执行的逻辑。。。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉、无法将您的代码放入该"擦除失败"分支。

    首先运行原始代码、以便重新放置 sector0、然后进行小实验

    系统复位尝试通过操纵 PC 跳过该 Fapi_setActiveFlashBank() func,以便从...D8跳到...e0

    已尝试操作此代码、以便将 PC 从... D8跳到... e0、然后停止代码到... e8并写入 r0=1、r1=0 (仅为 s
    00004fd4:FA000206 Blx Fapi_initializeFlashBanks
    00004fd8:E3A00007 MOV R0、#7
    00004fdc:FA00029C Blx Fapi_setActiveFlashBank
    00004fe0:E3E00000 mvn R0、#0
    00004fe4:E3E01000 mvn R1、#0
    00004fe8:FA000432 Blx Fapi_enableEpromBankSectors

    然后单步执行擦除命令"FMdlStat"寄存器= 0、这意味着代码不会进入擦除失败分支

    然后在此处运行代码
    program_status = fapi_issueProgrammingCommand ((uint32_t *)(0xf0200000U)、
    WRITE_DATA[0]、(0x5)、0、0、Fapi_AutoEccGeneration);
    if (program_status!= fapi_Status_Success)

    在该程序命令之后、0xf0200000的内容不会改变、"FMdlStat"寄存器的值为0x00001010、这意味着 Cstat & PGV ==与我在代码中得到的值相同


    在本实验中、我想说错误没有标记、在跳过该组选择时、至少您的代码的运行方式与我的代码完全相同。

    我认为这对我来说已经足够了、FSM 状态在该用例中不会做出反应、因此我的错误检查代码很可能也是可以的...

    奇怪的问题:是的、我们的引导加载程序是 bank0的开头、它会写入 bank0、bank1和 bank7、这就是几个(通用) ram-functions (和 API 库也位于 ram 中)的原因。