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.

[参考译文] CC1352P:有关 uart2配置参数的问题。

Guru**** 2609895 points
Other Parts Discussed in Thread: CC1352P

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1109635/cc1352p-questions-about-uart2-config-params

器件型号:CC1352P

您好、TI。

我将使用 CC1352P 基于 SimpleLink SDK 6.10版测试 uart2。

我在 SDK 中使用 uart2callback 示例、如下所示:

在此示例中、syscfg 中有 Rx 环缓冲区大小、TX 环缓冲区大小、TX 中断 FIFO 阈值和 Rx 中断 FIFO 阈值、如下所示:

Rx/TX 环形缓冲区大小的默认值为32。

以及 UART2_write()和 UART2_read()的原型

int_fast16_t UART2_write(UART2_Handle handle, const void *buffer, size_t size, size_t *bytesWritten);

int_fast16_t UART2_read(UART2_Handle handle, void *buffer, size_t size, size_t *bytesRead);

有一个大小参数。 例如、我要 TX 50个字节、我将调用 UART2_WRITE (UART、my_buffer、50、NULL)。

那么、我想问的是、syscfg 中的 TX/Rx 环缓冲区大小与传递给 UART2_WRITE/UART2_READ 的大小之间是否存在限制?

问题2. 如何了解 syscfg 中的 TX/Rx 中断 FIFO 阈值、更改这两个阈值会产生什么影响、我是否需要更改它们?

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

    您好、Yingtao、

    1) 1) UART2驱动器中使用了环形缓冲器、以灵活扩展 UART 硬件中存在的 TX/RX FIFO 的固定大小。 如果提供大于环形缓冲区大小的大小参数、则不会遇到问题。 但是、这在 syscfg 中是可定制的、因为环形缓冲区越大、CPU 执行的填充环形缓冲区的大容量存储器副本就越少。 例如、批量传输大量数据时、出于性能目的、通常使用的环形缓冲区大小是您要发送/接收的最大缓冲区的两倍。 这将以牺牲额外内存使用为代价、在性能方面优化 UART 传输。

    2) 2)我建议不要更改 TX/Rx 中断 FIFO 阈值。 该值用于选择 RX 和 TX FIFO 的填充级别、UART 外设将在该级别向 CPU 生成中断、以请求将数据从 FIFO 传输到环形缓冲器。 这些 级别通常已经可以正常工作、因此我建议您仅在需要优化 UART 事务时调整环缓冲区大小。

    希望我的答案能让环路缓冲器和中断 FIFO 的概念更加清晰。 如果您有任何其他问题、请告诉我。  

    此致、

    高斯图

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

    谢谢你。 我在 syscfg 中保持这些值不变。

    基于此 uart2回调示例、我进行了一些更改以测试大量数据传输。

    我的代码:

    #define DEBUG_UART_BUF_SIZE 256
    static uint8_t debug_uart_rx_buf[DEBUG_UART_BUF_SIZE];
    
    static UART2_Handle      uart;
    static sem_t sem;
    static volatile size_t numBytesRead;
    
    void callbackFxn(UART2_Handle handle, void *buffer, size_t count, void *userArg, int_fast16_t status)
    {
        numBytesRead = count;
        sem_post(&sem);
    }
    
    void *mainThread(void *arg0)
    {
        UART2_Params      uartParams;
        int32_t           semStatus;
        uint32_t          status = UART2_STATUS_SUCCESS;
    
        semStatus = sem_init(&sem, 0, 0);
    
        UART2_Params_init(&uartParams);
        uartParams.readMode = UART2_Mode_CALLBACK;
        uartParams.readCallback = callbackFxn;
        uartParams.baudRate = 115200;
    
        uart = UART2_open(CONFIG_UART2_0, &uartParams);
    
        while (1) {
            numBytesRead = 0;
    
            UART2_read(uart, debug_uart_rx_buf, DEBUG_UART_BUF_SIZE, NULL);
    
            sem_wait(&sem);
    
            if (numBytesRead > 0) {
    
                status = UART2_write(uart, debug_uart_rx_buf, numBytesRead, NULL);
            }
        }
    }
    

    该代码与示例代码基本相似、不同之处在于传递给 uart2_read 的读取大小为256、而不是1。

    在我的应用中、Rx 数据长度不确定、它可能是1个字节、也可能是200个字节、通常小于255个字节。

    在代码中、我要测试 UART 是否将接收到的所有数据写回 Rx、以验证 Rx 是否正确接收到所有数据。

    下面是我的测试数据。

    (1)

    我在 PC 上使用串行工具将一个十六进制字节0xAA 发送到我的目标、该工具接收到一个十六进制字节0xAA、这是正确的。 它显示我的目标接收0xAA、然后将其写回。

    (2)

    我发送10个字节、该工具接收10个字节。 没错。

    (3)

    我发送50个字节、工具正确接收50个字节。  

    (4)数据越长、就会出现问题。

    我发送200个字节四次、仅在工具第二次接收200个字节时、在其他3次中、出现数据丢失。

    因此、该测试足够简单、我想如果您重复该测试、您可能会得到类似的结果。

    在此测试代码中、UART 接收缓冲区大小为256、这是否太大? 此缓冲器大小是否存在限制?

    如何最大限度地提高 UART Rx 的成功率?

    谢谢你。

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

    您好、Yingtao、

    我在 Simplelink SDK 6.10版中重现了您的问题。 随着 RX 振铃器缓冲器大小的增加、频率似乎会降低。 但是、这是一个已知的错误、在115200等低波特率下、TX/RX 环形缓冲器不需要超过32B 的电流。

    我在 Simplelink SDK 预览中尝试过相同的示例、包括错误修复、我可以使用32B TX/RX 铃声缓冲区大小以115200波特率运行您的示例、而不会再遇到问题。 此修复程序将包含在2022年第二季度 Simplelink SDK v6.20中。

    此致、

    高斯图