您好!
在 我们的现有实施中使用 TI FEE 驱动器代码时、我们遇到一个例外情况、在该实施中、F021闪存 API 从 RAM 中执行。 TI FEE 驱动器代码从闪存中执行。 我们的理解是、由于 TI FEE 驱动器代码调用 F021闪存 API、因此也需要从 RAM 执行。 如果这是准确的、 您能否分享 从 RAM 中执行 TI FEE 驱动器代码所需的更改? 如果没有、请要求您告知 我们此问题的可能原因。
谢谢、此致、
Vimal
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.
您好!
在 我们的现有实施中使用 TI FEE 驱动器代码时、我们遇到一个例外情况、在该实施中、F021闪存 API 从 RAM 中执行。 TI FEE 驱动器代码从闪存中执行。 我们的理解是、由于 TI FEE 驱动器代码调用 F021闪存 API、因此也需要从 RAM 执行。 如果这是准确的、 您能否分享 从 RAM 中执行 TI FEE 驱动器代码所需的更改? 如果没有、请要求您告知 我们此问题的可能原因。
谢谢、此致、
Vimal
您好 Jagadish、
当 TI_FeeInternal_PollFlashStatus()函数作为以下块的一部分从 TI_FEE WriteSync()中调用时,我们会获得预取中止:
while (TI_fee_GlobalVariables[u8EEPIndex].fee_u16BlockSize!=0U)
{
u8WriteCount = TI_FeeInternal_WriteDataF021 (false、(uint16) TI_fee_GlobalVariables[u8EEPIndex].fee_u16BlockSize、u8EEPIndex);
/*避免 MISRA 警告*/
u8WriteCount=u8WriteCount;
/*SAFETYMCUSW 91 D MR:16.10 "原因-不需要返回值。"*/
(空) TI_FeeInternal_PollFlashStatus();
if (TI_FEE 全局变量[u8EEPIndex].FEE u16BlockSize <= 0x8U)
{
TI_FEE 全局变量[u8EEPIndex].FEE u16BlockSize = 0x0U;
}
其他
{
TI_FEE 全局变量[u8EEPIndex].FEE u16BlockSize=u8WriteCount;
}
}
以下快照 包含一些调试 信息:
如果需要其他详细信息、请告知我。
谢谢、此致、
Vimal
您好、QJ Wang、
我们的部分代码正在 对组0扇区执行读取/写入/擦除操作。 为了实现这一点、 F021闪存 API 从 SRAM 执行。 由于 FEE 代码进行 F021调用、它是否必须 从 SRAM 执行?
不确定这是否有用、但另一个观察结果是、在异常之前、 写入第一个块时、TI_FEE 内部 StartProgramBlock ()和 TI_Fee_WriteBlockHeader ()的 TI_Fee_WriteSync ()调用会导致 FMSTAT 被设置为0x4010、即非法地址和命令状态失败。 如 之前的响应所述,调用 TI_FeeInternal_PollFlashStatus()时,会发生预取中止。
谢谢、此致、
Vimal
要将数据编程到组0中的扇区、必须在 SRAM 外执行 F021闪存 API 和直接调用 API 的函数。
若要将数据编程到 EEPROM (组7)、可以从闪存组0或 SRAM 执行 F021闪存 API 和 FEE 驱动器。
如果您的项目将数据编程到闪存组0和 EEPROM (组7)中的两个扇区、 则 HE F021闪存 API 必须从 SRAM 运行、但 FEE 驱动器可以从闪存0执行。
您能否共享链接器 cmd 文件以及显示如何初始化 FEE 和编程数据的代码?
BTW、TMS570LS1227有三个闪存组:两个程序闪存组(组0和组1)和一个闪存组(组7、EEPROM)。 如果您不想将闪存 API 复制到 SRAM、则可以将数据存储到组1而不是组0的扇区。
请找到链接器 cmd 脚本和 main()函数:
您好、QJ Wang、
这个问题最初是通过在 每个 TI_FEE WriteSync()调用之前调用 TI_FEE MainFunction()来解决的。 这种方法已经使用了一段时间、但代码似乎再次崩溃。
在 共享的示例代码中,在 TI_FEE 读/写函数之后调用 TI_FEE MainFunction()。 同步函数不需要后续调用 TI_fee_MainFunction()。 您能否澄清 为什么需要在 TI_FEE Init()之后调用 TI_FEE MainFunction(),因为流程图没有提到同样的内容? 我们在 我们的代码中使用 TI_fee_Init()、TI_fee_ReadSync ()、TI_fee_WriteSync ()、TI_FeeErrorCode ()和 TI_fee_ErrorRecovery ()函数(TI_fee_GetStatus ()和 TI_fee_GetJobResult ()除外)。 由于 TI_FEE 错误恢复()函数有时可以调用 TI_FEE Init(),我们是否还需要在 TI_FEE 错误恢复()之后调用 TI_FEE 主函数()?
谢谢、此致、
Vimal
您好、QJ Wang、
感谢您澄清 在 TI_fee_Init()之后调用 TI_fee_MainFunction()的原因。
我们注意 到,需要在每次调用 TI_fee_WriteSync()之前调用 TI_fee_MainFunction()。 第一次调用似乎是将第三个64位字写入 FEE。 如果没有此 TI_FEE 函数()调用,则代码在 执行 第一个同步写入调用时会卡住。 在 CCS 中进行调试时、注意到步越不会退出 TI_FEE WriteSync()函数。 暂停 代码执行时、可以看到预取中止代码已命中。 非常感谢您对此的想法。
谢谢、此致、
Vimal
在 CCS/RM46L852中:使用 Fapi_issueProgramming Command 时跳转至 prefetchEntry 发现 调用 FAPI 函数的函数也需要从 RAM 运行、以避免预取中止。
调用闪存或 RAM 中 FAPI 函数的函数是什么?
您好、QJ Wang、
当使用以下序列(在示例代码中共享)时、代码按预期工作:
1.初始化闪存(Fapi_initializeFlashBanks、...)
2.写入闪存(组0)
3.初始化 FEE (TI_FEE、...)
4.写入 FEE (TI_FEE 同步)
以下 序列会出现问题:
1.初始化闪存(Fapi_initializeFlashBanks、...)
2.初始化 FEE (TI_FEE、...)
3.写入闪存 (组0)
4.写入 FEE (TI_FEE 同步)
如果您 对此 有任何想法、敬请关注。
谢谢、此致、
Vimal
您好!
我尝试了以下序列、写入数据以收费没有问题:
数据块0被写入 FEE、它是8字节数据数组。
我的测试中的 Fapi_Init_QJ ()仅初始化闪存组:
uint32_t fapi_Init_QJ ()
{
uint32_t status;
STATUS=Fapi_initiatizeFlashBanks (((uint32_t) SYS_CLK_FREQ);//用于 API Rev2.01 *
Fapi_setActiveFlashBank ((Fapi_FlashBankType) 0);
Fapi_enableMainBankSectors (0xFFFF);//用于 API 2.01*/
while (fapi_check_FSM_ready_busy!= fapi_Status_FsmReady);
返回(状态);
}
您好、QJ Wang、
在代码快照中、似乎没有写入闪存组0的调用。 我们不在代码中使用异步写入调用。 当在 TI_FEE ()之后和在 TI_FEE WriteSync ()之前按以下顺序写入闪存组0时、就会出现此问题:
1.初始化闪存(Fapi_initializeFlashBanks、...)
2.初始化 FEE (TI_FEE、...)
3.写入闪存 (组0)
4.写入 FEE (TI_FEE 同步)
在此附上重现此问题的示例代码以及链接器命令脚本。 如果需要其他详细信息、请告知我。 感谢您为解决此问题提供的帮助。
谢谢、此致、
Vimal
e2e.ti.com/.../8004.HL_5F00_sys_5F00_main.ce2e.ti.com/.../sys_5F00_link_5F00_cmd.txt