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.

[参考译文] F28M35H52C:当两个内核都打开时、闪存 API 不能正常工作

Guru**** 2536610 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/601873/f28m35h52c-flash-api-doesn-t-work-when-both-cores-are-on

器件型号:F28M35H52C
Thread 中讨论的其他器件:controlSUITE

大家好。

我在 Concerto 上遇到了 FlashAPI 问题。 我的项目基于来自用于 C28内核(DeviceSupport V210)的 controlSUITE 示例。

我已经对这个项目做了一些更改-我已经制作了一个能够闪存任何数量的字的函数。 我在写入 C28闪存扇区 F (0x128000)的1024阵列上对其进行测试。

当我单独在 C28上测试这些算法(M3断开连接)时、一切都正常。 之后、我决定让 M3执行一些工作。 M3内核将阵列加载到共享 RAM 中、并向 C28提供将该缓冲器刷写到其存储器中的命令。

在本例中、C28无法刷写或擦除它的扇区。 如果我将项目编程到 C28并使用"Go Main"按钮运行、它只能执行此操作;M3必须被停止。

问题出在哪呢? C28的所有代码都从 RAM 中运行(在运行时与 memcopy()一起复制)。 函数被调用、Fapi_IssueProgrammingCommand 返回"Fapi_SUCCES"、FlashPump()由 M3交错并由 C28... 有人能帮我解决这个问题吗?

如果您想查看代码、则在 pastebin 上有一些器件。 可以在 BitBucket 上访问完整项目。

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

    此问题是否来自在调试期间调用的 GEL 脚本?

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

    迪诺纳

    我很高兴您能与 C28配合使用! 如果是这样、听起来 M3会干扰闪存编程 API。 您是否正在使用闪存泵信标? M3是否可以调整时钟配置?

    要回答第二个问题是、GEL 文件可能会影响可能导致 API 出现问题的设置。

    请告诉我您发现的内容!

    此致、
    Cody

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

    1) 1)如果我理解正确、C28x 应用能够在调试器连接且 M3停止时擦除闪存并对其进行编程。 当您的应用是独立的(未连接调试器)、而 M3通过共享 RAM 向 C28x 发送一些数据时、C28x 应用程序不工作。 我是对的吗?

    2) 2) 2)您能否检查看门狗装置是否根据需要在 M3侧进行维修?

    3) 3)您的 M3应用程序是否在 C28x 上编程代码之前为 C28x 提供任何 IPC 引导命令? 这会导致 C28x 上出现 Itrap。

    4) 4)您能否确认在不涉及 M3的情况下进行闪存空白检查并验证是否通过?

    5) 5)当您说 C28x 应用程序无法擦除和编程时、空白检查和验证是否失败? 如果是,它们是否在该部门的第一个地址或以后的地址失败?

    6) 6)您是否(通过使用 IPC)确保 C28x 获得了泵信号量? 您如何知道您的应用程序在发生故障时已通过此步骤? 您是否有 GPIO 切换或指示此步骤已完成的操作?

    7) 7)您是否在 M3连接时检查了 C28x 内核的频率?

    8) 8)请注意、GEL 的 ram_init 函数会清除 RAM 内容。 检查这是否会导致您的应用程序出现任何问题。

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

    Gudivada 先生,感谢你的答复。 您的问题:

    [引用 user="Vamsi Gudivada"]

    1) 1)如果我理解正确、C28x 应用能够在调试器连接且 M3停止时擦除闪存并对其进行编程。 当您的应用是独立的(未连接调试器)、而 M3通过共享 RAM 向 C28x 发送一些数据时、C28x 应用程序不工作。 我是对的吗?

    [/报价]

    几乎是真的。 C28x 应用能够在调试器连接时擦除闪存并对其进行编程、并且只有在 C28器件在 M3和 M3未启动后上传时才会停止 M3。 工作流程的外部人员:
    Device disconnected -> Start M3 Debug Session -> M3 Program is loaded and M3 is stopped on "main"-> Connect to C28 -> Load C28 program -> Program loaded and C28 is stopped on "main"->"Perform C28 part (运行或按步骤)

    如果我对 C28进行编程、并且只有 M3 -无法正常工作。 如果我对 M3进行编程、然后对 C28进行编程、则启动 M3 -无法正常工作。 在使用 JTAG 进行编程后、C28上会保留一些状态、以启用闪存、我不知道。

    [引用 user="Vamsi Gudivada"]
    2) 2) 2)您能否检查看门狗装置是否根据需要在 M3侧进行维修?
    [/报价]

    在 M3侧、在调用 IPC_boot 之前禁用两个看门狗。

    [引用 user="Vamsi Gudivada"]
    3) 3)您的 M3应用程序是否在 C28x 上编程代码之前为 C28x 提供任何 IPC 引导命令? 这会导致 C28x 上出现 Itrap。
    [/报价]

    不可以、当 M3停止或断开连接时、我将"刷写"项目编程到 C28闪存中。 因此、当我发出"IPC Boot"命令时、C28已准备好接收它。 C28收到此命令并进入主程序后、会将所有刷写代码复制到 RAM 中。 无论如何、我没有 ITRAP 或任何 NMI。

    [引用 user="Vamsi Gudivada"]
    4) 4)您能否确认在不涉及 M3的情况下进行闪存空白检查并验证是否通过?
    [/报价]

    嗯... 嗯、是的、但我不使用 FlashAPI 函数进行验证。 对于"空白检查"、我使用"对于扇区中的所有地址:{if (* flashAddress!= 0xFFFF) error;else flashAddress++}"。 为了验证、我使用相同的算法、但将闪存地址与要刷写的缓冲器中的数据进行比较。

    [引用 user="Vamsi Gudivada"]
    5) 5)当您说 C28x 应用程序无法擦除和编程时、空白检查和验证是否失败? 如果是,它们是否在该部门的第一个地址或以后的地址失败?
    [/报价]

    是的、如果未擦除或未编程-它在第一个地址上失败。 我还使用"Watch Memory"窗口检查内存、并且可以清楚地看到擦除/闪存操作是否成功。

    [引用 user="Vamsi Gudivada"]
    6) 6)您是否(通过使用 IPC)确保 C28x 获得了泵信号量? 您如何知道您的应用程序在发生故障时已通过此步骤? 您是否有 GPIO 切换或指示此步骤已完成的操作?
    [/报价]

    说实话、我根本不检查它=)我只需在 M3上调用"LeavePump()"、然后使用"IPC Boot"启动 c28、然后在 C28上调用"GainPump()"。

    [引用 user="Vamsi Gudivada"]
    7) 7)您是否在 M3连接时检查了 C28x 内核的频率?
    [/报价]

    不、我没有检查它、但我使用了另一个 Concerto 项目的核心初始化、这很好。

    [引用 user="Vamsi Gudivada"]
    8) 8)请注意、GEL 的 ram_init 函数会清除 RAM 内容。 检查这是否会导致您的应用程序出现任何问题。
    [/报价]

    我知道这一点、但无论如何我都不会断开调试器、因此会执行 GEL 脚本。 几年前、我在这方面遇到了一些问题、但它变成了 NMI。 现在、我看不到这会如何影响该项目。 我还使用"Watch Memory"窗口检查内存、一切正常。

    您可以在 Pastebin 摘录中查看 M3代码 :https://pastebin.com/u/Disona
    我还将此项目上传到了 BitBucket: bitbucket.org/.../src

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

    Watkins 先生,感谢你对我的问题的关注。
    是的、我正在使用信标-我在 M3上调用"LeavePump ()"、然后启动 C28 (通过 IPC Boot_TO_Flash)、然后在 C28上调用"GainPump ()"。
    关于时钟配置:我在 M3上调用"SysCtlClockConfigSet()"、将 C28设置为150MHz、将 M3设置为75MHz、然后才调用"IPC_Boot "函数。

    我还应该注意 到、我已经在器件修订版0上使用 XDS100v2 JTAG (在 controlCARD 上)尝试了我的项目、在器件修订版 B 上使用 JTAG Sauris SAU510 ISO Plus (我们的控制器)尝试了我的项目。

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

    感谢您的回答。

    1) 1)您是否在 C28x 闪存插件 GUI 中使用与 M3应用的 PLL 配置相同的 PLL 设置? 或
    它们是不同的吗?

    2) 2)如何为 M3配置引导引脚?

    3) 3)您使用的是哪个版本的 CCS? 您是否检查了更新并安装了(如果有)?

    4) 4)您是否使用 CCS 中的绿色虫子来启动和加载代码? 如果是、您是否可以尝试启动目标配置文件、然后连接、然后重置并加载 M3和 C28x、然后运行 M3、再运行 C28x?

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

    Gudivada 先生

    回答您的问题:

    [引用 user="Vamsi Gudivada"]

    1) 1)您是否在 C28x 闪存插件 GUI 中使用与 M3应用的 PLL 配置相同的 PLL 设置? 或
    它们是不同的吗?

    [/报价]

    我不理解这个问题。 在调试配置窗口中、闪存设置如下所示:

    [引用 user="Vamsi Gudivada"]

    2) 2)如何为 M3配置引导引脚?  

    [/报价]

    M3内核引脚配置为从闪存引导(既可在 controlCARD 跳线上使用、也可在我们自己设计的控制器上使用)

    [引用 user="Vamsi Gudivada"]
    3) 3)您使用的是哪个版本的 CCS? 您是否检查了更新并安装了(如果有)?

    [/报价]

    我在一台 PC 上使用 CCS v7.1.0.00016、在另一台 PC 上使用 v7.2.0。 问题在 两个版本上都重复出现。

    4)您是否使用 CCS 中的绿色虫子来启动和加载代码? 如果是、您是否可以尝试启动目标配置文件、然后连接、然后重置并加载 M3和 C28x、然后运行 M3、再运行 C28x?[/quot]

    我尝试了两种方法。

    我已经为您准备了两个有关此问题的视频。 第一个视频显示了一个故障案例。 第二个示例显示了成功的方法。 第二个视频就在第一个视频的后面发生。

    e2e.ti.com/.../FlashProgrammingError.mp4

    e2e.ti.com/.../Flash-Success.mp4

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

    迪诺纳

    在我看来、这并不像一个闪存 API 问题、而是更多的系统(PLL/等待状态)配置问题。

    在您提供的快照中、C28x 的闪存插件 GUI 配置为60MHz。 如您所述、您的 M3应用设计为150MHz/75MHz。 在发生故障的情况下、当您在 M3之前执行 C28x 时、C28x 频率将为60MHz、而不是150MHz。 请测量 SYSCLK 并确保它在发生故障时确实是150MHz。

    传递给 Fapi_initiatizeAPI ()函数的频率是多少? 以及如何配置等待状态?

    谢谢、此致、
    Vamsi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Gudivada 先生
    感谢你的建议。
    我尝试过不同的速度组合、但它没有任何效果。 结果始终相同-闪存在编程后正常工作、当我从 M3启动 C28时不工作。

    我已经尝试以100和150 MHz 的速度启动 C28 (通过在 SysCtlClockConfigSet() M3函数中设置适当的分频器)。 我已经通过 LED 闪烁来检查此速度、计数在1秒内闪烁。 这不是最准确的方法、但只要检查100MHz 是100MHz、150MHz 是150MHz 就足够了。
    对于这两个频率、我分别设置了适当的定义- CPU_FREQ_100MHz 和 CPU_FREQ_150MHz、这会影响 C28闪存的 RWAIT (可能还会影响 SMTH)。 我还向 Fapi_Init 传递了正确的值(分别为150和100)。
    但我仍然无法使它正常工作=(
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    迪诺纳

    好的。

    让我们以不同的方式进行调试。  在传递要对 C28x 进行编程的 IPC 命令后、您能否编辑 M3应用程序以使其处于空的无限循环中?  M3应用程序应负责处理所有与系统相关的工作、例如看门狗禁用、PLL 配置、然后最后传递用于 C28x 的 IPC 命令以继续。

    谢谢、此致、
    Vamsi

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

    Gudivada 先生

    我已经完成了您的要求、并在 M3发送 IPC 命令后输入 while (1)。

    我还更新了一些注释、可能会对您有所帮助。 所有更改都被推送到 BitBucket。

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

    迪诺纳

    进行此更改后、C28x 程序的行为是否有差异?  

    谢谢、此致、

    Vamsi

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

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

    迪诺纳

    我可以理解。  

    以下几个调试点可帮助您:

    1) 1)您能否在发生故障时检查电压轨、以确定它们是否为所需电平?  因为只有在 M3也处于活动状态时才会发生故障。  

    2)是否可以在程序命令结束后调用 fapi_getFsmStatus()函数? 这将提供 fmstat 寄存器值、并提供有关此故障的线索。  

    我要求这样做的原因是: fapi_issueProgrammingCommand()函数不会等到程序操作结束;它只发出命令并返回。  因此、用户应用程序(如示例中所示)必须等待 FMC 完成程序操作、然后才能返回到任何类型的闪存访问。 fapi_checkFsmForReady()函数可用于监视已发出命令的状态。  此外、程序函数在发出程序命令后不会检查 fmstat。 当 FSM 完成程序操作时、用户应用程序必须检查 FMSTAT 值。  FMSTAT 指示程序运行期间是否发生任何故障。 用户应用程序可以使用 Fapi_getFsmStatus 函数来获取 fmstat 值。  

    谢谢、此致、

    Vamsi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Gudivada 先生
    1) 1)不知道如何正确执行。 您希望我测量 VDD 3.3V 还是什么? 我怀疑这可能是一个问题、因为我们有项目、其中有9个 PWM、15个 ADC 通道、计时器、CAN、 SPI 和 I2C 同时工作、电源域正常。
    2) 2)我已为 M3运行和不运行的情况记录 FSM、并得到结果:

    在这两种情况下、在发出刷写命令后、我可以看到 PGM 和 BUSY 置位-这是可以的、

    等待"checkFsmReady()"后,如果成功(没有 M3),则所有位都将被清除。
    对于 M3、在等待"Fapi_checkFsmReady()"后、我可以看到 INVDAT、PGM 和 BUSY 位。 文档显示:"无效数据。 当 INVDAT 置位时,该位表示用户尝试对“1”进行编程,其中“0”已经存在。 此位由清除状态命令清除。"
    但通过观察存储器窗口、我可以看到我的扇区为 al 0xFFFF =\
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    迪诺纳

    今天、我获得了 F28M35x 器件、并尝试了您的项目。

    不确定为什么 M3应用程序代码中包含"#include "F021_Concerto C28x.h"。 我将其更改为#include "F021_Concerto Cortex.h"。

    此外、我注意到您在 M3项目的包含选项中有"C:\ti\controlSUITE\device_support\f28m35x\V210\F28M35x_common\include\FlashAPI"。 以上是针对 C28x 的。 我将其更改为"C:\ti\controlSUITE\device_support\f28m35x\v208\Mware\inc\FlashAPI"。

    我在调试器上下文中添加了"IPCMtoCBootControlSystem (CBROM_MTOC_BOOTMODE_BOOT_FROM _FLASH);"的注释。

    之后、我编译了您的项目并成功将代码加载到 M3和 C28x 的闪存中。

    然后、我先执行 M3、然后执行 C28x。 C28x 能够成功接收来自 M3的命令、然后从地址0x128000开始对1024个字进行编程。 不确定为什么它会为您造成故障。

    除上述项目外、我没有对您的项目进行任何更改。

    您可能希望在对扇区进行编程之前包含一个擦除命令、以确保该扇区被擦除。 有时、您可以在调试期间执行重新启动而不是重新加载。 由于重新启动不会启动擦除、闪存可能已经被其他数据编程(例如、在视频中调试时、您改变观察窗口中数据的方式)。 这可能会在您进行编程时导致 INVDAT 问题。 在对代码中的扇区进行编程之前擦除该扇区可能会清除该问题。 我知道您在存储器窗口中看到所有0xF、但有时调试器不显示正确的数据、尤其是在闪存操作期间、存储器窗口保持对闪存开放或等待状态不正确时。

    此外、我认为您应该检查 VDD 1.8/1.2和 VDDIO 3.3电压轨、以确保它们在 M3和 C28x 处于活动状态且闪存操作正在进行时处于建议的运行条件内。

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

    正如我在上一次答复中提到的、我能够成功地加载/执行您的 C28x 项目。
    您现在是否能够成功进行编程?

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

    假设问题已解决、我将关闭此主题。

    谢谢、此致、
    Vamsi