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.

[参考译文] TM4C1294NCPDT:UART RX FIFO 触发电平和 RX FIFO 空标志行为

Guru**** 2530870 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1128249/tm4c1294ncpdt-uart-rx-fifo-trigger-level-and-rx-fifo-empty-flag-behavior

器件型号:TM4C1294NCPDT

我正在使用 UART RX FIFO 深度来触发中断、并在我有一些数据可供处理时对我进行签名。 接收到的数据包具有可变的字节数、我使用2/8的触发电平来确保为所有数据包生成接收中断、并使用接收超时来识别数据包的末尾 (我使用数据完整性检查来区分实时超时或封装结束)。

我的问题是关于(HWREG (UART_PORT_base + UART_O_FR)和 UART_FR_RXFE)。 我正在从 RX FIFO 读取字节、直到我有一个真条件。

问题是 UART_FR_RXFE 标志、它在2/8 RX FIFO 读取周期后变为高电平、并且我无法读取 FIFO 中的剩余字节。 所有 RX FIFO 阈值电平设置的行为都相同。

它是 RX FIFO 空标志的正确行为吗?

我出了什么问题? 这是不正确的方法吗?

谢谢、

Richard

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

    您好!

     如果 RXFE 标志保持为1、则表示接收 FIFO 为空。

     如果您看一下 UART_echo 示例,它会使用 UARTCharsAvail ()作为条件来保持对 RXFIFO 的读取,直到该 FIFO 为空。 您为什么不会尝试使用 UARTCharsAvail 而不是依赖 RXFE?

    void
    UARTIntHandler(void)
    {
        uint32_t ui32Status;
    
        //
        // Get the interrrupt status.
        //
        ui32Status = MAP_UARTIntStatus(UART0_BASE, true);
    
        //
        // Clear the asserted interrupts.
        //
        MAP_UARTIntClear(UART0_BASE, ui32Status);
    
        //
        // Loop while there are characters in the receive FIFO.
        //
        while(MAP_UARTCharsAvail(UART0_BASE))
        {
            //
            // Read the next character from the UART and write it back to the UART.
            //
            MAP_UARTCharPutNonBlocking(UART0_BASE,
                                       MAP_UARTCharGetNonBlocking(UART0_BASE));
    
            //
            // Blink the LED to show a character transfer is occuring.
            //
            MAP_GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0, GPIO_PIN_0);
    
            //
            // Delay for 1 millisecond.  Each SysCtlDelay is about 3 clocks.
            //
            SysCtlDelay(g_ui32SysClock / (1000 * 3));
    
            //
            // Turn off the LED
            //
            MAP_GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0, 0);
        }
    }

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

    您好、Charles、

    我仍在调试、但看起来我读取 RX FIFO 的速度快于填充速率。 这就是空标志与阈值电平匹配的原因。 我将保持接收状态、等待以下 RX FIFO 中断、直到我有一个超时中断来处理接收到的所有数据包。

    我将在接下来的几个小时进行测试...

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

    您好 Richard、

     我做了一些测试、但我自己无法理解。 如果我启用 FIFO 并将 FIFO 电平设置为2/8或甚至7/8、那么一旦我发送一个字节、中断就会立即触发。 FIFO 为16字节深。 2/8表示7/8为4字节或14字节。 它不会等待4个字节来触发中断、而是只在一个字节之后触发中断。 我不知道您是否注意到同样的情况。 可能存在我无法解释的硬件问题。  

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

    是的、用于触发中断的 FIFO 阈值电平正在工作。 下面是 我正在使用的初始化代码片段:

    MAP_UARTFIFOLEVELSet (UART_PORT_base、UART_FIFO_TX1_8、UART_FIFO_RX2_8);//设置 TX (2字节)和 RX (4字节) FIFO 中断阈值。  
    MAP_UARTFIFOEnable (UART_PORT_BASE);//启用 FIFO。 TX 和 RX FIFO。

    MAP_UARTTxIntModeSet (UART_PORT_base、UART_TXINT_MODE_EOT);// TX 中断将根据传输结束触发。

    MAP_IntEnable (INT_UART2);

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

    我从 RX FIFO 中移除数据的速度快于传入速率、RXFE 在读取阈值电平中断确定的字节后变为高电平。 我已经包含了一些等待状态来解决它。

    您是否发现阈值触发电平的问题?

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

    您好 Richard、

     很高兴您使用权变措施解决了该问题。 我还将尝试您的代码片段、看看我是否能够按照编程的 FIFO 阈值级别触发中断。