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.

[参考译文] TMS320F280039C:C2Prog:具有 OTP 的 TMS320F280039 需要单个十六进制文件 — 支持忽略 OTP 重新编程错误

Guru**** 2536600 points
Other Parts Discussed in Thread: SYSCONFIG, TMS320F280039, CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1546312/tms320f280039c-c2prog-need-single-hex-file-for-tms320f280039-with-otp-support-for-ignoring-otp-reprogram-error

器件型号:TMS320F280039C
Thread 中讨论的其他器件:TMS320F280039、SysConfig、 controlSUITE

工具/软件:

我正在使用 C2Prog 刷写 TMS320F280039 器件、需要帮助处理 OTP 存储器编程。

我知道 OTP 存储器(从地址 0x78000 开始)只能编程一次。 我想发布一个适用于以下两种用例的 hex 文件:

  • 生产刷写 — 在新器件上,应对 OTP 进行编程。
  • 字段更新 — 已对 OTP 进行编程的现场刷写、只应更新主闪存。

但是、我遇到了以下问题:

案例 1:启用“Allow OTP Programming“

  • 第一次刷新工作正常。
  • 在后续尝试时、它会停止、并显示以下错误:

0x78000 处的闪存程序错误:13/0

案例 2:禁用“Allow OTP Programming“

  • C2Prog 会立即出现错误、不会继续使用闪存的其余部分:已请求写入 OTP、但不允许/启用

 

我的期望:

选项 1:如果禁用了“Allow OTP Programming“、则 C2Prog 应跳过十六进制文件中的任何 OTP 相关数据(例如,目标地址为 0x78000 的内容)。
选项 2:如果尝试 OTP 编程但失败(由于 OTP 已进行编程)、C2Prog 应忽略该错误并继续刷写其他扇区。

我已在以下版本上测试了此行为:

  • C2Prog v2.1.5
  • 预发布版本 v2.2.0-9

问题:

  1. 是否有办法配置 C2Prog 来支持此行为?
  2. 如果不是、这是已知的限制还是预期的限制?
  3. C2Prog 的未来版本是否支持此功能?

我的目标是避免维护两个单独的十六进制文件—一个带有用于生产的 OTP、另一个没有用于现场更新的 OTP。

提前感谢您的支持!

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

    大家好、我在 CodeSkin 中循环、看看他们是否可以直接向 E2E 提供注释。

    此致、

    Matthew

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

    只要内容与 OTP 闪存中已有的数据相同、您应该能够多次对 OTP 段进行编程。

    错误 13(OTP 数据写入错误)表明您的新映像包含已设置位的 OTP 数据(由您或在 TI 工厂)。

    至于“允许 OTP 编程“功能、该选项已使用很长时间、我不想修改其行为。

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

    内容相同。 我们已通过 SysConfig 设置引导加载引脚和引导加载选项。 以下是生成的文件。

    它是通过 CCS 调试期间的工作文件。 有以下错误。 但它继续前进。

     

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

    请查看 C2Prog 手册中的 OTP 部分。 OTP 数据必须正确填充和对齐、以满足闪存编程要求、并且您的器件需要 128 位(8 字)块对齐。

    当固件包含不完整的 OTP 块时、C2Prog 将自动用 0xFFFF 值填充/填充丢失的数据。 如果填充的位置对应于目标器件上已清除的 OTP 位、则这种自动填充可能会导致编程失败。

    为防止编程错误、请确保固件映像仅包含完整的 128 位 OTP 块。 此外、目标器件上已清除的任何 OTP 位必须在固件映像中将其相应位设置为零。

    请记住、您的 MCU 附带工厂清除的 OTP 位、如技术参考手册 (TRM) 中所述。 在创建固件映像之前、请参阅 TRM 来确定哪些位已预清除、以避免潜在的编程冲突。

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

    我已经尝试添加了--allow-OTP 选项、如 C2Prog 手册中所述。 但是、问题仍然存在、并且出现错误。   

    我将分享以下详细信息以供您查看:

    • 下面附加了我的 dcsm.cmd 文件(由 SysConfig 自动生成)。 您能否确认此文件是否需要进行任何更改?

    /*如果用户希望在器件上使用 DCSM 功能、则将包含此链接器命令文件
    * DCSM 表示双区域代码安全模块。
    *此链接器命令文件作为现有闪存/RAM 链接器命令文件的附录
    *项目有。
    **_ZoneSelectBlock.asm 源文件中的段根据该文件中给出的命令进行链接
    *注意 — 请注意 fill=0xFFFF、如果用户误将此文件添加到工程中、这将有所帮助
    *不提供所需的正确*_ZoneSelectBlock.asm 源代码。
    *请参阅 controlSUITE 示例中的闪烁 DCSM 示例以了解如何正确使用此示例。
    *
    *一旦用户确信他们想要在 OTP 中编程密码,就可以删除 DSECT 段类型。
    *
    */

    移动数据

    页 0:/*程序内存*/

    /* Z1 OTP。 Z1 密码位置/闪存和 RAM 分区*/
    dcsm_OTP_Z1_LINKPOINTER:origin = 0x78000、length = 0x00006
    dcsm_OTP_Z1_JLM_enable:origin = 0x78006、length = 0x00002
    dcsm_OTP_Z1_GPREG:origin = 0x78008、length = 0x00008
    dcsm_OTP_Z1_PSWDLOCK:origin = 0x78010、length = 0x00002
    dcsm_OTP_Z1_CRCLOCK:origin = 0x78012、length = 0x00002
    dcsm_OTP_Z1_JTAG_PSWDH:origin = 0x78014、length = 0x00004
    dcsm_OTP_Z1_cmac_key:origin = 0x78018、length = 0x00008

    /* DCSM Z1 区域选择内容(!!可移动!!) */
    dcsm_ZSEL_Z1_P0:origin = 0x78020、长度= 0x000020

    /* Z2 OTP。 Z2 密码位置/闪存和 RAM 分区*/
    dcsm_OTP_Z2_LINKPOINTER:origin = 0x78200、length = 0x00006
    dcsm_OTP_Z2_RSVD:origin = 0x78206、length = 0x00002
    dcsm_OTP_Z2_GPREG:origin = 0x78208、length = 0x00008
    dcsm_OTP_Z2_PSWDLOCK:origin = 0x78210、length = 0x00002
    dcsm_OTP_Z2_CRCLOCK:origin = 0x78212、length = 0x00002
    dcsm_OTP_Z2_RSVD1:origin = 0x78214、length = 0x0000C

    /* DCSM Z2 区域选择内容(!!可移动!!) */
    dcsm_ZSEL_Z2_P0:origin = 0x78220、length = 0x000020

    }

    很重要

    dcsm_OTP_Z1_linkpointer:> dcsm_OTP_Z1_LINKPOINTER PAGE = 0、TYPE = DSECT
    dcsm_OTP_Z1_gpreg:> dcsm_OTP_Z1_GPREG page = 0
    dcsm_OTP_Z1_pswdlock:> dcsm_OTP_Z1_PSWDLOCK page = 0
    dcsm_OTP_Z1_crclock:> dcsm_OTP_Z1_CRCLOCK PAGE = 0
    dcsm_OTP_Z1_JLM_enable:> dcsm_OTP_Z1_JLM_enable、page = 0
    dcsm_OTP_Z1_JTAG_pswdh:> dcsm_OTP_Z1_JTAG_PSWDH、PAGE = 0、TYPE = DSECT
    dcsm_OTP_Z1_cmac_key:> dcsm_OTP_Z1_cmac_key、page = 0
    dcsm_zsel_z1:> dcsm_ZSEL_Z1_P0 PAGE = 0、TYPE = DSECT

    dcsm_OTP_Z2_linkpointer:> dcsm_OTP_Z2_LINKPOINTER PAGE = 0、TYPE = DSECT
    dcsm_OTP_Z2_gpreg:> dcsm_OTP_Z2_GPREG page = 0、type = DSECT
    dcsm_OTP_Z2_pswdlock:> dcsm_OTP_Z2_PSWDLOCK PAGE = 0、TYPE = DSECT
    dcsm_OTP_Z2_crclock:> dcsm_OTP_Z2_CRCLOCK PAGE = 0、TYPE = DSECT
    dcsm_rvd_z2:> dcsm_OTP_Z2_RSVD、page = 0、type = DSECT
    dcsm_rsvd1_z2:> dcsm_OTP_Z2_RSVD1、page = 0、type = DSECT
    dcsm_zsel_z2:> dcsm_ZSEL_Z2_P0 PAGE = 0、TYPE = DSECT
    }

    /*
    //==============================================================================
    //文件结尾。
    //==============================================================================
    */

    • 对我之前的帖子中的混淆表示歉意。之前、我提到过启用“允许 OTP 编程“后、刷写会第一次运行、但在后续尝试时失败。

      在另一个器件上进行 RE‑测试后、我发现了这一点 C2Prog 即使对于新器件也无法正常工作 (之前没有任何刷写)并且收到相同的错误、通过 CCS 刷写时工作正常。

      这意味着问题不仅仅是重复刷写导致的、而是在第一次尝试使用 C2Prog 时发生的。

      我还尝试使用.out 文件、但结果是相同的。
    • 同样的 OUT 文件正在通过 CCS 刷写  

    以下是 OTP 区域的十六进制文件内容。

    :020000040007F3.
    :04800600000FFFFF69
    :1080018205AFFFFFF5AFF2103030301FFFF5C
    :04801000FFFFFB7FF4.
    :04801200FFFF7FFFEE
    :10801800000000000000000000000000000000000000000058

    您能否建议任何其他步骤或替代解决方案、以便在处理 OTP 部分时成功刷写固件?

    感谢您的支持。

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

    您好 Bhagyashri、

    C2Prog 将返回一个错误、即使在新器件上也是如此、原因是我已经向您解释过、再次复制此处以供参考、

    “ OTP 数据必须正确填充和对齐、以满足闪存编程要求、并且您的器件需要 128 位(8 字)块对齐。

    当固件包含不完整的 OTP 块时、C2Prog 将自动用 0xFFFF 值填充/填充丢失的数据。 如果填充的位置对应于目标器件上已清除的 OTP 位、则这种自动填充可能会导致编程失败。

    为防止编程错误、请确保固件映像仅包含完整的 128 位 OTP 块。 此外、目标器件上已清除的任何 OTP 位必须在固件映像中将其相应位设置为零。“

    下面是一个示例、用于进一步说明。 如果要对链接指针进行编程、根据 TRM、这些链接指针位于与 JLM Enable 相同的 128 位块中。  根据闪存编程要求、需要将整个块编程在一起、包括 JLM Enable、

    如果固件映像未在  JLM Enable (0x78006) 处指定值、则 C2Prog 将用 0xFFFFFFFF 填充此间隙。 现在问题是该位置已经具有出厂清除位、如下表所示。


    正如我解释过的、正如 C2Prog 手册所述、C2Prog 在 OTP 刷写方面非常严格、并会标记被请求为“1"但“但已经清除为“0"的“的位。

    在您的情况下、解决方案很可能只是为 JLM_ENABLE 指定 0xFFFF000F、但 了解 C2Prog 的工作原理及其相对于 OTP 的基本行为很重要。

    因此、请仔细阅读我的答复、 如果仍有任何疑问、请提出具体问题。

    此致、

    节拍

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

    感谢您的详细说明—这确实有助于提高我对内存处理的理解。

     

    根据您的建议、我通过 SysConfig 添加了其他具有默认值的 OTP 部分。 完成更改后、地址 0x78000 处的错误得到解决。 但是、我在位置 0x78010 处仍然收到错误、即使内容与 TRM 中指定的内容相匹配。

    为了进一步疑难解答、我删除了由 SysConfig 生成的 DCSM 段、而是手动包含 DCSM 支持文件。 此外、我在链接器命令文件中将 pswdlock 和 crclock 段标记为 TYPE = DSECT、以防止对它们进行编程。

    完成这些修改后、我能够通过引导加载程序和 JTAG 成功刷写代码。 这解决了我目前的问题。

    也就是说、为了提高灵活性和可见性、 我仍然更喜欢是否可以直接使用 SysConfig 生成的文件进行刷写、而无需进行这些手动调整。