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.

[参考译文] TMS320F28375S:复位后代码行为不正确

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1129074/tms320f28375s-code-behaves-incorrectly-after-reset

器件型号:TMS320F28375S
主题中讨论的其他器件: LAUNCHXL-F28379DC2000WARETMS320F28379D

您好!

我在 TMS320F28375S 的电路板上工作。 即使在复位之后(软启动和上电)、代码也按预期执行。

我切换到了另一个应该是上一个板副本的板、并且同一代码在复位后不能正确执行(对于软复位和上电复位)。 应用程序的一部分运行正常、我可以看到正在进行 CAN 通信以及其他一些计算。 部分代码从 CLA 运行。 它从 SPI 总线上的旋转变压器芯片中读取电机位置和速度。 这部分代码开始提供错误的速度值。 如果我在连接调试器的情况下运行(不进行下电上电)、它运行正常。 但是、一旦我执行软复位或下电上电、它会给出错误的速度值。

另一个观察结果是、重置后单击"运行"时、许多变量显示"NaN"。 其中一些在几分钟后会改回良好的值。 旋转变压器速度设置为"inf"并保持不变。 我还可以看到一些 RAMGS0存储器(从0xC000开始)初始化为0xFFFF。 此存储器映射了.ebss 段。 如果我在连接调试器的情况下进行编程和运行、则不会发生所有这种情况。

我在 LaunchXL-F28379D 上尝试了相同的代码、在该 LaunchPad 上可以正常工作。

我假设引导模式设置应该可以、因为我可以看到 CAN 通信正常。 我已检查 GPIO72是否为1、GPIO84是否为1、未对用于 bootctrl 的 OTP 进行编程。

您能建议进行任何检查、以便我可以通过硬件或软件来调试此问题吗?

谢谢你。

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

    您好!  

    由于 RAM 被引导 ROM 代码初始化为0xFFFF、因此看起来出现了问题。 我的代码有一些初始值为零的全局变量、也被初始化为0xFFFF、从那时起计算就出错了。

    我在函数中添加了这些变量的初始化、我的问题现在已经解决了、但我想知道为什么我在 LaunchXL-F28379D 和我之前使用同一微控制器的板中没有看到这个问题。 不同器件的引导 ROM 代码是否存在差异?

    谢谢你。

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

    不、引导 ROM 代码完全相同。 唯一的区别似乎是您使用的是单核器件、但 LaunchPad 使用的是双核器件。

    但是、请注意、并非所有复位都以相同的方式处理。 引导 ROM 的功能取决于复位类型(请参阅表4-7)。 www.ti.com/lit/SPRUHX5第570页中的引导 ROM 复位原因和操作)。 具体而言、RAM 初始化不针对特定类型的复位完成。 您可能还想了解的一点是、您是否已在 RAM 中初始化常量。 有关调试提示、请参阅 e2e.ti.com/.../757590。 诚然、它适用于不同的器件系列、但调试技巧也适用于您的器件。

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

    我还在两个不同的电路板上尝试过相同的代码、两个电路板都有 TMS320F28375S 微控制器。 从近2年以来、它一直在第一个微控制器上运行良好。 仅当我切换到第二块板时、问题才出现。 这就是我认为引导 ROM 代码可能不同的原因。 此外、我还尝试了使用调试器进行软复位和下电上电。 我看到了相同的结果。

    感谢您提供建议的链接和回复。

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

    引导 ROM 有两个版本。 请参阅 C:\ti\c2000Ware_4_01_00_00\libraries\boot_rom\f2837xs。 引导 ROM 版本信息在0x003FFF7A 中提供。 但是、如果您的芯片版本相同、那么您的引导 ROM 版本也相同。 我可以想到的另一个原因是、正如我在上一篇文章中提到的那样、RAM 中加载了一些初始化常量。 如果您确实找到了问题的根本原因、请告知我们。 我将关闭帖子。

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

    您好、Haresh、

    我发现初始化代码后问题仍然存在。 初始化解决了该变量的问题。  

    复位后 SPI 代码无法正常工作。 它从一个外部芯片(AD2S1210)中读取错误的值。 它不是在0x0 (0)和0xFFFF (-1)之间切换、而是在0x0 (0)和0x3FFF (16383)之间切换。  

    SPI read()函数从 CLA 任务运行。

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

    在 SPI 初始化开始之前、我观察到 SPI 配置寄存器中存在一些差异。

    如果连接了调试器、则在 SPI 初始化之前的值如下:

    如果我执行复位并在同一个点放置一个断点(恰好在 SPI 初始化之前)、我会看到 SPI 寄存器的值不同。 SPI 寄存器甚至在达到_c_int00符号之前获取这些值、那么它似乎是由芯片内的引导代码完成的?

    此外、使用 TMS320F28379D 的评估卡上不会出现此问题。 它仅发生在具有 TMS320F28375S 的电路板之一上。 在另一个具有 TMS320F28375S 的电路板上、工作正常。

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

    查看前一条消息中的第二个屏幕截图、它甚至设置 SPIPRI 寄存器中的保留位。 这里有一些东西不正确。

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

    Gobind、

                   如果不能访问原理图和硬件、应用代码事件序列有透彻的了解、则很难远程调试此类问题。 我可以提供一些调试想法、但可能无法提供更多帮助。  

    无论何时连接或不连接 JTAG 连接器时、只要行为有差异、它几乎总是指向加载到 RAM 中的已初始化常量。 您可以通过检查.map 文件来检查它们是否存在。 SPI 寄存器在达到_c_int00符号之前似乎具有值的原因可能是由引导 ROM 执行的 SPI 引导加载程序。

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

    我的 cmd 文件中包含以下文本。 我想这些将把所有已声明的常量放入闪存中。 我没有手动将任何常量(使用 pragma)放入任何段。 那么、闪存中的所有常量。

    /*初始化段进入闪存*/
    econst:>> FLASHF | FLASHG | FLASHH PAGE = 0,ALIGN (4)

    第二点是 SPI。 我正在查看 SPI-B 模块。 在参考手册中、提示引导 ROM 仅使用器件的第一个实例。 因此、如果 boot-ROM 执行 SPI 引导加载程序、它应该具有 SPI-A 模块。  

    感谢 Hareesh 的帮助、我知道在论坛中调试很困难。 我只是在尝试寻找一些调试的想法。

    谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="448206" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1129074/tms320f28375s-code-behaves-incorrectly-after-reset/4210148 #4210148"]SO、如果引导 ROM 执行 SPI 引导加载程序、则应使用 SPI-A 模块。  [/报价]

    是的、您回答正确。

    复位时、到所有外设的时钟进入禁用状态。 在系统初始化过程中代码打开时钟之前、所有外设寄存器应仅读取0x0000。 一个要检查的区域是引导模式选择引脚;当引导 ROM 对这些引脚进行快照时、引脚是否被正确驱动(在适当的电平上的稳定/干净输入- 0V 或3.3V、无任何噪声)。

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

    正如您在之前的答复中提到的、我检查了两个 F28375S 卡上的引导 ROM 版本、它们都在内存浏览器(16位十六进制 TI 样式)中读出"0101 0114"。 因此、这不是差异。

    我在复位后检查了两个引导引脚(GPIO84和 GPIO72)的 GPIO 数据寄存器、这两个引脚都保持高电平(无波动)。 我 没有测量万用表上的电压、但可以在需要时测量。  

    我还检查了无法正常工作的卡的引导 ROM 状态位置。 我在位置0x00002C 读取0xD。 这意味着引导 ROM 处理 HWBIST 复位。 TRM (spruhx5g)第4.10.10.1节中提到了这一点。 这是需要注意的吗? 我没有检查该卡是否正常工作。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="448206" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1129074/tms320f28375s-code-behaves-incorrectly-after-reset/4211432 #4211432"]我 没有测量万用表上的电压,但我可以在需要时测量。  [/报价]

    否、不适合使用万用表。 您需要使用示波器进行测量。 我们所做的就是确保引导模式选择引脚在所需的时间内保持其电平。

    将检查 HWBIST

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

    Gobind、

      对此进行了任何更新?  

    您是否了解过仿真启动? 引导 ROM 的行为因是否连接 JTAG 连接器而异(CCS 控制器件)。 如果是前者、引导模式不是由引导模式选择引脚选择的、而是由存储在 RAM 的0xD00和0xD01中的值选择。 对于后者、引导模式确实由引导模式引脚选择。

    此外、如何在0x00002C 中将值推测为0xD?