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.

[参考译文] AM2634:UART DMA 接收回调重新初始化。

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1479707/am2634-uart-dma-receive-callback-reinitialization

器件型号:AM2634

工具与软件:

尊敬的团队:

       我们 必须对应用使用 UART DMA 回调、现在我们只会在第一次获得 DMA 回调中断、 但下次无法接收中断、以此类推。

我们将使用 uart_echo_dma ()示例作为参考。

 

获取回调后、我们必须为下一消息或数据重新初始化 DMA 回调。 但重新初始化后、我 下次也无法获得 DMA 回调中断、请有人帮我解决此问题。

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DMA receive callback function.
void RxCallback(UART_Handle handle, UART_Transaction *trans)
{
/* Read 8 chars */
gNumBytesRead = 0U;
trans->buf = &gUartReceiveBuffer[0U];
trans->count = APP_UART_RECEIVE_BUFSIZE;
UART_Transaction_init(trans);
CacheP_wbInv((void *)&gUartReceiveBuffer[0U], APP_UART_RECEIVE_BUFSIZE, CacheP_TYPE_ALL);
transferOKrx = UART_read(gUartHandle[CONFIG_UART_CONSOLE], trans);
APP_UART_ASSERT_ON_FAILURE(transferOKrx, trans);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  

请告诉我、下一次或永远接收数据的最佳方式是什么。  

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

    您好、Sahil、对于响应延迟深表歉意。

    获取回调后、我们必须为下一条消息或数据重新初始化 DMA 回调。 但在重新初始化之后、我 下次也无法获得 DMA 回调中断、请任何人帮助我解决这个问题。[/QUOT]

    为什么需要再次重新初始化 DMA、以及重新初始化的具体含义是什么?

    此外、有关回调参考、请查看此处的 uart_callback 示例: examples\drivers\uart\uart_echo_callback\uart_echo_callback.c

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

    另请参阅有关支持的不同模式的 syscfg:

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

    你(们)好

    我们将 uart_echo_dma() 示例用作参考、但它仅起作用一次。 在读取数据一次后、不会读取下一个数据。 我们如何实施该函数、使其能够在 DMA 模式下针对 TX 和 RX 在无限循环中持续工作?

    此外、我们需要在 UART 上接收可变长度数据。 您能否指导我们如何实现此目标、或者共享任何源代码(如果可用)?

    是否可以通过团队联系来更好地解释我们对 DMA 模式的要求?

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

    大家好、Sahil:

    1.我在 CCS 中导入了 uart_echo_dma 应用程序。

    2.在 uart_echo_dma.c 文件中,我在 uart_Transaction_init ()之后添加了一个 while (1)循环;

    3.我重新编译了应用程序以确保 UART 模块在回显字符后准备好读取数据。 我未修改任何与回调相关的函数或 DMA 相关的配置。

    在运行上述应用程序时、我可以输入8个字符、然后在 CCS 终端上取回相同的字符。

    我还附上了 AM263x-CC 和 AM263x-LP 板的二进制文件。 您也可以尝试相同操作。

    e2e.ti.com/.../uart_5F00_echo_5F00_dma_5F00_am263xlp.release.oute2e.ti.com/.../uart_5F00_echo_5F00_dma_5F00_am263xcc.release.out

    此致、
    Shaunak

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

    我看到 Lotus Wireless 在这里提出了一个类似的问题: https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1481250/am2634-uart-receive-interrupt-in-dma-mode/5695646#5695646

    我认为上述步骤也应该解决这个问题。

    此致、
    Shaunak

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

    这是阻塞过程、会阻塞项目的其余部分、不能等待 UART 接收、我们还必须使用其他功能、这就要求使用非阻塞方法、

    请告诉我 、UART 低层次接收第一个字节时执行的第一个中断函数是什么。  

      

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

    尊敬的 Rohal:

    这是一个阻塞过程、它阻碍了我们项目的其余部分、我们不能等待 UART 接收、我们还必须提供其他功能、这就是需要非阻塞方法、

    抱歉、最初的问题或回复中没有提及非阻塞 API 的要求。 通过轮询(阻塞模式)和中断模式来支持 UART 读取。 中断模式还有2个选项:阻塞或回调。 对于非阻塞 UART 传输/接收、请使用回调中断 API。

    此文档包含非阻塞 UART 读写的代码片段: https://software-dl.ti.com/mcu-plus-sdk/esd/AM263X/latest/exports/docs/api_guide_am263x/DRIVERS_UART_LLD_PAGE.html

    [报价 userid="56490" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1479707/am2634-uart-dma-receive-callback-reinitialization/5701793 #5701793"]

    请告诉我 、UART 低层次接收第一个字节时执行的第一个中断函数是什么。  

    [报价]

    中断将根据设置的阈值触发。 例如、如果我将 Rx 阈值设置为4B、则中断将在 FIFO 设置为4B 后触发。 一旦传输完成、将调用已注册的 UART_CallbackFxn。 syscfg 中提到了这些功能。 如果您希望针对数据的每个字节触发中断、请将阈值设置为1B。

    此致、
    Shaunak