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.

[参考译文] TMS570LC4357:重置 DMA 目标地址时出现问题

Guru**** 2434370 points
Other Parts Discussed in Thread: TMS570LC4357, HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1309006/tms570lc4357-issue-resetting-dma-destination-address

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

您好!

我正在使用 DMA 在 TMS570LC4357上通过 SCI 读取/写入数据。 我正在使用定长消息、因此我想将这些消息与 DMA 接收块的开头对齐、以便更轻松地从缓冲区中复制数据。 当消息与接收块不同步时、我会尝试复位 DMA 控制数据包以使数据恢复同步。 这在大部分时间都可以正常工作、但有时复位函数不起作用。

根据 TRM 中第20.2.4节的注释、我应该能够通过写入其中一个值来重置控制数据包。 根据我的理解、这会将目标地址重置为 IDADDR 中的值、从而完成我尝试执行的操作。 但是、有时 DMA 会进入这样的状态:写入控制数据包不会重置目标地址、并且目标地址保持不同步。 它将在几秒到几分钟内保持此状态、但最终会正确复位并重新同步。

我曾尝试过:
1.简单覆盖控制数据包中的 IDADDR 值。
2.禁用 DMA 通道,向 IDADDR 写入其它值,恢复正确的 IDADDR 值,然后启用 DMA 通道。
3、禁用 DMA 通道、重写所有 DMA 控制包的值、然后使能 DMA 通道。
4.运行前轮询 DMASTAT #2。
5.将 DMA FIFO 置于旁路模式。
6.都作为运行中的唯一 DMA 通道运行此操作,并运行多个 DMA 通道。

我找到了这些类似的主题、但这些建议不起作用:
e2e.ti.com/.../resetting-of-dma
e2e.ti.com/.../expected-dma-behavior-after-resetting-dma
e2e.ti.com/.../tms570-reset-dma-with-dma-btc-interrupt

我尝试的每一项都显示了上述行为。 如果我注释掉对 IDADDR 的写入、但使其不同步、那么接收永远不会重新同步。 这使我认为重新同步大部分时间都在运行、而其他因素会阻止控制数据包复位。

谢谢。

大卫

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

    尊敬的 David:

    我们已开始处理您的问题、并将尽快为您提供更新。

    --
    谢谢。此致、
    Jagadish。

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

    尊敬的 David:

    您能提供一个简单的项目来解决您提到的同步失败问题吗? 此外、还请提供有关如何触发问题的详细信息?

    如果您对此提供帮助、我将在最后调试您的问题、并为您提供重新同步的建议。

    --
    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    很遗憾、我正在受导出限制条件限制下工作、因此我必须在 HALCoGen 项目中复制该文件、然后才能分享任何内容。 通过重新写入接收函数来将 DMA 接收块视为异步循环缓冲器、解决这个问题可能需要的时间更短。

    我有一个 TMS570流数据到另一个 TMS570、我可以通过将接收器 TMS570下电上电或在接收器上暂停并继续调试会话来引发问题。 如果接收器在传入消息的中间启动、那么当我写入其中一个寄存器时、DMA 控制数据包无法复位的可能性可能为十分之一。

    是否有任何条件可以阻止 DMA 控制数据包复位、或有任何其他方法来修改 DMA 通道的当前目标地址?

    谢谢。

    大卫

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

    尊敬的 David:

    很抱歉我的答复出现延误。

    是否有任何情况可以阻止 DMA 控制数据包重置,或是否有其他方法修改 DMA 通道的当前目标地址?

    我认为、除了 更改 DMA 中的控制数据包内容外、再也没有其他更好的方法来重置数据包。 这只能是更好的方法。

    --
    谢谢。此致、
    Jagadish。

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

    为遇到此问题的其他任何人更新帖子。 我无法解决 DMA 目标地址复位问题。 相反、我重新设计了接收器、将 DMA 接收块视为循环缓冲器、并使用 FAACDADDR、FBACDADDR 和 CDADDR 寄存器来确定接收到的字节数。

    基本过程为:

    1. 检查 FAACDADDR 是否在接收缓冲区中。 如果是、则 FAACDADDR 有最新的目标地址。

    2. 如果 FAACDADDR 不在缓冲区内、请检查 FBACDADDR 是否在接收缓冲区内。 如果是、则 FBACDADDR 具有最新的目标地址。

    3. 如果 FAACDADDR 和 FBACDADDR 均未在接收缓冲区内、则从 CDADDR 获取目标地址。

    以下是我用于使其正常工作的一些技巧:

    1. 通过在检查地址是否在缓冲区内之前将值存储在易失性变量中来执行这些寄存器的单次读取。 您不希望读取 FAACDADDR 两次并且两次读取之间存在 DMA 仲裁风险。

    2. 如果 SCI 端口自上电后未接收到任何数据、则 FAACDADDR、FBACDADDR 和 CDADDR 均不在接收缓冲区内。 在这种情况下、将目标地址视为缓冲区的头(接收到0个字节)。

    3. FAACDADDR 和 FBACDADDR 表现奇怪。 它们在换行到索引0之前似乎会使超出缓冲区的一个地址递增、因此有时您的读取会指向超出缓冲区的一个地址。 不确定 CDADDR 是否也这么做、但我没有看到发生过。 这种 情况非常少见、我仅在将数据从一个 TMS570流式传输到另一个 TMS570时观察到的情况、因此我认为这是时序边沿情况。

      1. 检查目标地址是否在缓冲区中、需要允许缓冲区之外的一个地址。

      2. 排列接收缓冲区、使它们在存储器中不相邻。 您可以在接收缓冲区之间添加一个填充字节、以确保目标地址寄存器中没有任何重叠。

      3. 当我遇到缓冲区外的地址1时、我会将地址递减到缓冲区中的最后一个位置。 我觉得这比把它包在缓冲器的头更安全。 也许这并不重要。

    这似乎是可靠的工作在这一点,但如果有任何人有其他建议,我想听到他们。