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.

[参考译文] TMS320F28375D:SCI 闪存内核:验证未写入地址上的错误

Guru**** 2448780 points
Other Parts Discussed in Thread: CONTROLSUITE, UNIFLASH

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/781888/tms320f28375d-sci-flash-kernel-verify-error-on-unwritten-address

器件型号:TMS320F28375D
主题中讨论的其他器件:controlSUITEUNIFLASH

我使用 SCI 引导加载程序加载 controlSUITE (F2837xD_sci_flash_kernels_cpu01)中提供的 CPU1闪存内核、然后使用该内核加载生成的 TI 引导十六进制文件。

完成后、我将收到一个错误。 错误代码为0x3000 (验证错误)、地址为0x00080000。 这里的问题是、我正在刷写的图像没有向地址0x00080000写入任何内容。

在不提供任何专有信息的情况下、我从固件文件中获取了一些数据、其中列出了每个数据块及其位置:

地址:0x00088120大小:0x0054
地址:0x00096E40大小:0xAD7C
地址:0x000A2690大小:0x0805
地址:0x00088174大小:0x0004
地址:0x000885B0大小:0x0100
地址:0x0031CD80大小:0x1B80
地址:0x0031E900大小:0x0180
地址:0x000886B0大小:0x0068
地址:0x000A355C 大小:0x05CC
地址:0x00088180大小:0x0430
地址:0x000A2E98大小:0x06C4
地址:0x0008BB50大小:0xB2C0
地址:0x000A1BBC 大小:0x0AD4
地址:0x000A3B28大小:0x055C
地址:0x0008B000大小:0x0B50
地址:0x00088000大小:0x0120

从列表中可以清楚地看到、没有任何内容进入0x00080000地址、甚至没有触及该闪存扇区。 我已经查看了为闪存内核提供的源代码、但仍不清楚内核为什么认为应该写入相关地址。

这里发生了什么、我可以修复/避免/解决它吗?

谢谢!

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

    尊敬的 Mike:

    0x80000是闪存入口点。  选择闪存引导后、引导 ROM 在引导代码执行结束时跳转到该地址。  因此、在 TI 提供的基于闪存的链接器 cmd 文件中、您可能注意到 codestart 段被映射到此地址。 您能否检查链接器 cmd 和 hex 文件以查看 codestart 是否映射到该地址?

    我们可以根据您的回复进行进一步调试。

    谢谢、此致、
    Vamsi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是一个多件式应用程序、因此我有意不编写 codestart。 跳转地址的值将由一个不同的操作设定或者已经驻留在闪存中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Mike:

    明白了。 感谢您的澄清。
    让我在这里了解更多详细信息。 您是否在地址范围- 0x00080000至0x00080007中映射了任何内容?

    失败后、您在该地址范围中看到了什么? 无需透露任何专有内容。 只是想知道一切是否符合预期(尽管出现了验证失败错误)、或者您是否在其中看到任何意外数据?

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

    我没有任何映射到该空间的内容-我在编译后仔细检查了映射文件以确保正确无误。 在运行一个带有此文件的 SCI 更新之后、我通过 JTAG 回读闪存的开始、输出显示前8个字节(和整个闪存扇区 A)为0xFF。 我将使用 UniFlash 3.4和 Spectrum Digital XDS510进行回读。

    我已经检查了我知道应该有数据的位置、数据看起来是正确的。 但是、我没有进行全面检查以确保它的字节完美-只需抽查我所期望的段的开始和结束值即可。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Mike:

    感谢您确认编程的数据符合预期。 这就是我的想法。

    让我来看看为什么针对内核未编程的位置触发了验证。 我应该能够在一天或两天内回来。

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

    你好!

    我创建了一个基于引导十六进制文件的原始二进制文件、并使用它将我对器件的读取与我希望看到的内容进行比较、 我学到了一些有趣的东西-我看到一些看似随机的4字(8字节)块被写为全0而不是正确的数据。 这些位置似乎没有模式、我已确认它们不是引导十六进制文件的一部分。 它们都从4字对齐的地址开始。

    我愿意猜测这与我的另一个问题有关、因为这些模块肯定会导致验证问题。 但在完成时、它们中没有一个位于闪存内核给出的地址。

    您是否知道为什么我会看到写入0x0000 0x0000 0x0000 0x0000 0x0000 0x0000的集合而不是写入数据?

    谢谢!

    更新:我使用 SCI 多次执行更新、并且空白点始终出现在相同的地址。

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

    感谢您提供信息。
    您是否看到最多4个字或8个字(在8字对齐地址上)的零?

    在链接器 cmd 文件中、您是否使用 align (4)在64位边界上对齐段? 这有助于在64位边界上对齐段-以便新段始终从新的64位边界开始。 这样、当对十六进制文件进行流处理时、可以一次性对所有64位进行编程(出于 ECC 原因)、而无需插入任何零/ 1。

    谢谢、此致、
    Vamsi
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将其视为应该存在数据的段中间的4字对齐地址上的4字块。 我正在生成一个测试模式文件、该文件显示了相同的问题、因此我可以将其提供给您。

    我尝试编写的所有段都看起来都是以4字对齐方式与它们的起始地址为基准。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Mike:

    感谢您确认对齐。
    当您说"应该有数据"时、它是否来自相同的十六进制文件? 或者您是否在讨论来自其他十六进制文件的数据? 因为您说这是一个多件式应用。

    请在您有测试图案时分享测试图案。 这会有所帮助。

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

    此处缺失的数据都位于同一个文件中-设置了多文件排列、以便可以擦除/刷新两段代码而不影响另一段代码、因此它们保留在完全独立的闪存段中。

    例如、我用于执行闪存操作的 TI 引导十六进制文件具有以下数据串:

    bf 56 3C 01 4A 76 E3 0B 49 76 E3 88 4A 76 40 3E

    当我读回该地址时、我会看到该数据:

    00 00 00 00 00 00 00 00 00 49 76 E3 88 4A 76 40 3E

    关于测试模式、我创建了一个具有相同存储器映射的文件、但出于某种原因、我在闪存中看不到相同的错误! 我将继续尝试在允许我在此发布的文件中重现此问题。

    谢谢!

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

    我在奇怪的0上有一个小的突破-我删除了 TI 引导十六进制文件中尝试写入 EMIF (0x31****地址)的部分,我不再看到闪存中的无效字段。

    不过、我仍然看到验证错误、并且我仍在尝试生成显示相同错误的测试模式文件。 奇怪的是-文件中的数据似乎有所不同、因为在填充测试模式时、具有完全相同闪存段和长度的文件不会显示错误。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Mike、

    很高兴零点问题得到解决。  但是、我想知道为什么 EMIF 位置数据在闪存地址上进行编程。 我将就此做一个说明。

    关于初始验证错误: 我不理解您对测试图形数据不匹配所做的解释。  请清楚解释。

    谢谢、此致、
    Vamsi

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

    e2e.ti.com/.../test_2D00_rand.txt

    谢谢!

    我当前的问题是、当我尝试刷写代码文件时、我在地址0x00080000处看到 verify_error、但当我使用具有相同存储器映射(相同的起始地址、段、长度等)的测试模式文件时、似乎无法引发此错误。

    我附加了一个我正在使用的测试文件示例(使用随机值而不是实际数据生成)。 此测试文件具有我在上面共享的相同映射、但出于某种原因、它不会显示验证错误。

    我知道、如果您没有具体的重现方法、很难解决我的问题、因此我一直在努力复制它。 到目前为止,我还没有运气。

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

    我知道。 请在您收到测试文件时告知我们、我们可以使用该文件来复制该文件。

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

    您仍然会看到0x80000至0x80007处的数据全部为1、这符合预期。 对吧?

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

    正确-当我读回(使用 UniFlash)时、我看到这些字节全部为0xFF。

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

    我们在您之前附加的示例十六进制映像中未看到闪存入口点地址。
    标头有0x0作为入口点-您能不能尝试更改它并查看发生了什么情况?

    我认为您应该通过 CCS 加载闪存内核以进行进一步调试。 尝试一下。 执行此操作时、应在主机软件中注释掉内核负载。

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

    你好!

    入口点是我不确定的-遇到问题的映像没有入口地址、因此我希望避免设置可能覆盖闪存中的0x80000地址的入口地址、因为这会导致芯片无法引导至正确的固件。 我尝试将该字段设置为全0和全 FS、结果相同。 我还使用有效地址(即0x0080BAAB)运行了一些测试、并观察到了相同的问题。

    我花了一些时间尝试使用闪存内核进行调试、但尝试使自动波特步骤正常工作时失败-我将再次尝试并查看是否可以使其正常工作。

    我有权为一个小测试项目提供一个 TI 引导十六进制文件、该文件显示验证错误。 我已将其附在这里。 此应用程序不会单独运行、但可以刷写、并始终在地址0x80000处返回0x3000错误。

    谢谢!

    e2e.ti.com/.../demoApp.txt

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

    我让我们的串行闪存内核专家来看看这一点。
    请在一天或两天内回复。

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

    我相信每个 CCS 项目都有一个切入点。 内核使用十六进制文件中的入口点。 对闪存进行编程或验证后、内核将使用十六进制文件中的入口点、该入口点作为标头信息的一部分发送、以在完成后分支到该入口点位置。

    由于第一个标头信息未正确发送和接收、您可能会收到验证错误。

    请参阅 shared_Verife.c 文件。 请参阅以下内容:
    //
    //如果键值无效,则中止加载
    //并返回闪存入口点。
    //
    if (SCIA_GetWordData()!= 0x08AA)

    statusCode.status = verify_error;
    statusCode.address = flash_entry_point;


    由于您没有看到任何校验和错误返回到主机、因此十六进制文件的其余部分似乎已正确发送。

    因此、我认为最初的信息发送不正确、但其余的验证实际上正在进行。

    您可以对此进行测试。 将上面的代码更改为如下所示的代码:
    if (SCIA_GetWordData()!= 0x08AA)

    statusCode.status = verify_error;
    statusCode.address = 0xDEADBEEF;


    如果错误地址为0xDEADBEEF、那么您就知道这是您的错误。

    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢! 这给了我一个在正确的地方看的提示。

    问题是 Unix 与 Windows 线路端到! TI 串行闪存编程器假定有 Windows 线路端接(CR LF)并且将消耗3个字符(请参阅 loadProgram_CHECKSUM ()中的 getchar 调用)。 使用 Unix 行结束(LF)时、这将会得到密钥值的第一个 A (结果:0x080A)、从而导致出现验证错误。

    我使用 Python 在 Windows 计算机上生成测试文件、从而使该错误变得更加复杂、该测试文件自动默认为本机行结束、因此我的所有测试文件都能完美地工作!

    我将代码更改为如下所示:
    unsigned char c;
    while ('\n'!= c)

    C = getc (pfile);//跳过 STX 字符和 LF/CR、这些字符可能/可能不会在文件开头预设


    非常感谢您的所有帮助、我衷心感谢您为帮助我解决此问题而付出的努力。