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.

[参考译文] RM48L950:RM48L952:与 CAN/DMA 系统相关的奇怪问题继续存在

Guru**** 2465890 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/658307/rm48l950-rm48l952-strange-issue-related-to-can-dma-system-continued

器件型号:RM48L950
主题中讨论的其他器件:HALCOGEN

这是一个未获得解决方案、然后被锁定的帖子的副本: e2e.ti.com/.../2331703

我遇到了一个非常奇怪的问题、我已经在调试了一个多星期了、所以我想我会看看这里是否有人有任何想法。 我将解释我的系统的相关部分、然后解释我看到的内容。

我将 DMA 与 CAN 一起用于接收 CAN 消息。 在此设置中、除了最后一个硬件邮箱外、所有硬件邮箱都专用于单个 CAN 消息。 最后一个设置为触发 DMA、以将接收到的消息传输到定期处理的缓冲器中。 此 DMA 通道在其链寄存器中有另一个 DMA 通道。 该次通道写入并指示 CAN 消息缓冲器中的哪个索引最后写入。

我们有一个外部实时时钟、该时钟将32kHz 节拍馈送到 NHET 模块中。 我们使用 HTU 来检索时间电流时间。

这个系统已经过测试并运行了很长时间、但是我们有一条代码、当任何消息进入最后一个 CAN 邮箱并应该使用 DMA 进行传输时、该代码会出现问题。 当它接收到其中一条消息时、消息不会传输、时间永远不会被检索、并且在刷新时、调试器中的内存浏览器会针对所有值显示 BAD0BAD0、直到代码执行暂停。

这是我们用来获取时间的代码。 接收到 CAN 消息且 DMA 开始处理后、它会卡在 while 循环中。

htuREG2->GC = htuREG2->GC & 0xFFeffff;//禁用传输单元
while ((htuREG2->BUSY0)& 0x01000000);
SubSecTimestamp t = RTCBuffer;
htuREG2->GC = htuREG2->GC | 0x00010000;//重新启用传输单元 

除此之外、CAN 消息永远不会出现在目的缓冲区中。 从我从 DMA 寄存器中可以看出、它认为 CAN 消息已传输到缓冲区、并且正在链通道上等待完成。 没有其他 DMA 通道处于活动状态、它只应复制一个字节、因此不应花费任何时间。

启用或禁用中断时会发生这种行为、因此我认为接收到 CAN 消息时不会产生某些中断。

对我来说、这一点非常奇怪、DMA 和 HTU 似乎都受到影响、尽管我不知道它们以什么方式进行链接。

以下是发送 CAN 消息前后 DMA 的寄存器状态。  

dma_before_crash.txt

dma_after_crash.txt

当我在上面提到的 while 环路中等待时、NHET 和 HTU 寄存器在崩溃前后看起来都一样。

nhet_htu_after_crash.txt

提前感谢。 请告诉我是否有任何其他信息有用。

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

    自从发布这篇文章以来、我确实找到了一些新信息。 为了调试代码、我开始删除每一个非关键部分、以使 CAN 代码正常工作。 在显著地将其删除后、我注释出了一行无法访问的代码、问题已自行解决。 注释的此行是编译单元中要编译的最后一行、因此我假设编译单元已被删除、导致闪存中的内容移动、并以某种方式影响该问题。

    后来、我发现了一种变通办法、我们在不知道问题的根本原因的情况下不能使用它。  我发现、将 DMA 更改为使用32位读取和写入而不是64位似乎可以解决问题。 我更喜欢使用64位模式来实现性能、但我认为32位模式不会中断任何功能。

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

    我对这一问题在过去被忽视表示歉意。 我也会邀请一位同事参与这项工作、他可能还会提供一些见解或建议。

    我还将与他更详细地讨论这个问题、以便我们能够合作、看看我们是否能够弄清发生了什么。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、谢谢。 我在获得这些信息时、似乎不评论更多信息是我的部分过错。

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

    我想 Ping 这个线程、让您知道我没有忘记它。 我一直在审查这件事、并尝试思考可能导致这件事的原因、因为这似乎是不相关的、所以原因和影响对我来说似乎是不寻常的。

    唯一需要注意的是、它与 DMA 未对齐到64位边界的访问相关。 这将解释为什么消息数量的变化或从64位传输到32位传输似乎可以解决这个问题。 但是、您能够删除一些不可访问的代码并更改行为这一事实更不寻常、因为程序空间完全不涉及 DMA 访问或 CAN 消息。

    请告诉我您的最终是否有任何新发现或见解、我将继续研究这一点、并在我的最终与我的同事讨论可能性
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我能问您为什么使用 DMA 而不使用 HalCoGen CAN 邮箱吗?

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

    卡盘、

    当 DMA 处于64位写入模式时、它写入的地址是否必须是64位对齐? 我需要看看它是否可能未对齐。 我认为这可以解释为什么删除注释掉无法访问的代码来修复它。 如果编译器未优化不可访问的代码、但它是编译单元中最后使用的代码、则可能已删除编译单元。 如果编译单元具有全局变量、它可能已经移动了我的缓冲区、DMA 会写入该缓冲区。 如果它碰巧将它推到64位边界上、而这正是问题所在、它本来可以解决这个问题。

    当我有机会时、我会更深入地研究它。

    谢谢、

    威斯汀

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们不希望受 MCU 拥有的硬件邮箱数量的限制。 为了解决这个问题、我们使用硬件邮箱、假设有足够的邮箱、然后在需要更多时开始使用 DMA。 据我所知、HalCoGen CAN 邮箱无法为我们提供此功能。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可能只能设置两个邮箱(一个用于 TX、一个用于 RX)。 它不仅需要使用 HalCoGen 进行编码、而且可以进行编码。 我在 RM46 HDK 上以这种方式工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果我们的系统仍然存在问题、我可能会对此进行研究。 目前、当使用32位 DMA 时、一切看起来都很好、并且充分利用了使用所有硬件邮箱所带来的性能提升。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    经过一些测试、问题看起来像是 DMA 缓冲区的对齐问题。 显然、在我的测试过程中、它总是位于64位对齐状态。 我发现 CAN 问题的代码在32位对齐的地址上有缓冲区。 我可以使用 alignmentpragma 来修复它。 感谢你的帮助。