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.

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

Guru**** 2445440 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/627390/rm48l952-strange-issue-related-to-can-dma-system

器件型号:RM48L952

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

我将 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 的寄存器状态。  

e2e.ti.com/.../5050.dma_5F00_before_5F00_crash.txt

e2e.ti.com/.../7317.dma_5F00_after_5F00_crash.txt

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

e2e.ti.com/.../3302.nhet_5F00_htu_5F00_after_5F00_crash.txt

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

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

    大家好、Westin、

    我不确定以下问题是否与您有直接关系-不管怎样、DMA 链也出现了一些问题- https://e2e.ti.com/support/microcontrollers/hercules/f/312/p/626697/2311307

    谢谢、Jiri

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

    Jiri、

    感谢您提供相关信息。 我不认为它直接相关、因为如果我禁用通道链接、我仍然具有相同的结果。

    谢谢、

    威斯汀

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

    我注意到、在您的代码片段中、您使用的是 HET 传输单元、而不是 DMA。 我不相信 CAN IP 会自动触发 HTU 交易。 此外、HTU 可访问的存储器区域可能会受到限制。 您是否打算使用 HTU 而不是实际的 DMA 模块?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    卡盘、

    如果我不清楚我是如何使用该系统的、我对此表示歉意。 我正在使用 NHET/HTU 模块来访问与外部 RTC 同步的当前时间。 我将 DMA 用于 CAN。

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

    您是否仍然看到这方面的问题? 请告诉我是否需要再看一下。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    卡盘、

    我没有找到解决这个问题的方法。 我将在本周再次对此进行研究。 当我有更多可能有用的信息时、我会告诉您。

    谢谢、

    威斯汀