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:使用 DMA 的 UART TX/RX

Guru**** 2526700 points
Other Parts Discussed in Thread: MSPM0G3507

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1559633/lp-mspm0g3507-uart-tx-rx-using-dma

器件型号:LP-MSPM0G3507
Thread 中讨论的其他器件:MSPM0G3507

工具/软件:

您好:

首先、我想声明我正在使用 DriverLib 尝试获得下面列出的功能。

我正在尝试编写一个驱动程序、该驱动程序将允许我的程序通过 UART 外设发送和接收数据。 当然、我需要发送和接收的数据量会有所不同。 考虑到我需要发送的数据量超过了 FIFO 的大小(4 字节)、因此轮询将不起作用、我必须使用 DMA。 要了解两个外设之间的交互如何工作、我参考了以下示例工程:

  • uart_rx_multibyte_fifo_DMA_interrupts_LP_MSPM0G3507_nortos_gcc
  • uart_tx_console_multibyte_repeed_fifo_dma

DMA 和 UART 的配置方式与示例工程中的配置方式不同。

让我们从 RX 开始

我的目标是创建一个读取函数、我的应用程序可以调用该函数来从 IC 读取数据。 示例工程展示了在仅执行 1 次读取时如何设置外设。 在测试代码时、这似乎可以正常工作。 但当我把它移动到一个函数中并在无限循环中调用它时,我开始得到奇怪的行为。 未正确接收数据。 例如、当我使用示例项目向程序发送以下字符 ('12345') 时、我会得到:

但是、当我将逻辑移动到函数中并发送相同的字符时、我会得到以下两个实例。  如您所见、该行为不符合预期。

  

下面是函数的嗅探。

我的问题是:

  • 为了能够通过 UART 读取数据而不出现任何问题、我需要执行哪些正确的事件序列?
  • 为什么我的数据没有按顺序显示?
  • 如果我期望在 DMA 中有 5 个字节、并且我的 Rx 触发条件设置为“RX FIFO 包含>= 1 个条目“、则 DMA 和 UART 之间的事件序列是什么。
    • 我知道 DMA 在收到完整的 5 个字节时将触发中断。

现在是 TX

示例工程是有意义的、因为它已经将 UART 写入功能移动到应用程序可以定期调用的函数中。 我想我可以顺利地把这个问题转嫁到我的计划中。 但我不确定的是、当我引入读取数据的功能时、此示例代码的行为方式。 我来解释一下。

在示例程序中、在配置 DMA((src、Dest、Size 等)之前启用 UART 中断、并在程序的整个生命周期内保持启用状态。 而在读取示例中、中断在配置 DMA 后启用。

TX 示例程序

Rx 示例程序

我不确定何时需要启用 UART 中断、如果在前后启用(取决于写入或读取)、我会遇到任何问题。  

我的问题是:

  • 当需要在同一应用中进行写入和读取时、正确的事件序列是什么?

我之所以将“写入“和“读取“逻辑混淆、可能是因为没有完全了解 DMA 在生成中断、使用触发器触发、以及此行为中的事件序列方面如何与 UART 进行交互。 我不想让这篇文章比它现在试图传达我目前对它的理解更长,但如果需要的话,我可以。 很抱歉、发布了一个长帖子。 我正在尝试充分了解 UART 外设如何与 DMA 配合使用、以防止稍后可能发生的任何问题。

提前感谢您所需的帮助、希望我能充分表达自己的想法、让您理解。  

谢谢、

Adan Pantoja.

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

    查看症状、我的第一个猜测是、由于以下几种组合导致您出现超限:(a) TX_console 发送的不仅仅是您的“12345"字符“字符串;(b) 当另一端 (TX_console) 发送某些内容时、UART_read 函数不会激活。

    在大多数应用中、数据 (Rx) 到达是不可预测的、因此通常会始终使接收器保持活动状态、并根据需要将数据调出到程序的其余部分。 TX_console 设计为定期发送突发(根据.syscfg,每秒发送一次)、但有时只会听;如果两端没有协调、RX FIFO 可能会在程序看起来不会溢出。

    您如何进行协调取决于您(最终)希望对此做些什么。 看起来您有正确的 UART+DMA 机制;现在您正在进行系统设计。

    【编辑:更正了拼写错误】

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

    尊敬的 Adan:

    对于带有 DMA 的 UART RX、应在接收到 RXDATA 之前启用 DMA、在完成 RX 任务后、应启用下一个 RX DMA 以等待数据。

    我建议您将 RX 的启用下一个 DMA 传输添加到具有 RX 的 DMA 完成中断中、以便它可以及时启用和等待下一个 RX 数据。

    应始终启用 DMA 在 RX 中断时完成和 UART 中断。

    B.R.

    Sal