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.

[参考译文] TMS320F28379D:使用闪存 API 写入闪存扇区时出现问题

Guru**** 2593490 points
Other Parts Discussed in Thread: CONTROLSUITE, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/669111/tms320f28379d-issues-with-writing-into-flash-sectors-using-flash-api

器件型号:TMS320F28379D
Thread 中讨论的其他器件:controlSUITEC2000WARE

bool FlashWrite (void)
{

uint32 u32Index = 0;
uint16 i = 0;

Fapi_StatusType oReturnCheck;
易失性 Fapi_FlashStatusType oFlashStatus;

Dint;

//
//增益泵信标
//

SeizeFlashPump();

Fapi_FlashStatusWordType oFlashStatusWord;

EALLOW;

//
//需要此函数来根据系统初始化闪存 API
//频率才能执行任何其他闪存 API 操作
//
oReturnCheck = Fapi_initializeAPI (F021_CPU0_BASE_ADDRESS、200);

if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//
返回 false;
}

//
// Fapi_setActiveFlashBank 函数进一步设置闪存组和 FMC
//闪存操作将在组上执行
//
oReturnCheck = Fapi_setActiveFlashBank (Fapi_FlashBank0);
if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//
返回 false;
}

//
//验证 SectorL 是否被擦除。 擦除步骤本身会执行
//进行验证。 此验证是可以执行的第二次验证。
//
oReturnCheck = Fapi_doBlankCheck ((UINT32 *) Bzero_SectorG_START、
Bzero_16KSector u32length、
oFlashStatusWord (&O);

if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//如果 Erase 命令失败,请使用 Fapi_getFsmStatus()函数获取
// fmstat 寄存器内容,查看是否有 EV 位、ESUSP 位、
// Cstat 位或 VOLTSTAT 位被置位(请参阅 API 文档
//更多详细信息)
//
返回 false;
}

//填充要写入的数据的一些片段的开头
//不调用函数
//填充要写入的数据的片段结束

对于(i = 0、u32Index = Bzero_SectorG_start;
(u32Index <(Bzero_SectorG_start + wors_in_flash_buffer))和&(oReturnCheck = Fapi_Status_Success);
i+=8、u32Index+=8)
{
oReturnCheck = fapi_issueProgrammingCommand ((UINT32 *) u32Index、
Flash_Array + I、
8、
0、
0、
Fapi_AutoEccGeneration);

while (fapi_checkFsmForReady ()=fapi_Status_FsmBusy);

if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//
返回 false;
}

//
//读取 fmstat 寄存器内容以了解之后 FSM 的状态
//用于任何调试的程序命令
//
oFlashStatus = fapi_getFsmStatus();

//
//验证编程的值。 Program 步骤本身会进行验证
//进行。 此验证是可以执行的第二次验证。
//
oReturnCheck = fapi_doVerify (((uint32 *) u32Index、
4、pFlashArray+(I/2)、
oFlashStatusWord (&O);

if (oReturnCheck!= Fapi_Status_Success)
{
//
//检查闪存 API 文档以了解可能的错误
//
返回 false;
}
}

//
//启用 ECC
//
Flash0EccRegs.ecc_enable.bit.enable = 0xA;

EDIS;
EINT;

//
//保持对闪存泵的控制
//
ReleaseFlashPump();

返回 true; 

我在这里遇到了闪存 API 问题。

上面的函数(截至目前)在其中一个扇区中写入一些数据、并使用 controlSUITE 中的参考代码进行写入。

调试时、我可以看到'Fapi_setActiveFlashBank (Fapi_FlashBank0);'返回的值始终为'Fapi_Error_InvalidHclkValue'。 我已确保应用程序循环之前的一次性初始化期间调用 InitFlash()。

问题可能出在哪呢?

此致、

Prasad

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

    您能否在执行 Fapi_setActiveFlashBank()之前检查(并确认)寄存器空间中的 RWAIT 值?

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

    Prasad、

    您是否能够在不进行任何修改的情况下成功执行 C2000Ware 示例?

    您能否通过删除项目中的任何机密资料来附加项目?

    谢谢、此致、
    Vamsi

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

    Vamsi、您好、感谢您的回答。

    当我发布这个问题时、我没有使用 controlSUITE 中的 FLASH_programming 示例对我的器件进行编程。 我刚刚尝试过这个示例、它确实起作用。

    我正在确定示例和我正在开发的实际代码之间的差异、这可能需要几个小时来查看与闪存寄存器有关的所有初始化步骤。

    如果之后我仍然感到困住、我将与您分享该项目。 我确信该项目包含机密信息、因此需要付出很大的努力才能消除所有依赖项。 如果一切都失败,我可能不得不尝试这种长时间的拍摄。

    唯一可以帮助我的是、我可以看到 FLASH_programming 示例适用于双 CPU。 CPU-1的类似示例是否可直接使用?

    到目前为止、我们仅使用 CPU-1。 当然、问题是 CPU-1与 Dual 之间的关系是否与闪存操作相关?

    感谢您的持续支持、无论如何、我会在这里更新我的进度。


    谢谢你。

    此致、
    Prasad

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

    为双 CPU 编写的示例将适用于 CPU1、即使您仅使用 CPU1也是如此。

    我对调试的建议是尝试以增量方式更改示例、并查看您的更改是否会中断该流程。

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

    只是想提供一个小信息:CPU1和 CPU2之间共享闪存泵。 因此、一次只能有一个内核(CPU1或 CPU2)执行闪存擦除和编程操作。 由于您提到您目前仅使用 CPU1、因此只需确保 CPU1拥有泵。 浏览示例中使用的 SeizeFlashPump()函数-它用于通过泵信号量为内核增益泵。

    正如 Katta 提到的、CPU1示例应在不依赖 CPU2的情况下工作。

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

    您好、Vamsi、

    我正在附加一个包含项目的 zip 文件。 编译中没有错误。 它最终会进入非法_ISR。  

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

    由于您说它最终会进入非法 ISR:请搜索"为什么使用闪存 API 时应用程序最终会进入非法 ISR?" 在 C2000闪存 wiki 页面中: processors.wiki.ti.com/.../Flash_FAQ

    修复后、请重新连接项目。

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

    Vamsi 您好、感谢您提供有关 ILLEGAL_ISR 问题的输入。 我已经修复了。

    请参阅随附的项目进行审核。 我仍然卡在 返回   Fapi_Error_InvalidHclkValue 的 Fapi_setActiveFlashBank()中。

    我想我一小时前添加的项目不是我打算与您分享的项目。

     

    项目: e2e.ti.com/.../milind5-_2D00_-Copy.zip

     

    此致、

    Prasad

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

    Prasad、您好!

    我调试了您在上面共享的项目。 没有为我构建项目。 错误是找不到文件"Registers_FMC_Be.h"。

    通过在 Flash_CPU1.c 中注释以下行进行小改动、我可以构建项目。  

    #include "FlashAPI/F021.h" 

    运行项目时,我没有在 Fapi_setActiveFlashBank()中看到任何错误。

    您是否尝试过清理构建? 您是否对 controlSUITE 进行过任何更改?

    谢谢、

    Katta

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

    大家好、感谢您的回答。 我想我刚刚(几分钟前)解决了这个问题。

    我今天重新安装了 controlSUITE、以确保一切都准备就绪、我想这确实是关于标头包含项的内容。 如果我包含
    "F021_F2837xD_C28x.h"之后的"F021.h"不起作用、报告缺少头文件"Registers_FMC_Be.h"。 我上载压缩的代码时、它并未在昨晚完成。 当我昨天晚上在不同的计算机上尝试了相同的东西时,就出现了重新安装的想法。 因此、我有一个提示、即我上传的代码会在我的计算机上编译、但可能不会在您的计算机上编译。 唯一的区别可能是环境和 controlSUITE。

    那么、当我将顺序更改为时

    #include "FlashAPI/F021_F2837xD_C28x.h"
    #include "FlashAPI/F021.h"

    我现在可以编译代码而不会出现任何问题、并且可以在内存浏览器中验证数据。

    感谢您和 Vamsi 的持续支持。

    此致、

    Prasad

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

    Prasad、

    《F2837xD 闪存 API 参考指南》(http://www.ti.com/lit/pdf/spnu629)第2.3.2.2节"分发文件"中所述、并在 C2000Ware 示例中显示、使用闪存 API 库时唯一需要包含的头文件是"F021_F2837xD_C28x.h"。  此文件包括其他必要文件。

    谢谢、此致、

    Vamsi