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.

[参考译文] CCS/AM3359:EDMA3丢失事件处理

Guru**** 2924430 points

Other Parts Discussed in Thread: AM3359

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/661558/ccs-am3359-edma3-missed-event-handling

器件型号:AM3359

工具/软件:Code Composer Studio

各位专家、您好!

在具有定制固件的 Sitara AM3359定制板上、EDMA3中缺少事件处理功能时出现问题。
错过的事件发生在队列0通道28 (Tx)或29 (Rx)上、我将使用该通道并将 UART1配置为1兆波特(每个事件1字节)。
我之所以遇到这种情况、是因为我需要停止中断并清理缓存、以便在运行时重新对 MMU 进行编程。 这可能需要一段时间。
有时会调用我的 EDMA3CC 错误处理程序并清除 Secr、EMCR、EECR、ICR 和 CCERRCLR 中的所有相关标志。
我观察到最大值 队列大小 STRTPTR 为4。 该限制设置为15 (默认值)。 因此队列没有溢出。
发生这种情况时、我会启动一个权变措施来复位 UART1、并通过专用 DMA 通道重新启动传输。
现在是真正的问题:在极少数情况下、通信会停止。
是否有办法清理队列(EMEA3复位除外)或任何其他解决方案(寄存器写入)以确保重新启动传输?

此致、
Stephan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    工厂团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Stephan
    那么、我假设您的 MMU 重新编程和 UART 传输是异步的、并且您在进行 MMU 重新编程之前无法停止 UART 传输?
    当您停止中断时、为什么不禁用 UART DMA 通道?

    >>现在真正的问题:在极少数情况下,通信会停止。

    请进一步详细说明这一点? 您认为发生了什么错误? DMA 是否不为 UART 事件提供服务?
    我假设 EDMA 错误处理程序报告 EMR 位已置位? 如果是这样、则可能导致这种情况的应该是 RX 事件、如果您没有停止传输、或者您是否看到 TX 通道的 EMR 位也设置了?

    如果是这样、您是否确保 EMR 在 EDMA 错误处理程序中清除之后不会再次设置?您的错误处理程序是否使用了 EEVAL.EVAL 位?

    >>是否有办法清理队列(EMEA3重置除外)或任何其他解决方案(寄存器写入)以确保重新启动传输?
    就我所知、无法手动清除队列。 要重新启动传输,也许要确保除了重新发送 UART 外,还在错误处理程序之外清除 DMA 通道等。


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

    感谢您的支持。

    MMU 编程是异步完成的。 UART 通信。 在对 MMU 重新编程之前、任务会等待 UART 任务停止。 但 DMA 通道不会停止。 这可能是正确的方法、通过设置 EECR 位来停止通道。

    当发生错过的事件时、Tx 通道的 EMR 位置位的大部分时间、Rx 通道的 EMR 位也会置位。 但 Rx 通道不是问题、因为在 UART 重启后、Rx 会继续。 Tx 是问题所在。 另一侧是看门狗、它在接收超时30ms 后将 CPU 复位。

    是的、我的错误处理程序设置 EVAL 位。 第一次出现此问题时、即使在错误寄存器中的所有位都被清除后、我的错误处理程序也会循环。 现在、当所有位被清除并且错误中断保持有效时、我写入 EVAL 位。 然后中断失效。 根据 TRM 的解释、这种行为是相反的。

    在 MMU 重新编程之前、我将尝试禁用 DMA 通道。

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

    好的、如果它主要是 TX、也请查看 TRM EDMA 一章中附录 A 的调试检查清单-第二行。
    我认为您已经在处理清除 SER 位等问题、但如果您认为通信延迟是由于 TX 通道造成的、也可能需要仔细检查。


    --
    二次事件寄存器位是
    设置、不允许向传输额外数据
    发生的情况。
    当与关联的参数集时、可能会接收到触发事件
    通道/事件在通道上的上一个传输中设置为 NULL。 这是
    两种情况下的典型值:
    1) QDMA 通道:通常情况下、参数集是非静态的且应为
    由一个 NULL 集终止(即、opt.static = 0、link = 0xFFFF)、参数集为
    在提交最后一个 TR 后更新为 NULL 集。 因为 QDMA 通道是如此
    自动触发、此更新导致生成事件。 为生成的事件
    空置位会导致错误条件并导致相应的位被置位
    QEMR 和 QSER 中的 QDMA 通道。 这将禁用的进一步优先级
    通道。
    2) 2)连续模式下使用的 DMA 通道:外设可设置为
    持续生成无限事件(例如、在 McASP 情况下、每次都生成无限事件
    数据从 DXR 寄存器移出、它生成一个 XEVT)。 参数集可能
    可编程为仅预期有限数量的事件并由终止
    空链接。 在预期的事件数之后、将重新加载参数集
    空参数集。 因为外设将生成额外的事件、即错误
    在 SER.ex 和 EMR.ex 集中设置条件、从而防止进一步的事件优先级排序。
    您必须确保收到的事件数量限制为预期数量
    对参数集进行编程的事件、或者您必须确保这些位
    与特定通道或事件相对应的不会在次要事件中设置
    之前的寄存器(SER/SERH/QSER)和事件丢失寄存器(EMR/EMRH/QEMR)
    尝试对事件/通道执行后续传输。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Stephan
    我们的任何建议是否有效? 只需检查您是否能够解决您的问题。

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

    感谢您的提问。
    我在 MMU 编程之前实施了 DMA 队列禁用。 到目前为止、我没有时间测试此修改。 我认为我需要一个不同的测试条件、在这个条件下、我使用涉及的 UART 在一个环路中对 MMU 进行重新编程。 我将发布结果。

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