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/TM4C123GH6PM:乒乓模式下的 SSI DMA 传输处理数组中的输出数据

Guru**** 2443910 points
Other Parts Discussed in Thread: TM4C123GH6PM

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/629555/ccs-tm4c123gh6pm-ssi-dma-transfer-in-ping-pong-mode-manipulating-output-data-in-array

器件型号:TM4C123GH6PM

工具/软件:Code Composer Studio

大家好、

在 DMA 乒乓模式下传输时、如何操作输出数据的数组。 我的n´t 是、当我更改传入数据时、我无法看到数组在输出数据中发生变化。

我´m 一个带有音频编解码器的 TM4C123GH6PM mikrocontroller。 Mikrocontroller 正在接收来自音频编解码器的数据(SSIRX)、然后必须使用算法处理数据。 之后、数据应传输到输出端(SSITX)。

我的代码正在工作、但我无法更改数据。 有人会给我一些建议吗?

感谢您的回答。

许多问候语

Sadullah

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

    算法处理数据需要多长时间? 我最初的想法是、该算法处理数据的速度可能不会超过 DMA Ping Pong 中断传入的速度。 您为此应用和算法进行了哪些类型的计时测试? 您能描述一下该算法吗、以便我们能够大致了解它的基本/复杂程度?

    您是否仅将 DMA 乒乓用于数据 RX、数据 TX 或两者?

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

    您好、Ralph、

    我没有n´t 过任何时序测试。 该算法是用于多路径衰减的通道仿真器。 因此、它有点复杂。

    I´m 使用 DMA 乒乓模式。

    // SSI 中断处理程序。 在 UDMA 传输完成时调用
    void hwi_SSI0_ISR (void)
    {
    uint32_t ui32Status;
    uint32_t ui32模式;
    
    ui32Status = SSIIntStatus (SSI0_BASE、TRUE);
    SSIIntClear (SSI0_BASE、ui32Status);
    
    //IntDisable (INT_SSI0);
    
    ui32Mode = uDMAChannelModeGet (UDMA_CHANGE_SSI0RX | UDMA_PRI_SELECT);
    if (ui32Mode = uDMA_MODE_STOP)
    {
    G_ui32SSIRxPingCount++;
    uDMAChannelTransferSet (UDMA_CHANGE_SSI0RX | UDMA_PRI_SELECT、UDMA_MODE_PINGONG、(void *)(SSI0_BASE + SSI_O_DR)、inbuffera1、sizeof (inbuffera1));
    }
    
    ui32Mode = uDMAChannelModeGet (UDMA_CHANGE_SSI0RX | UDMA_ALT_SELECT);
    if (ui32Mode = uDMA_MODE_STOP)
    {
    //wssus (inbuffera2、outbuffera2);
    G_ui32SSIRxPongCount++;
    uDMAChannelTransferSet (UDMA_CHANGE_SSI0RX | UDMA_ALT_SELECT、UDMA_MODE_PINGONG、(void *)(SSI0_BASE + SSI_O_DR)、inbuffera2、sizeof (inbuffera2));
    }
    
    ui32Mode = uDMAChannelModeGet (UDMA_CHANGE_SSI0TX | UDMA_PRI_SELECT);
    if (ui32Mode = UDMA_MODE_STOP)
    {
    g_ui32SSITxCount+;
    uDMAT_PbufferTransferSet (UALT_CHANGE_SSI0+
    
    
    
    
    
    
    )、USSO_TS_OUTAM_SIMP_FO+(USSIP_OUTAG_OUTAG_OUTAG_OUTAG_OUTAG_OUTAG_OUTMP_OUTMP_OUTMP_OUT+)(UTS_OUTDA_OUTMP_OUTAG_OUTAG_OUTMP_OUTAG_OUTAG_OUTMP_OUTAG_OUTDA_OUTMP_OUTMP_OUTMP_OUTMP_OUTMP_OUTK_MODE_OUTK_MODE_OUTDA_OUTDA_OUTDA_OUTDA_OUTDA_OUTDA_OUTDA_OUTDA_OUTK_
    
    
    

    许多问候语

    Sadullah

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

    由于听起来您可以在相同 SSI 通道的 Ping Pong 模式下成功地进行 RX 和 TX、因此当前的问题实际上只是如何操作 Rx'd 数据、然后正确地 TX 处理的数据、对吧?

    根据您描述的使用 Ping Pong 模式时的情况、我认为您首先需要收到一组数据来处理、然后您可以开始执行 RX、处理、TX 的例程。

    沿以下行的流程:

    一次性步骤:
    DMA RX 数据进入输入缓冲器#1

    一旦满、DMA 将 RX 数据切换到输入缓冲器#2

    MCU 使用算法处理输入缓冲器#1数据并创建输出缓冲器#1
    -这必须在 DMA 填充输入缓冲器#2之前完成

    重复:
    当 DMA 填充当前输入缓冲器时、则:
    -将 RX 数据切换到新的输入缓冲器
    -开始使用 TX 电流输出缓冲器
    -处理当前输入缓冲器数据以填充新的输出缓冲器

    Ping Pong 模式的理念是执行连续传输、但在同时使用 CONT 时能够处理任何数据。 进行 RX/TX 传输之后、您需要先处理一些数据并准备好发送出去、然后才能进行 TX、这需要时间。

    我想、对于上述方法、理论上、如果算法可以在每次 DMA 缓冲区从 RX 填充之前运行、那么就应该能够处理您收到的内容、然后使用乒乓模式功能持续流式传输 RX/TX 数据。

    这对您来说是否合理和可行?