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.

[参考译文] TMS320F28377S:BankX 的 Fapi_issueProgrammingCommand 中的"DataOnly";参数与 BankY 的验证函数之间的关系

Guru**** 2350610 points
Other Parts Discussed in Thread: TMS320F28377S, CONTROLSUITE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/592598/tms320f28377s-relationship-between-dataonly-parameter-in-fapi_issueprogrammingcommand-of-bankx-and-verify-function-of-banky

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

您好!

我对 TI TMS320F28377S 器件有一个非常奇怪的问题。 我创建了自己的引导加载程序、用于闪存编程/擦除/空白检查和验证。 引导加载程序代码通过引导 ROM 函数直接加载到 RAM。 除一种情况外、我可以成功地擦除/空白检查/编程/验证器件。 我们知道、可以使用 ECC 数据(Fapi_AutoEccGeneration 参数)或不使用 ECC 数据(Fapi_DataOnly 参数)对闪存进行同时编程。 当我使用参数 AutoEccGeneration 对器件(bank0和 bank1)进行编程时、关闭器件电源、再次为器件加电并运行验证、一切都正常-我可以成功验证所有存储器块(DCSM OTP bank0、DCSM OTP bank1、bank0扇区、bank1扇区)。 在这种情况下会出现非常奇怪的情况:

我只使用 Fapi_DataOnly 参数对 Bank0扇区(非 DCSM OTP 组0或组1)进行编程。 编程传递没有任何问题、并且组0扇区的验证也是可以的。 之后、我将器件断电、再次上电并运行整个器件的单独验证功能。 DCSM OTP Bank0验证工作正常、Bank0扇区工作正常、当我尝试验证 Bank1扇区(或 DCSM Bank1 OTP 区域)时、引导加载程序停止工作(看起来冻结或类似)。 奇怪的是、通过 CCS 和 XDS510USB 调试代码工作正常... 在相反的情况下会发生相同的情况-当我使用 Fapi_DataOnly 参数对 Bank1闪存进行编程时、Bank0验证函数会导致引导加载程序停止工作... 如前所述、当我使用 AutoEccGeneration 参数对任何组进行编程时、我可以验证该器件的任何组上的功能、而不会出现任何问题。

我不明白为什么 Fapi_DataOnly 参数会导致我的引导加载程序出现这种奇怪的行为。 如果第二个组已使用 Fapi_DataOnly 参数进行编程、有人可以帮助我验证没有使用 AutoEccGeneration 参数进行编程/或编程的组、以解决我的问题吗? 或者是否存在任何限制、并且两个组需要使用相同的编程参数进行编程?

我附加了*。map 文件和*。cmd 文件以说明哪个内存占用了我的引导加载程序。

e2e.ti.com/.../flash_5F00_programming_5F00_cpu01_5F00_v210.map.txt

e2e.ti.com/.../flash_5F00_programming_5F00_cpu1_5F00_FLASH.cmd.txt

我的引导加载程序与 V210控制套件项目资源中的 FLASH_programming_CPU1项目不一致。

感谢您的任何建议!

此致、

Tomas

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

    Tomas、

    AutoEccGeneration 模式计算和编程 ECC 以及提供给程序函数的闪存主阵列数据。  使用 Fapi_DataOnly 模式时、ECC 未编程、因此在使用 Fapi_DataOnly 模式进行编程后读取闪存时会发生 ECC 错误。  原因,使用调试器时可能没有注意到 ECC 错误,因为调试器的 GEL 文件在其 OnReset()函数中禁用了 ecce-check。  

    使用 AutoEccGeneration 模式可避免出现问题。  当所有64位数据不可用于程序操作时、通常使用 Fapi_DataOnly 模式。  在这种情况下、如果 ECC 被编程、除非扇区擦除完成、否则应用程序稍后无法对该64位中的其他未编程位进行编程。  因此、ECC 只有在所有64位可用时才被编程。  

    注意: 我注意到 GEL 文件仅为 CPU1-FMC 禁用 ECC、而不为 CPU2-FMC 禁用 ECC。  我将提交一个 TT 来解决此问题。

    谢谢、此致、
    Vamsi   

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

    您好、Vamsi、

    感谢您的回答。 您可能不理解我所写的内容-验证失败不会出现在闪存部分、闪存部分已使用 Fapi_DataOnly 参数进行编程。 验证之前未编程(或已使用 Fapi_AutoEccGeneration 编程)的闪存部分是否发生故障/引导加载程序冻结。

    上面提到的引导加载程序冻结似乎就是这种情况

    //等待 FSM 完成实际操作
    while (fapi_checkFsmForReady()!= fapi_Status_FsmReady){} 

    永不结束-它始终在循环中测试 Status_FsmReady。

    BTW、在单独的验证函数中、我将 两个组的 ECC_ENABLE.BIT 设置为0:

    Flash0EccRegs.ecc_enable.bit.enable = 0x0;
    Flash1EccRegs.ecc_enable.bit.enable = 0x0; 

    因此、我假设读取时不会生成 ECC 错误。。。。

    当我通过读取禁用的 ECC 使能位来验证已使用 Fapi_AutoEccGeneration 参数进行编程的闪存组时、是否正常? 还是更好的方法是启用该位?

    谢谢、此致、

    Tomas

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

    Tomas、

    1)关于引导加载程序冻结: 我查看了您的链接器命令文件。  当加载和运行地址都位于 RAM 中时、为什么使用不同的加载和运行地址?  通常、当您希望将代码加载到闪存、但出于性能原因或某些只需要从 RAM 执行的配置代码、然后将其复制到 RAM 时、会使用不同的加载和运行地址。  在这种情况下,memcpy()函数用于将代码从加载地址复制到运行地址,然后在运行时从运行地址执行代码。  在您的情况下,我认为您没有使用 memcpy(),因此您尝试执行的代码在导致 ITRAP 的运行地址中并不存在。  

    2) 2)您不需要在 while 循环下执行验证功能。  以下是擦除和编程操作所必需的。    

       while (fapi_checkFsmForReady()!= fapi_Status_FsmReady){}

    3)关于 ECC 禁用代码: 是的、如果为 ECC_ENABLE 位字段写入值0x0、则不应出现 ECC 错误。  在写入这些寄存器之前、您是否使用了 EALLOW?

    4) 4)如果您使用 AutoEccGeneration 模式对 ECC 进行编程、则在验证步骤中不应出现 ECC 错误。

    谢谢、此致、
    Vamsi

     

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

    您好、Vamsi、

    1) 1)您说得对、我在项目中不使用 memcpy()。 我在 TMS320器件中仍然是新手,因此在我的项目中可以找到一些不合逻辑的代码片段:-)

    是代码:   

    #ifdef __TI_Compiler_version__
    #if __TI_Compiler_version__>=15009000
    .TI.ramfunc:
    {-l F021_API_F2837xS_FPU32.lib}> RAMGS01、 PAGE = 0
    
    其他
    ramfuncs:>RAMGS01, PAGE = 0
    #endif
    #endif 

    在.cmd 文件中、确定(或者、您在此代码中看到了一些错误)? 是否可以使用它而不是最初使用它:

    #ifdef __TI_Compiler_version__
    #if __TI_Compiler_version__>=15009000
    组
    {
    .TI.ramfunc
    {-l F021_API_F2837xS_FPU32.lib}
    
    负载= RAMGS01、
    运行= RAMGS6、
    load_start (_RamfuncsLoadStart)、
    load_size (_RamfuncsLoadSize)、
    load_end (_RamfuncsLoadEnd)、
    run_start (_RamfuncsRunStart)、
    run_size (_RamfuncsRunSize)、
    run_end (_RamfuncsRunEnd)、
    PAGE = 0
    其他
    组
    {
    ramfuncs
    {-l F021_API_F2837xS_FPU32.lib}
    
    负载= RAMGS01、
    运行= RAMGS6、
    load_start (_RamfuncsLoadStart)、
    load_size (_RamfuncsLoadSize)、
    load_end (_RamfuncsLoadEnd)、
    run_start (_RamfuncsRunStart)、
    run_size (_RamfuncsRunSize)、
    run_end (_RamfuncsRunEnd)、
    PAGE = 0
    #endif
    #endif 

    2)。 我已经修改了引导加载程序、不测试 Fapi_checkFsmForReady、但引导加载程序仍然冻结...

    3) 3)是的、我始终使用 EALLOW 和 EDIS 指令...

    我的问题仍然存在、但在更改.cmd 文件而没有加载/运行地址后、有一件事发生了变化-当我使用 Fapi_DataOnly 参数对 Bank 0进行编程时、我能够验证组1。 在进行 bank1验证期间无法实现引导加载程序冻结。 现在只保留第二种情况-当我使用 Fapi_DataOnly 参数对组1进行编程时、组0无法验证...非常奇怪...

    提醒-当我使用 CCS 调试代码时( 版本:5.5.0.00077),一切工作正常,没有任何错误!

    其他问题:我需要确认、用户可配置的 DCSM OTP Bank0属于组0 (在使用此 OTP 存储器之前需要激活相应的组0过程)、用户可配置的 DCSM OTP Bank1对数到组1? 或者、闪存的这些部分是独立的、它们不需要执行 Fapi_initializeAPI、Fapi_setActiveFlashBank、InitFlash_BANK0/1过程?

    谢谢、此致、

    Tomas

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

    1)看起来不错。 您无需包含"{-l F021_API_F2837xS_FPU32.lib}"。 它将成为.text 段的一部分、因此无需提及它。

    2) 2)您的代码现在卡在哪里? 您是否检查过它是否是 ITRAP? 此外、在您的应用程序中包含 NMI 处理程序。

    3) 3)我认为这不是 ECC 错误问题、因为您已正确禁用 ECC 检查。 在应用程序中启用 ITRAP 和 NMI 处理程序以进行进一步调试。

    4) 4)您说您的应用程序可以与 CCS 配合使用。 它实际上何时发生了故障? 它是否处于独立模式? 如果是、则应将代码映射到闪存、而不是 RAM。

    5) 5)您是否在组0和组1之间分别针对组0和组1闪存编程/擦除操作切换泵信号量?

    6) 6)确保在对 Bank0执行闪存操作之前调用 Fapi_initializeAPI (F021_CPU0_W0_BASE_ADDRESS、UserConfigured_frequency)和 Fapi_setActiveFlashBank (Fapi_FlashBank0)函数。

    7) 7)确保在对 Bank1执行闪存操作之前调用 Fapi_initializeAPI (F021_CPU0_W1_BASE_ADDRESS、UserConfiguredFrequency)和 Fapi_setActiveFlashBank (Fapi_FlashBank1)函数。

    8) 8)关于您对 DCSM OTP 的问题:我认为您正在询问是否需要执行 Fapi_initializeAPI、Fapi_setActiveFlashBank、InitFlash_BANK 程序来对 OTP 存储器进行编程。 是的、您需要从 API 库中执行这些函数、以便能够对 OTP 存储器进行编程。
    我认为该器件上没有用于 Bank1的 DCSM OTP -我将与我们的安全专家确认。

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

    此外、您能否检查您是否能够成功执行 controlSUITE 中提供的闪存 API 使用示例? 这有助于排除一些问题、以便进一步调试您的问题。

    示例位于:controlSUITE\device_support\f2837xS\vx\F2837xS_examples_CPU1\flash_programming。

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

    您好、Vamsi、

    再次感谢您的 asnwers。

    2) 2)代码滞留在同一位置-调用 Fapi_doVerify 函数后、我的引导加载程序停止通信、我无法从 MCU 获取答案。 很抱歉这个愚蠢的问题、但我从未使用过 ITRAP 和 NMI 处理程序、因此我不知道如何使用它-您能向我展示一些真实和适用的示例吗(或者您可以直接进入我附加的项目)?

    4) 4)我不认为我的应用程序不是从 RAM 运行-我可以在存储器查看器中看到闪存为空。 代码仅占用 RAM 中与.cmd 文件相符的存储器空间。

    5)、6)、7)是的、您可以在附加项目中看到它

    8)、是的、正如您所写的-我正在询问我是否需要执行用于 OTP 编程的 Fapi_initializeAPI、Fapi_setActiveFlashBank、InitFlash_BANK 过程。 我主要需要知道它是什么过程-如果组0或组1过程、即 DCSM OTP 1需要使用组0参数进行调用、而 DCSM OTP2需要使用组1参数...

    我真的很黑、为什么会发生这种情况... 我将整个项目作为 zip 文件附加。 您能不能看一下 flash_programming_cpu01.c、其中我做了注释(第532行和 594行)、引导加载程序在这一点上似乎卡住了。

    e2e.ti.com/.../verify_5F00_TMS320F28377S_5F00_05.05.2017.zip

    谢谢、此致、

    Tomas

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

    Tomas、

    在帮助您进一步调试之前、我需要回答几个问题:

    1) 1)您说:"提醒-当我使用 CCS 调试代码时( 版本:5.5.0.00077),一切都是正常的,没有任何错误!"

      如果它使用 CCS、您的应用程序何时发生故障?  

    2) 2) 2)能否检查您是否能够成功执行 controlSUITE 中提供的闪存 API 使用示例 ? 这有助于排除一些问题、以便进一步调试您的问题。

    示例位于: controlSUITE\device_support\f2837xS\vx\F2837xS_examples_CPU1\flash_programming

    注意:在示例代码中、将   Fapi_initializeAPI 中的194替换为200 (F021_CPU0_W0_BASE_ADDRESS、194);

    该示例具有错误的值"194"。  我们已经为下一版本修复了它。

    3) 3)您是否可以始终使用 Fapi_AutoEccGeneration 模式并查看该模式是否可以解决问题?  这将确认它是否是 ECC 问题。  此外、尝试针对验证代码执行汇编步进、并检查 ECC 寄存器以查看是否捕获到任何错误。 查看 TRM 以了解这些寄存器的详细信息。

    谢谢、此致、

    Vamsi  

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

    您好、Vamsi、

    1) 1)正如我之前所写的那样、这个问题只发生在一种情况下-当我使用 Fapi_DataOnly 参数而非 Fapi_AutoECCgeneration 对组1闪存进行编程时。 在这种´m 下(使用 Fapi_DataOnly 对组1进行编程、我无法验证组0、 我在这里的第一个帖子中描述了这种行为。  当我的引导加载程序到达运行验证函数的阶段时、它将停止工作。 我在所附项目的 flash_programming_cpu01.c 文件中对其进行了标记-请查看注释。  更详细地说-我可以与引导加载程序通信以进入开始操作的阶段(我的函数"WAIT_for_start_action ();")、并且验证函数有超时、但我没有从 MCU 获取答案(我希望过程 WAIT_for_finish_action ()未到达)、并且引导加载程序停止工作。

    当我通过 CCS 调试我的项目时(通过调试器 XDS510USB 将程序加载到 RAM)、然后运行它-一切都正常。 我的引导加载程序不会冻结、一切都正常。 但另一方面、当我通过 bootROM 函数将相同的编译项目加载到 RAM 并运行它时、除了验证组0之外、所有其他操作都有效、以防组1使用 Fapi_DataOnly 参数进行编程。

    2|当然、我可以检查它。 我可以使用哪个*。cmd 文件? 我的 cmd 从 RAM 运行代码、还是将代码从闪存复制到 RAM 的默认 cmd 文件?

    3) 3)请参阅1)- Fapi_AutoEccGeneration 工作正常、我能够验证整个闪存(组0和组1)。 我对此选项没有任何问题。

    谢谢、此致、

    Tomas

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

    1) 1)我浏览了您的代码。 我有疑问。 您是否将一个组或两个组的长度传递给验证函数? 在发生故障的情况下、我希望确保为 Bank0配置闪存 API 函数。 我看不出您的代码结构。 在验证 Bank0并由此询问之前、应为 Bank0配置 Fapi_initiataleAPI ()和 Fapi_setActiveFlashBank()函数。

    2) 2)尝试两者。

    3) 3)您能否尝试在发生故障的情况下为验证代码执行汇编步骤、并检查 ECC 寄存器以查看是否捕获到任何错误? 在进行验证时、您需要确保为未对 ECC 进行编程的组禁用 ECC。 我看到您根据 DesiredBank 的值在代码中仅为一个组禁用 ECC。

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

    您好、Vamsi、

    我在这里写了很长时间、因为我已经调查了我的引导加载程序故障的原因... 我已经研究了在"实时"模式下调试代码的选项、这给我带来了新的事实。 首先、我已经检查了我是否将代码正确加载到 RAM 中-因此我已经将器件中 RAM 的内容与从.out 文件生成的十六进制文件进行了比较。 此比较的结果是、RAM 中的数据等于十六进制文件中的数据。 然后、在调试器(CCS + XDS510USB)将程序加载到 RAM 时、我比较器件中 RAM 的内容。 同样、此比较的结果是相同的- RAM 中的数据等于生成的.hex 文件。 因此、结果是、我将源代码正确加载到 RAM 中。

    如前所述、当我通过调试器(CCS + XDS510USB)将程序加载到 RAM 并运行时、引导加载程序工作正常。 因此、我尝试在"实时"模式下调试代码(当我将代码加载到运行并启动代码时)、我发现所有代码都在调用闪存 API 验证函数的阶段工作:

    EALLOW;
    oReturnCheck = Fapi_doVerify (((UINT32 *)地址、(长度/2)、Buffer32、&oFlashStatusWord);
    EDIS; 

    地址的值为0x80000、长度为0x100。 当我调用此 Fapi_doVerify 函数时、会发生 NMI_ISR 中断... 为什么? 此中断的原因是什么? 我可以禁用该中断吗?

    正如我提到过的,在 CCS 的调试代码期间,CCS 似乎会禁用此中断,这就是为什么在调试中引导加载程序可以工作,而在“独立”模式中不能...

    您是否有任何关于如何修复此 NMI_ISR 调用的建议?

    谢谢、此致、

    Tomas

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

    我知道您在使用加载程序时将代码正确加载到 RAM 中。 这不是问题。

    正如我之前提到的、您将获得 NMI、这是因为 ECC 错误。 您可以通过查看 ECC 错误寄存器来确认这一点。 当您的应用在默认 NMI ISR 中暂停时、您可以检查 Flash0EccRegs 和 Flash1EccRegs (表2.14.1 TRM 的基址中提供了基址)。 特别要检查 UNC_ERR_ADDR_LOW 和 UNC_ERR_ADDR_HIGH 寄存器。 同时检查 NMIFLG 寄存器的 FLLUNCERR 位(指示导致 NMI 的闪存不可纠正错误的位)。

    禁用 NMI 不能解决此问题。 您应该修复根本原因- ECC 错误。 我知道您在验证功能之前禁用 ECC、但您根据 DesiredBank 变量的值仅为一个组禁用 ECC。 您的代码中可能有一个错误、在这种情况下、您可以为一个组禁用 ECC 但在另一个组上执行验证、或为一个组禁用 ECC 并在两个组上执行验证。 为什么不包括地址检查以确保传递给验证函数的地址和长度属于您正在禁用 ECC 的组/FMC?

    或者、您的编程代码中可能有一个错误、其中您对组错误地使用 DataOnly 和 AutoEccGeneration 模式。 您是否可以对两个组都使用 DataOnly? 您是否可以将 DataOnly 用于 Bank0而不是 Bank1?

    为了简化调试、您可能需要从应用中排除与闪存无关的代码。 只具有以下两个步骤的代码、然后查看它是否起作用。
    a)不要为组1对 ECC 进行编程。 在禁用 ECC 检查的情况下验证组1。
    b)为组0对 ECC 进行编程。 在启用 ECC 检查的情况下验证组0。

    只是好奇:为什么在为另一个组进行编程的同时、不想为一个组对 ECC 进行编程?

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

    您好、Vamsi、

    是的、您答对了- NMI ISR 是由 ECC 错误引起的。 我n´t ECC 错误会导致该中断、因为我在编程时与另一个组一起工作。 现在是清楚的。

    您需要了解我的引导加载程序代码- 这是用于擦除/编程/验证/空白检查的通用"编程器"。 因此、我需要允许客户使用 dataOnly 或 AutoECCgeneration 模式对 bank0或 bank1进行编程。 它仅取决于客户想要编程的内容。 从我的引导加载程序的这种普遍性出发、需要解决下一个场景:

    用户将使用 AutoECC 对 Bank0和使用 DataOnly 参数对 Bank1进行编程。 在编程期间、我能够验证(在编程后立即验证-一次操作编程+验证) BANK0/BANK1的 ECC 启用/禁用情况下的闪存。 但是、一段时间后、客户加载其十六进制文件并运行单独的验证函数。 在这种n´t 下、我不知道在哪个模式下对 BANK0/1进行编程。 那么、我如何验证这两个组呢? 我有测试、唯一的方法是在两个组中使用禁用的 ECC 错误来验证它...或者您有其他想法如何实现它? 我能否在验证哪个存储块已编程为 AutoECCmode、哪个存储块已编程为 DataOnly?

    您写道:
    或者、您的编程代码中可能有一个错误、其中您对组错误地使用 DataOnly 和 AutoEccGeneration 模式。 您是否可以对两个组都使用 DataOnly? 您是否可以将 DataOnly 用于 Bank0而不是 Bank1?

    这怎么可能呢? 当我使用 AutoECC 参数对 Bank0进行编程时 Flash0EccRegs.ECC_ENABLE.bit.ENABLE have the value 0xA  - enable ECC error. Must be also sets the Flash1EccRegs.ECC_ENABLE.bit.ENABLE to the value of 0xA in the case when only Bank0 is programming? And on the other hand, when programming only the Bank1 with DataOnly, is it needed to set the both ECC.Enable bits for both banks to 0x0?

    您写道:只是好奇:为何不想在为另一个存储库编程的同时为一个存储库编程 ECC?

    这种情况是否非常奇怪? 正如我们以前写过的一些文章-我假设 DCSM OTP 组0通常使用 DataOnly 参数进行编程。 n´t、从我的引导加载程序的普遍性来看、在某些情况下、一些客户可能会使用 AutoECC 对一个组进行编程、而第二个组使用 DaraOnly 进行编程...我不知道...

    谢谢、此致、

    Tomas

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

    今天、我收到了一个 TMS320F2837xS 器件。 我使用 DataOnly 对 BANK1进行了编程、使用 ECC 对 BANK1进行了编程。 我在验证启用了 ECC 检查的 Bank0和禁用了 ECC 检查的 Bank1时没有问题。

    以下是需要注意的几点:
    1) 1)您不应允许用户在没有 ECC 的情况下加载其代码。 必须始终按照 TRM 中所述对 ECC 进行编程、因为默认情况下启用了 ECC 检查。 因此、请使用 AutoEccGeneration。

    2) DCSM OTP 区域:除了链路指针位置外、还必须针对 DCSM OTP 区域对 ECC 进行编程。 但是、正如闪存 API 文档中提到的、即使您使用 AutoEccGeneration 模式、闪存 API 也不会针对链路指针位置对 ECC 进行编程。 因此、您可以始终使用 AutoEccGeneration。

    3) DataOnly 用法:这不适用于代码加载程序(您的情况)。 当应用程序希望在运行时对闪存进行编程以存储一些数据时、使用此选项。 在这种情况下、用户还应对 ECC 进行编程。 但是、如果应用程序一次没有所有的64位数据可用、它可以在没有 ECC 的情况下对部分64位进行编程、并在以后与 ECC 一起对其余位进行编程。 因此、提供了该模式。 在引导加载程序代码中、情况并非如此、因此应始终使用 AutoEccGeneration。

    我认为以上内容简化了您的设计并解决了您的所有问题。

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

    感谢您的最后一个回复-它完全解释了我遇到的答案/问题、并显著简化了我的引导加载程序设计。 现在、我需要希望没有客户要求使用 DataOnly 参数对某些银行进行编程...

    现在可以关闭此案例!

    谢谢、此致、
    Tomas