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.

[FAQ] [参考译文] 【常见问题解答】AM62P-Q1:使用 DMA 通过 UART 进行连续数据流式传输

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1614755/faq-am62p-q1-continuous-data-streaming-over-uart-using-dma

器件型号: AM62P-Q1

通过 UART 进行连续数据流式传输是不同应用中的一个用例。 我们来检查实现以及在实现时要注意的任何附加指针。

本常见问题解答适用于其他 SoC、例如 AM62x、AM64x、AM62Ax、AM62Dx、AM275x、 AM62Lx。

SDK 参考: www.ti.com/.../11.02.00.23

驱动程序参考: https://github.com/TexasInstruments/mcupsdk-core-k3/tree/k3_main/source/drivers/uart/v0

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

    先决条件:MCU+ SDK UART 驱动程序 — 传输完成行为

    摘要

    UART 驱动程序的 uart_write () API 行为因传输模式而异。 只有轮询模式才能保证在函数返回时数据已在线路上完全传输。 所有其他模式(中断和 DMA,阻塞和回调)只保证数据已传输到 UART TX FIFO、而不保证数据已在物理 TX 线路上发送。

    关键术语

    期限

    定义

    传输完成

    数据从应用程序缓冲区移至 UART TX FIFO

    引脚上

    从 TX FIFO→移位寄存器→TX 引脚发送的数据

    Tx FIFO 为空

    UART_LSR_TX_FIFO_E_MASK (LSR 的位 5)

    TX 移位寄存器为空

    UART_LSR_TX_SR_E_MASK (LSR 的位 6)

    详细模式分析

    轮询模式

    方面

    良好

    uart_write() 返回时

    所有数据均通过线路传输

    是否保证了线路上的数据?

    是的

    需要其他 API?

    实施: 驱动程序繁忙 — 等待 TX FIFO 和移位寄存器均为空后再返回。

     

     

     

    中断+阻塞模式

    方面

    良好

    uart_write() 返回时

    所有数据均已移至 TX FIFO

    是否保证了线路上的数据?

    需要其他 API?

    uart_flushTxFifo()

    实施: 信标块;当最后一个字节进入 FIFO 时、ISR 会发布信标。

     

     

    中断+回调模式

    方面

    良好

    uart_write() 返回时

    传输启动后立即开始

    回调在以下时间触发

    所有数据均已移至 TX FIFO

    是否保证了线路上的数据?

    否(甚至在回调时也不是)

    需要其他 API?

    回调后 uart_flushTxFifo()

    实施: 立即返回;在最后一个字节进入 FIFO 时调用回调。

     

     

     

    DMA +阻塞模式

    方面

    良好

    uart_write() 返回时

    DMA 传输完成(FIFO 中的数据)

    是否保证了线路上的数据?

    需要其他 API?

    uart_flushTxFifo()

    实施: 信标上的块;DMA 完成 ISR 发布信标。

     

     

     

    DMA +回调模式

    方面

    良好

    uart_write() 返回时

    DMA 初始化后立即开始

    回调在以下时间触发

    DMA 传输完成(FIFO 中的数据)

    是否保证了线路上的数据?

    否(甚至在回调时也不是)

    需要其他 API?

    回调后 uart_flushTxFifo()

    实施: 立即返回;DMA 完成时调用回调。

     

     

    摘要矩阵:

    消耗量

    返回时间

    线路上的数据?

    需要采取的措施

    轮询

    Tx 完成

    是的

    中断+阻塞

    数据→FIFO

    调用 uart_flushTxFifo()

    中断+回调

    方程

    在回调中调用 uart_flushTxFifo()

    DMA +分块

    数据→FIFO

    调用 uart_flushTxFifo()

    DMA +回调

    方程

    在回调中调用 uart_flushTxFifo()

    uart_flushTxFifo() 限制

    uart_flushTxFifo() 在内部调用 TaskP_youne()、从 ISR/回调上下文调用不安全。 这样做会导致未定义的行为。

    相反、可以使用以下实现:

    /*
     * Wait for UART TX to complete - ISR safe version
     * Polls the Line Status Register directly without calling TaskP_yield()
     *
     * NOTE: UART_flushTxFifo() is NOT safe to call from ISR/callback context
     * because it calls TaskP_yield() internally, which causes a crash.
     */
    static void waitForTxComplete_IsrSafe(UART_Handle handle)
    {
        uint32_t baseAddr = UART_getBaseAddr(handle);
        uint32_t lineStatus;
    
        /*
         * Wait until both:
         * - TX FIFO is empty (bit 5: UART_LSR_TX_FIFO_E_MASK = 0x20)
         * - TX Shift Register is empty (bit 6: UART_LSR_TX_SR_E_MASK = 0x40)
         */
        do
        {
            lineStatus = UART_readLineStatus(baseAddr);
        }
        while ((lineStatus & (UART_LSR_TX_FIFO_E_MASK | UART_LSR_TX_SR_E_MASK))
               != (UART_LSR_TX_FIFO_E_MASK | UART_LSR_TX_SR_E_MASK));
    }


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

    UART + DMA +回调+连续流式传输:

    e2e.ti.com/.../8081.uart_5F00_echo_5F00_callback.zip

    对于阻塞+ DMA +连续模式:

    如上所述、在 uart_write Complete_Isr 调用之后、使用以下 API“ waitForTx.api“。