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.

[参考译文] TMS320F280023C:添加一行代码时、SPI 写入失败

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1216890/tms320f280023c-spi-write-fails-when-i-add-a-line-of-code

器件型号:TMS320F280023C
主题中讨论的其他器件:C2000WARE

您好!

我面临一个问题、即在添加一行代码时 SPI 写入失败。

硬件设置是一个连接到 DRV8304S 并控制 BLDC 电机的 F280023微控制器。 IC 中的寄存器通过 SPI 进行配置。

不幸的是、我无法分享完整代码、但我可以对其进行描述、并且可能可以分享一些代码段。 int main()代码结构如下:

  • 首先是一些初始化函数。 使用的外设为:Timer0、Timer1、ADC-A、ADC-C、SPI、 SCI 和 ePWM1/2/3。
  • 然后还有一个主循环、此循环在本质上以几个不同的"模式"(速度控制、转矩控制、PWM 控制等)运行电机。 它本质上是主循环中控制执行流程的一个大开关情况。
  • 定期运行的中断包括:
    • 用于与另一个板通信的 SCI 中断。
    • 用于根据电机发出的霍尔值进行换向的 GPIO 中断。
    • ADC 中断由 ePWM 模块触发(PWM 高电平的中点)、用于检测相电流。

当我在 main 中添加一行代码时、SPI 通信会失败。 以下是一些观察结果:

  1. 启动时、代码行不在代码的执行路径中。 这是一段代码、只有在我更改开箱变量以在调试窗口中输入不同的执行路径时才能访问。 不过、在设置阶段-在进入开关用例之前-发生的 SPI 通信似乎仍然失败。
  2. 在示波器上、MOSI 行看似随机电平变化。 照片附在下面。 此波形不停地重复。
  3. 什么是代码行似乎无关紧要。 任何添加的额外代码都可能导致此问题。 具体来说,我试图写入阵列的每个循环,以监测特定变量的值,但即使当我交换了一个正常的附加语句与虚变量,甚至重复,相同的故障情况出现。
  4. 我认为这可能与堆栈/堆大小有关、因此我增加了为 CCS 链接器选项中的这些功能分配的内存。 没有解决这个问题。

我理解这可能是对问题的模糊描述、即使我正在尝试寻找其他有用的线索。 如果我可以获得一些关于我可以查看以便对其进行调试的其他事项的指导、我将不胜感激。

此致、

Vishnu

编辑:代码中的某些改变偶尔会产生一个不同类型的错误-代码在引导 ROM 的以下区域冻结、这显然是在有一个非法指令尝试执行时发生的。 目前仍不清楚具体导致出现这种情况的原因、因为即使出现错误、代码编译也没有问题。

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

    作者:Vishnu、

    当您遇到非法指令错误(ITRAP)错误时、需要找到导致该错误的指令。 根据我的经验、一般是由于堆栈溢出(或)导致的内存损坏、因此其他代码无意中更改了内存的一部分。 我建议您加载 F28002x bootrom 的引导 ROM 符号。

    1) 1)加载引导 ROM 符号

    路径:C:\ti\c2000\C2000Ware_4_03_00_00\libraries\boot_rom\f28002x\rev0\rom_sources\CCS_files\CPU\Release

    文件: F28002x_ROM.out (BootROM COFF 文件)

    2)然后您需要找到文件并选择

    路径:C:\ti\c2000\C2000Ware_4_03_00_00\libraries\boot_rom\f28002x\rev0\rom_sources\F28002x_rom\bootROM\source

    3)上述两步加载引导 ROM 符号和相关的 bootrom 文件。 然后在"Expressions"窗口中 您可以检查变量 CPU1BROM_itrapAddress 获取触发非法指令陷阱条件的地址位置。

    此致、

    Manoj

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

    尊敬的 Manoj:

    感谢您的建议。 但是、 我未能在我的系统中始终如一地重现 ITRAP 问题。 它只发生一次,当我对用于调试的代码进行随机更改时,我提到它是因为我认为它可能是相关的。

    对于给定版本的代码、唯一一致发生的情况是 SPI 故障。 当然、未发现 SPI 问题的代码版本以后也不会出现问题。 但奇怪的一点是、导致这些 SPI 写入失败的更改非常随机-替换一行、注释一个不重要的部分... 从我到目前为止看到的情况来看、这些代码更改 与 SPI 无关、而这个 SPI 故障是我发现唯一似乎一直失败的问题。

    如果 是堆栈溢出问题、不应该增加堆栈大小来解决它? 我曾尝试这么做(Properties -> C2000 Linker -> Basic Options、并将堆栈大小从0x200更改为0x300)、但问题仍然存在。

    此致、

    Vishnu

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

    作者:Vishnu、

    我不认为我们有所有的难题来理解正在发生什么。 您需要进一步调试和缩小问题范围、以便我了解此问题。 了解代码流程的变化情况、并查看您的器件在哪些条件下停止工作。

    此致、

    Manoj