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.

[参考译文] TMS320F28388D:引导加载程序中的 MCAN 数据损坏

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1534783/tms320f28388d-mcan-data-corruption-in-bootloader

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

工具/软件:

您好:

我在开发从闪存引导的自定义引导加载程序时遇到问题。 添加代码来支持分支似乎会导致我的固件更新函数失败、我怀疑 MCAN 模块中存在故障。  该问题表现为 MCAN 发送和接收的数据损坏。  

引导加载程序配置为空闲、直到它通过 DCAN 从外部控制器(目前是 PC)接收到指令。 可能会被指示为 1) 通过 DCAN 接受新的固件更新、并通过 MCAN 传递新的固件更新到多个子模块(最多 10 个 f28003x)或 2) 以跳转到主应用程序。代码的固件更新部分是首先开发的、并已运行一段时间。

如上所述、当我为备选方案 2 引入代码时、就会出现问题。 我添加了一个握手环、以便在分支之前将 f28388D 和子模块置于分支就绪状态。 握手循环发生在主循环之后、其中包含对接收到的数据的检查、以确定 f28388D 是否应该输入其固件更新函数。 如果 f28388D 接收到分支命令、则程序会退出主循环并进入握手循环。 在我的程序中添加握手循环会导致固件更新失败。 也就是说、我可以省略握手循环并顺利执行固件更新、但如果我包含握手循环并且不对代码进行其他更改、则 MCAN 发送和接收的数据会损坏。 f28388D 中接收的 MCAN 数据与子模块发送的数据不匹配、子模块也看不到 MCAN 发送的某些消息。 这是通过在调试会话中运行两个程序并监控 Expressions 窗口中的数据确定的。

我想了解一下在添加与工作器件不相关的代码时、为什么我的固件更新代码或 MCAN 模块的行为会有所不同。  

可能与此相关的其他问题:我的程序通常会在看似随机的时间卡在 CAN_initRam 中。 在我开始尝试包括此握手循环来控制分支之前、不会出现这个问题。 我还看到、每当我敲击断点或出于调试目的暂停程序时、MCAN 就会停止发送和接收消息。 我通常每次遇到断点时都需要重新启动程序、我觉得这很不方便。  

谢谢、

Tom

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

    您好、Tom、

    YU 使用 F28388 DCAN 从主机 (PC) 接收新固件、并通过 MCAN 将固件传输到 F28003x 器件。  握手循环是由 DCAN 还是 MCAN 完成?

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

    握手循环通过 MCAN 完成。  

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

    CAN_initRam () 用于初始化 DCAN 消息 RAM、以便 F28388 和主机之间进行 DCAN 通信。 在 DCAN 通信完成后、握手使用 F28388 和 F28003x 器件之间的 MCAN 通信。 握手不应影响 DCAN RAM 初始化操作。

    MCAN 配置是否通过握手代码更改? 在固件期间是否发送/接收了任何握手 MCAN 消息(低优先级)?  更新? 我无法想象握手代码是如何导致固件的。

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

    我知道 DCAN 初始化不应该受到 MCAN 的影响、我只想报告我提出的另一个观察结果。 我曾认为 MCAN 中的某个器件可能会影响时钟、但根据 MCAN 时钟来自的 TRM 中的图 3.6、我不清楚。  

    MCAN 配置在握手环路中没有变化。 循环向所有子模块发送一条消息、延迟 5 毫秒、然后检查是否存在新数据。 它会检查传入消息 ID 以验证子模块是否正在响应、设置一个位以注意相关子模块已响应、并使子模块索引递增。 循环从发送消息开始重复、直到所有子模块在其数据中用 ACK 位回复。 我使用 XIDAM 寄存器来屏蔽传入缓冲区 ID、因此我要检查传入消息的 ID。  

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

    尊敬的 Thomas:

    您可以尝试从 CCS 转储 MCAN 寄存器的值和消息 RAM 中 MCAN ID 过滤器元素的内容、并比较这些文件以进行握手环路和不握手环路的操作。  

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

    我认为我发现了这个问题,但我认为它提出了其他问题。 用于设置消息 RAM 的宏使用函数 MCAN_getMsgObjSize、该函数从全局数组 objSize 返回一个值。 在我的引导加载程序中、我使用另一个示例中的 f2838x_codestartbranch_cpu1.asm 副本、该示例注释掉了_c_int00、因此不会初始化全局数组。 我在一个单独的文件中创建了我自己的 MCAN_getMsgObjSize 版本、该文件使用 objSize 的本地版本而不是全局数组、这似乎解决了我的问题。 消息 RAM 现在设置正确。 objSize 是否为全局变量有原因? 它似乎仅在 MCAN_getMsgObjSize 中使用。  

    我有一个新的问题是为什么我之前尝试过的另一个修复程序没有解决这个问题。 我创建了一个名为_c_int00 的本地版本、该版本刚从原始_c_int00 复制并粘贴、但我注释掉对_exit 的调用、并从 f2838x_codestartbranch_cpu1.asm 副本中介绍_ExitBoot 函数。 目标是允许我的引导加载程序项目使用已初始化的全局变量、并且在我尝试分支时不会被捕获到中止循环中、但这似乎没有达到我预期的效果。 我在装配体中没有任何背景、因此可能我在做一些错误的事情。  

    总之、如果为使用本地 objSize 数组而不是全局 objSize 数组的版本交换 MCAN_getMsgObjSize 函数、似乎可以解决我调用和不调用_c_int00 的问题。 这很令人困惑、因为我本希望原始 MCAN_getMsgObjSize 在包含_c_int00 与不包含_c_int00 的情况下表现不同。  

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

    否、如果未在其他文件中使用、则可以将其定义为局部变量。

    c_int00 是程序的入口点。 它设置初始栈指针、初始化全局变量。 应调用 c_int00。  

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

    我同意应该调用_c_int00、但在 TI 提供的几个示例工程中、将其进行注释。 在这些示例中、main 是从本地 codestartbranch.asm 文件调用的。 例如、c2000ware 版本 5.01 中 f28003x 的示例中的 flash_kernel_ex4_can_flash_kernel 在第 102 行的 flash_kernel_ex3_codestartbranch.asm 文件中进行了注释。 对我来说、这似乎是个问题、因为基于这些示例的任何代码要么需要 a) 避免使用任何全局变量、包括隐藏在 TI 的 driverlib 支持文件中的变量、要么 b) 具有某种用户创建的解决方案、用于初始化全局变量、设置栈指针、以及处理从 main 退出和分支到不同应用程序。 我认为 TI 应提供一个更可靠的示例、说明此流程的预期工作方式。 仅仅注释掉_c_int00 以避免在 main 终止后调用_exit () 是不够的。  

    我现在将其标记为已解决、因为我认为 MCAN 问题已解决、但我会要求 TI 的某人制作一个示例引导加载程序工程、允许初始化全局变量并分支到不同的应用程序。