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.

[参考译文] TMS320F28P650SK:申请关于在 TMS320F28P650SK 上将多个 DMA 通道与 UART 配合使用的指导

Guru**** 2668435 points

Other Parts Discussed in Thread: TMS320F28P650SK, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1588089/tms320f28p650sk-request-for-guidance-on-using-multiple-dma-channels-with-uart-on-tms320f28p650sk

器件型号: TMS320F28P650SK
主题: SysConfig 中讨论的其他器件

尊敬的 TI 支持团队:

我目前正在使用 TMS320F28P650SK 器件、并希望使用六个 DMA 通道配置 UART 通信、如下所示:

UARTA:用于 RX 和 TX 的 DMA

UARTB:用于 RX 和 TX 的 DMA

SCIA 和 SCIB:DMA 仅用于 RX

我计划修改提供的示例 uart_ex4_loopback_dma 以满足这些要求。

您能否提供有关如何调整此示例以适应此配置的指导或文档?

非常感谢您的支持。

此致、Sungjoo  

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

    尊敬的 Sungjoo:

    在 F28P65X 中、DMA 无法访问 SCI 寄存器。 您应该能够根据需要将其用于 UART 实例、并使用该示例作为参考。 如果您有任何其他问题、请告诉我。  

    此致、

    Arnav

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

    亲爱的 Arnav Menon R

    感谢您的回应。

    是否可以将 DMA 数据总线宽度配置为 8 位?

    在我的设置中:

    TX 缓冲区填充递增数据(0、1、2、3、4…)。
    RX 缓冲区仅正确显示前几个值 (0、1、2)、但其余值为零(0、0、0…)。

    由于 UART 帧配置为 8 位 (8N1)、我相信 DMA 也应该以 8 位单元的形式传输数据以确保正确对齐。
    不过、我注意到 DMA 配置为一次传输 16 位、在 SysConfig 中、databus Width 选项仅显示:
    “DMA 一次传输 16 位“
    “DMA 一次传输 32 位“


    不能选择 8 位传输。

    您能给出一个建议、我如何将 DMA 配置为在 8 位模式下针对 RX 和 TX 通道运行

    、以便正确接收 UART 环回数据? 我是否应该在 SysConfig 或代码中应用权变措施或特定设置?

    非常感谢您的指导。

    此致

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

    您好、

    DMA 的最小总线宽度为 16 位。 不过、对于 8 位传输而言、这应该不是问题。 TX 通道只需将 TX 缓冲区中每个元素的低 8 位写入 UART 数据寄存器、同样对于 RX 也是如此。

    您看到的结果可能是由于突发大小/传输大小/FIFO 触发水平不匹配。 我建议浏览中的注释  UART_ex4_loopback_DMA 、因为它们详细说明了这些配置之间的关系。 如果问题仍然存在、我们可以查看您的配置。  

    此致、

    Arnav  

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

    你好。

    感谢您的答复。

    uart_ex4_loopback_dma.c示例中、我注意到当BUFFER_SIZE设置为 32 时、一切都正常。 但是、当 I 增加BUFFER_SIZE到 1024 时、RX 缓冲区似乎只存储从 0 到 31 的值。

    您能否解释一下为什么会发生这种情况? 下面是我用于测试的代码。

    我期待着你的答复。

    此致、

    sjkim

    ---------------------------------------- 我的测试代码----------------------------------------------------

    #define UART_BUFFER_SIZE 2.
    #define BUFFER_SIZE 1024//32

    uint16_t txData[Buffer_size];
    uint16_t rxData[buffer_size];

    const void *txAddr =(const void *) txData;
    const void * rxAddr =(const void *) rxData;
    const void *drAddr =(const void *)(myUART0_BASE + UART_O_DR);

    void main (void)

    while (1)

    for (bufferIndex = 0;bufferIndex < Buffer_Size;bufferIndex++)

    txData[bufferIndex]=(bufferIndex 和 0x00FF);
    rxData[bufferIndex]= 0;
    }

    DMA_startChannel (myDMA0_BASE);
    DMA_startChannel (myDMA1_BASE);

    while(!txDone ||!rxDone);

    if (memcmp (txData、rxData、buffer_size)== 0)

    G_bResult = true;
    }
    暴露
    G_bResult = false;
    }
    }

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

    你(们)好

    感谢您的答复。

    由于存储器限制、我想使用 8‑位 DMA Tx 和 Rx 缓冲器、而不是 16‑位。
    uint8_t TxDma[1024]
    uint8_t RxDma[1024]

    没有办法做到这一点吗?“

    此致、

    sjkim

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

    您好、

    C28x 是一个 16 位可寻址 CPU、因此您无法真正在 8 位字边界创建变量。 您可以声明 uint16_t 数组(大小为 512)、并使用编译器内在函数/位操作将两个 8 位字打包到每个数组条目中。 我建议仔细阅读 本指南

    此致、

    Arnav

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

    你好。

    感谢您的答复。

    在 uart_ex4_loopback_dma.c 示例中、我注意到当 BUFFER_SIZE 设置为 32 时、一切都正常。 但是、当 I 增加 BUFFER_SIZE 到 1024 时、RX 缓冲区似乎只存储从 0 到 31 的值。

    您能否解释一下为什么会发生这种情况? 下面是我用于测试的代码。

    我期待着你的答复。

    此致、

    sjkim

    ---------------------------------------- 我的测试代码----------------------------------------------------

    #define UART_BUFFER_SIZE 2.
    #define BUFFER_SIZE 1024//32

    uint16_t txData[Buffer_size];
    uint16_t rxData[buffer_size];

    const void *txAddr =(const void *) txData;
    const void * rxAddr =(const void *) rxData;
    const void *drAddr =(const void *)(myUART0_BASE + UART_O_DR);

    void main (void)

    while (1)

    for (bufferIndex = 0;bufferIndex < Buffer_Size;bufferIndex++)

    txData[bufferIndex]=(bufferIndex 和 0x00FF);
    rxData[bufferIndex]= 0;
    }

    DMA_startChannel (myDMA0_BASE);
    DMA_startChannel (myDMA1_BASE);

    while(!txDone ||!rxDone);

    if (memcmp (txData、rxData、buffer_size)== 0)

    G_bResult = true;
    }
    暴露
    G_bResult = false;
    }
    }

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

    DMA 设置通过 SysConfig 执行、其中您可以看到 TX 和 RX 通道均配置为突发大小为 2、传输大小为 16、总共 32 个字传输。 您可以将这些值调整为新的 1024 个字的大小、并且您应该看到完全传输正在发生。 (请参阅中的注释 uart_ex4_loopback_dma.c 获取有关计算突发和传输大小的帮助)

    此致、

    Arnav