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.

[参考译文] LAUNCHXL2-TMS57012:CAN 库、接收 CAN 数据包、卡在 NWDATx 上

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1387540/launchxl2-tms57012-can-library-receiving-can-packet-stuck-on-nwdatx

器件型号:LAUNCHXL2-TMS57012
主题中讨论的其他器件:HALCOGEN

工具与软件:

我正在浏览 TMS57012的 CAN 库、它看起来好像我没在下面一行:

当我发送 CAN 数据包并在示波器以及我的 IXXAT 工具上进行检查时、没有错误、并且 TX 线路正在发送确认。 但在调试器中、代码似乎没有越过此行。  

TMS570和 IXXAT 都设置为500kbit/s、数据包的 ID 为1、DLC 为8、而我要发送的数据是0x11 22 33 44 55 66 77 88。 发送数据包时是否丢失了任何东西?

所有这些代码均来自此处的示例 Project Hercules Safety MCU 6.3 Bootloader:  6.1.项目0—Hercules 安全 MCU 文档。  

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

    为了澄清、NWDATx[regIndex](在本例中为 regIndex = 0、bitIndex = 1)保持为0。 即使在检查 TX 中的示波器信号时微控制器似乎正在确认接收到的消息、NWDATx[regIndex]也为0、因此保持在 while 循环中。

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

    尊敬的 Tomas:

    首先、确保您在 CAN 实例中使用的是扩展 ID 还是标准 ID。

    如果您使用的是扩展 ID、请确保在 USB 至 CAN 分析仪中也启用相同的设置。

    (+) TMS570LC4357:DCAN 接收无法正常工作-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    如果我们没有启用它、那么我们可能无法正确接收数据包。

    ——
    谢谢、此致、
    Jagadish。

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

    问题仍然存在。 然而、通过扩展 CAN 实例、CAN 总线确实能够在我从头开始开发的一个新项目上工作、这个项目只是通过 HalCoGen 启用了 CAN1。 我将新项目编码为尽可能接近、以便像6.3 Hercule Bootloader 示例项目那样、只需向 CAN 请求和接收数据。

    但是、对于6.3 Hercule 引导加载程序项目示例、它似乎仍然停留在该行上。 您能提供其他建议吗?

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

    我已经将范围缩小至看起来像 bl_dcan.c 中初始化的内容、针对具有函数 CANMessageSetRx 的示例项目。

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

    尊敬的 Tomas:

    您是否参考了以下 CAN 引导加载程序的应用手册:

    适用于 Hercules 微控制器的 CAN 总线引导加载程序(TI.com)

    其中给出了 CAN 引导加载程序的设置和支持的命令:

    请参考应用手册并根据手册提供中的命令。

    ——
    谢谢、此致、
    Jagadish。

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

    是的、我相信这就是我要查看的内容。 我从此处下载了代码:  6.1.项目0—Hercules 安全 MCU 文档

    现在我的问题是在初始化 CAN 总线时使用 ConfigureCANDevice ()函数。 其中调用了两个函数:canInit ()和 CANMessageSetRx ()。  当 使用 CANMessageSetRx()时、CAN 总线似乎不能正常工作、但如果我注释掉、CAN 总线似乎工作正常。

     CANMessageSetRx ()有什么作用?您能告诉我、在使用它在 TMS570上配置 CAN 总线时、为什么它会导致问题吗?

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

    尊敬的 Tomas:

    我想我了解了您所遇到问题的根本原因。

    实际上、 canInit 函数之后的 CAN Rx Msg 设置如下所示、对吧?

    但是、CANMessageSetRx 函数会将 Rx Msg 设置更改为与引导加载程序协议兼容。 我是说引导加载程序有单独的协议、对吧?

    因此、它将按如下所示更改 Rx 消息缓冲器设置:

    屏蔽寄存器值= 0x16800000

    这意味着 ID 位不会被用于接受过滤(意味着所有消息都可以被接收到这个缓冲器)。

    MXtd 和 Mdir 位也为零、这意味着接收报文中的这些字段也不用于接收滤波。

    2.仲裁寄存器值= 0x16800000

    这里我们将 ID 设为全零、但这并不重要、因为我们已经说过 ID 字段不会用于接受过滤、并且应该会接收所有消息。  

    DIR 位0表示接收模式、Xtd = 0表示标准模式。 但是同样、这些字段也无关紧要、因为我们将这些位的屏蔽位设置为0、这意味着接收消息中的这些字段也不用于接受过滤。

    3.消息控制寄存器= 0x00001080

    DLC 为零、这意味着接收消息中的有效数据字节为零。

    以上内容将成为新设置。

    您还应知道、引导加载程序代码的设计方式使其仅响应以下命令。

    如果您收到上述命令以外的任何其他命令、引导加载程序将再次返回到 PacketRead 函数、并且它将卡在 NWDATx 错误位置。

    我想这是您的情况下发生的确切行为、我想您只是假设 HALCoGen 中给出的设置是最终设置、并且您正在尝试与引导加载程序通信、因此这可能是它始终停留在您的情况下的 NWDATx 的原因。

    还请记住、字段中的命令不是数据字段、如果您验证引导加载程序代码、则命令字段只会是接收到的29位 ID 中的12位更高。

    这意味着它将提取接收到的消息中的位 ID[29:18]并用作命令。

    为了响应此引导加载程序、我们应首先发送 ping 命令

    这意味着从 PC 发送的数据包中的 ID[29:8]应具有0x5A1、并且 DATA 字段可以为零。

    要了解与此相关的更多详细信息、您应该参考我分享的引导加载程序代码和应用手册。

    要将应用手册发送到该引导加载程序、您应该使用 PC 端示例。

    这些内容将有助于轻松地从 USB 向 CAN 发送应用程序映像、有关更多详细信息、请参阅我分享的应用手册。

    ——
    谢谢、此致、
    Jagadish。

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

    谢谢。 引导加载程序代码采用不同的 CAN ID 来获取其命令、而数据是该命令的参数。 在这个示例项目中、我需要将 ID 设定为0x5Ay (其中、y 是一个十六进制数)来通过滤波器。 正如你所说的那样、很多 HalCoGen 寄存器被 CANMessageSetRx ()覆盖。