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.

[参考译文] TMS570LS3134:全双工模式下的 DMA SCI RX TX

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1427649/tms570ls3134-dma-sci-rx-tx-in-full-duplex

器件型号:TMS570LS3134

工具与软件:

您好!

我正在从事一个项目、我将使用 SCI 从另一个 MCU 接收不同的消息。 消息长度不同、我无法知道是否会提前发送消息。  我决定使用 DMA 来实现 SCI RX、我按如下方式配置了我的通道:

g_dmaCTRL g_dmaCTRLPKT1;
dmaReqAssign (DMA_CH0、DMA_SCI2_RX);
/*配置通道0的控制包*/

g_dmaCTRLPKT1.Sadd =(uint32_t)((uint8*)&(scilinREG->RD)+3);/*源地址*/
g_dmaCTRLPKT1.DADD =(uint32_t) dma_rx_buf;/*目标地址*/
G_dmaCTRLPKT1.CHCTRL = 0;/*通道控制*/
g_dmaCTRLPKT1.FRCNT = buffer_size;/*帧计数*/
g_dmaCTRLPKT1.ELCNT = 1;/*元素计数*/
G_dmaCTRLPKT1.ELDOFFSET = 0;/*元素目标偏移*/
G_dmaCTRLPKT1.ELSOFFSET = 0;/*元素目标偏移*/
G_dmaCTRLPKT1.FRDOFFSET = 0;/*帧目标偏移*/
G_dmaCTRLPKT1.FRSOFFSET = 0;/*帧目标偏移*/
G_dmaCTRLPKT1.PORTAGN = 4;
G_dmaCTRLPKT1.RDSIZE = ACCESS_8_BIT;/*读取大小*/
G_dmaCTRLPKT1.WRSIZE = ACCESS_8_BIT;/*写入大小*/
g_dmaCTRLPKT1.tType = FRAME_TRANSFER;/*传输类型*/
G_dmaCTRLPKT1.ADDMODERD = ADDR_FIXED;/*地址模式读取*/
G_dmaCTRLPKT1.ADDMODEWR = ADDR_INC1;/*地址模式写入*/
G_dmaCTRLPKT1.AUTOINIT = AUTOINIT_ON;/* autoinit */

dmaSetCtrlPacket (DMA_CH0、g_dmaCTRLPKT1);

dmaSetChEnable (DMA_CH0、DMA_HW);

dmaEnable();

通过这种配置、 dma_rx_buf 缓冲器填充 RX 数据、然后我使用主循环中的函数解析消息并进行处理。 我想在 DMA 中添加另一个通道、但有一个问题。 将优先级配置为在 Rotation 中工作、根据我配置 CHN0的方式、任务在收到1000字节后才会结束。 第二个通道应处理从缓冲区到 SCI TX 线路的数据传输。 如果我正确理解、我在数据表中看到 DMA 只有一个端口、那么如果我要使用 CHN1进行传输、就必须停止 CHN0、这两个通道无法同时传输数据?  

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

    尊敬的 Ahmet:

    [报价 userid="620632" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1427649/tms570ls3134-dma-sci-rx-tx-in-full-duplex "]如果我理解正确、我在数据表中看到 DMA 只有一个端口、因此如果我要使用 CHN1进行传输、我必须停止 CHN0、这两个通道无法同时传输数据?  [报价]

    您是正确的、此器件只有一个用于 DMA 的端口。 因此无法同时处理两个通道。 不过、现时有两个优先计划、我会在下一条评论中详述这些优先计划。

    ——
    谢谢、此致、
    Jagadish。

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

    尊敬的 Ahmet:

    基本上、此 DMA 模块中将存在两个优先级队列。 一个是高优先级队列、另一个是低优先级队列。 每个通道都可以配置为处于这两个队列之一。

    只有当较高优先级队列中没有挂起通道时、才能处理较低优先级队列中的挂起通道。 这是划分两个队列的基本功能。

    现在、我们可以按固定优先级方案或独立轮换优先级方案来操作每个队列。

    固定优先级:

    在此优先级方案中、较低的通道编号具有较高的优先级。 这意味着、如果有两个通道处于挂起状态、那么较低通道编号将首先执行、然后较高通道编号将执行。 高通道编号应等到低通道编号完成任务。

    示例:

    如前所述、低优先级队列挂起通道只有在高优先级队列中没有挂起通道时才会执行。 现在、根据固定优先级方案、较低的通道在队列中具有较高的优先级、较高的通道在队列中具有较低的优先级。

    根据上述两条规则、您可以了解如何在固定优先级方案中处理通道。

    旋转优先级:

    在该方案中、挂起的通道以轮询方式执行。 这里没有固定的优先级、因此通道将以轮询方式执行、并且当当前通道的 FIFO 为空时、下一个通道的控制将发生移位。

    这意味着 DMA 有一个 FIFO、因此使用该 FIFO、它会将数据从源传输到目标。 每个挂起的通道数据都将移动到此 FIFO、并且将发生当前通道数据移位、直到该 FIFO 变空。 一旦该 FIFO 为空、则对当前通道进行仲裁、下一个挂起的通道将获得机会、而在所有挂起通道移位等于 FIFO 的数据后、当前仲裁的通道将再次获得机会。

      

    通过这种方式、所有通道都将循环执行。

    示例:

    还有、只有在高优先级队列中没有挂起通道时、才会执行低优先级队列挂起通道。

    因此、您可以根据您的要求选择轮询方案。 从而使发送和接收具有相同的优先级。

    ——
    谢谢、此致、
    Jagadish。