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.

[参考译文] LP-MSPM0G3507:每次触发时清除 FIFO、防止超时中断

Guru**** 2609895 points
Other Parts Discussed in Thread: LP-MSPM0G3507, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1574370/lp-mspm0g3507-fifo-cleared-on-each-trigger-prevents-timeout-interrupt

器件型号:LP-MSPM0G3507
主题: SysConfig 中讨论的其他器件

工具/软件:

我正在使用 LP-MSPM0G3507、并尝试将 UART 与 DMA 配合使用来接收可变长度的数据。 我当前的方法会针对每个 UART RX 事件触发 DMA。 但是、每次触发 DMA 时、UART RX FIFO 都会被清除、因此我无法针对不完整的帧或可变长度接收产生接收超时中断。

我在 这篇文章中引用了 Zoey Wei 的建议

您可以将 DMA 触发条件设置为 FIFO>=2、这将始终在 FIFO 中保留一个数据、并触发超时、然后您手动读取最后一个数据。

然而、我测试了这种方法、它没有按预期工作;仍然没有可靠地触发超时中断。 当对可变长度 UART RX 使用 DMA 时、是否有任何进一步的方法或权变措施来确保可以正确生成超时中断? 或者、是否有一个示例演示了如何在此用例中同时使用 DMA 和超时中断?

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

    您好、

    我很抱歉迟来的答复。

    您是否能够控制传输的内容? 在这种情况下、您应该能够开发一种协议、其中第一个数据 块指示后面消息块的大小并相应地更改配置。  

    如果您无法创建协议、则应该能够 在 RX FIFO 达到指定阈值水平后触发 DMA。 然后、当 FIFO 中的剩余数据未达到阈值时、可以触发超时中断。 这种方法未经测试、但获得结果后、我将与大家分享。

    此致、
    Brian

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

    您好、Brian、

    感谢您的答复和建议。

    我们现在面临的主要问题是、一旦启用 DMA、就无法产生超时中断。 当 RX FIFO 触发 DMA 时、FIFO 中的所有数据都会立即传输到 RAM - FIFO 中不会有任何数据来产生超时中断。

    例如、如果我们将 RX FIFO 阈值设置为 2、则理论上当发送 2 个字节时、一个字节应由 DMA 传输、另一个字节应保留在 FIFO 中、从而导致超时中断。 但是、在我们的测试中、这两个字节都通过 DMA 从 FIFO 中传输出去、因此不会发生超时中断。

    似乎每当 FIFO 达到阈值时、DMA 都会清空所有可用数据。 在这种情况下、当阈值为 2 时、任何偶数长度的数据序列都不会触发超时中断。 这种行为与我之前分享的参考链接中描述的解决方案不匹配、在这种情况下、每个 DMA 触发器只应传输一个字节。

    此致、
    PandaFeng

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

    尊敬的 PandaFeng:

    触发 DMA 时、清除 RX FIFO 是预期的行为。 我目前正在实施一种解决方案、该解决方案将在不满足 RX FIFO 阈值之前持续触发 DMA。 当数据保留在 RX FIFO 中时、应该发生超时中断、表明传输已完成。

    此致、
    Brian

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

    您好、Brian、

    是的、这正是问题所在。如您所述、当 RX FIFO 达到触发阈值时、DMA 传输所有可用数据并将 FIFO 清零。
    因此、FIFO 中没有剩余数据来触发 UART 超时中断。

    这种行为使得在使用 DMA 时无法将超时中断用作帧完成的指示器、尤其是对于可变长度接收。

    在这种情况下、是否有任何推荐的方法来检测接收结束、例如、一种将 DMA 与超时或空闲线路检测机制相结合的方法、或者任何可能指示没有更多数据传入的硬件标志/事件?

    此致、
    PandaFeng

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

    尊敬的 PandaFeng:

    抱歉、当数据是 DMA 阈值触发器的倍数时、我忽略了这种情况。  

    您可以 通过发布 DMA 完成事件来触发订阅通用计时器、从而对 DMA 应用超时。 在 SysConfig 中、您可以设置发布者/订阅者通道和计时器触发操作。 超时时时以及超时前触发 DMA 时、需要将计时器复位。

    这有什么用吗?

    此致、
    Brian

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

    您好、Brian、

    感谢您的阐释以及对 DMA 完成→计时器超时方法的建议。

    我理解您的想法、但在本例中、每个 UART 通道都需要额外的计时器资源。 如果我有多个 UART 使用 DMA 运行、这种方法难道不会变得相当占用资源吗?

    我想知道是否有更有效的方法来实现超时机制、而不为每个 UART 实例分配专用计时器。

    此致、
    PandaFeng

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

    尊敬的 PandaFeng:

    更好的解决方案是每次传输都从帧的大小开始、但如果这不是一个选项、我看不到除了为每个 DMA 通道添加计时器之外的另一种方法。

    此致、
    Brian