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.

[参考译文] MSPM0G3107-Q1:TI UART — 使用 DMA 进行错误处理

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1589034/mspm0g3107-q1-ti-uart---error-handling-with-dma

器件型号: MSPM0G3107-Q1

您好:

我想先介绍一下、我使用 FreeRTOS 来管理多个任务。 我有一个专用于与外部 IC 进行通信的任务。

我正在研究一个使用 UART 外设定期与外部 IC 通信的工程。 我已经创建了一个 UART 驱动程序、用于我的应用。 创建驱动程序时引用了 uart_rx_multibyte_fifo_dma_interrupt 示例工程。 当驱动程序工作时、我现在正在尝试确保可以捕获代码的任何问题、并采取适当的措施来处理该问题。  

例如、下面是我的写入函数的屏幕截图。

image.png

启动写入时、软件需要等待 DMA 将所有数据字节移动到 UART TX FIFO 中、然后等待 UART 外设完成在总线上输出数据。 这两个方面(理论上)可能会失败。 为了缓解这种情况、我在每个 while 循环中都添加了超时。 我已经测量了 DMA 和 TX UART 完成所需的时间。 需要~223us 来触发 DMA 完成和 UART 完成中断。 因此、我将超时设置为~3ms。  

我的问题是:如果 TX DMA 从未触发和/或 UART 以某种方式未完成数据传输、应该执行什么纠正措施。 现在、我只是禁用 TX DMA 通道。 这是否足够? 此外、是否有办法让软件触发这些错误、以便我可以全面测试该行为?

在同一个注意事项,现在在接收端,下面是一个屏幕截图的错误处理我正在做.  

image.png

对于此功能、如果 RX DMA 在~30ms I TIMEOUT 范围内没有接收传输大小。 我在这里要执行的纠正操作基本上是禁用 RX DMA 并清除 RX FIFO。 这似乎更直截了当、我认为、对于以下事件、这就足够了。

  • 未接收到任何数据字节
  • 接收到部分数据字节
  • 接收到字节溢出

对于这个、我只是询问这是否足够好。

谢谢、

Adan Pantoja.

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

    您好、Adan、

    您的检查涵盖了您可能遇到的大多数问题、但以下是一些注意事项:

    -如果 DMA 没有完成或 UART 没有完成,这意味着出现了问题,并表示这些外设中的任何一个处于不良状态。 一般来说、我认为禁用是不够的、最好是完全重新启动外设。 如果存在 DMA 超时、建议的操作是通过禁用通道来中止 DMA 传输、清除中断标志并在重新启用之前确保配置正确。 此外、如 TRM 的第 23.2.5 节所示、必须在重新启用之前禁用 UART TX、清除中断并清除 FIFO。这应该使两者都进入一个新的状态。  

    -对于 RX DMA 和 FIFO ,检查看起来就足够了,但同样建议清除中断、FIFO 和错误标志。 这可确保当这些外设重新启动时、它们处于干净状态。

    此致、

    Tyler

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

    Tyler、

    感谢您的回复以及从这些问题中恢复的建议步骤。 不幸的是、我一直很忙、没有时间仔细查看您的回答。 我计划开始新的一年。

    由于我对重新初始化 UART 的步骤很好奇、因此我将返回并报告当时的任何发现。

    谢谢、

    Adan