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.

[参考译文] AM263P4:确定"UART_getCharFifo"函数的 Rx 错误

Guru**** 2529560 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1557530/am263p4-rx-error-determination-of-uart_getcharfifo-function

器件型号:AM263P4


工具/软件:

您好、TI 专家。

UART 示例“uart_echo_low_delay_polling"使用“使用“uart_getCharFifo"的“的函数。

该函数在“/source/drivers/uart/v0/lld/uart_v0.lld.c “中定义。

似乎该函数丢弃带有所有 RX 错误的接收到的 RX 数据。

(我们无法访问的函数“uart_readByte"是“是相同是相同的。)

我认为需要进行一些修改。

请注意、

Jeuk Chang

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

    尊敬的 Jeeuk:

    让我回顾一下代码、然后返回

    此致、
    Shaunak

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

    尊敬的 Jeeuk Chang:

    我测试了 uart_echo_low_delay 轮询示例、从 UART 控制台发送 8 个字节后 、我确实到达了 uart_getCharFifo () 函数、在该函数中我观察到没有错误计数。 errorVal 为 0、当我们执行检查“从 RxFIFO 读取和抛出错误字节“时、由于 errorVal 为 0、我们跳过 while 循环并直接从 RxFIFO 中读取字节(按预期)。

    您是否介意尝试这个二进制文件以确保我们不会在您的最后进行任何意外的修改

    AM263Px-CC 二进制文件:

    e2e.ti.com/.../uart_5F00_echo_5F00_low_5F00_latency_5F00_polling.debug.out

    AM263Px-LP 二进制文件:

    e2e.ti.com/.../uart_5F00_echo_5F00_low_5F00_latency_5F00_polling.debug.out

    此致、
    Shaunak

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

    尊敬的 Shaunak Deshpande:

    -

    我很抱歉不详细解释我的问题。

    我在执行 UART 示例时没有错误、因为通常不会发生 RX 错误。

    我指出了具有 RX 错误处理功能的 LLD 函数。

    -

    函数“uart_fifoCharGET"只“只需从 RX FIFO 中读取 1 个字节。

    -

    并且在丢弃 RX 数据与 RX 错误后、函数“UART_readByte"读取“读取 1 个字节。

    我认为该函数应该丢弃 RX 数据 不限 RX 错误、但实际上该函数仅使用丢弃 RX 数据 全部 RX 错误。

    (为了执行“while “中的语句、必须发出所有 RX 错误。)

    -

    函数“uart_getCharFifo" 从“从 RX FIFO 中读取 1 个字节、并临时更改 LCR 并检查 RX 错误。

    该函数还仅与一起丢弃 RX 数据 全部 RX 错误。

    -

    请注意、

    Jeuk Chang

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

    尊敬的 Jeeuk:

    感谢您的解释、

    通过查看 UART_readByte 和 UART_getCharFifo 函数、您的分析不完全正确、但有一个关于错误检查的重要细节。

    在 UART_readByte(第 1058-1086 行)中、代码会检查以下情况下是否存在错误:
    while ((UART_LSR_RX_FIFO_STS_MASK |
    UART_LSR_RX_BI_MASK |
    UART_LSR_RX_FE_MASK |
    UART_LSR_RX_PE_MASK |
    UART_LSR_RX_OE_MASK)= errorVal)

    这正在检查 errorVal 是否等于所有错误标志的组合。 正确的是、只有当所有可能的 RX 错误同时发生(中断错误,成帧错误,奇偶校验错误和溢出错误)时、这才会丢弃字节、这种情况不太可能发生。

    但是、观察 UART_procLineStatusErr(行 2617-2694)、会产生额外的错误处理。 当检测到线路状态错误时、会调用此函数、该函数专门检查单个错误类型:

    if ((lineStatus & UART_BREAK_DETECTED_ERROR) != 0U)
    {
    hUart->readTrans.status = UART_TRANSFER_STATUS_ERROR_BI;
    hUart->readErrorCnt++;
    }
    else if ((lineStatus & UART_FRAMING_ERROR) != 0U)
    {
    hUart->readTrans.status = UART_TRANSFER_STATUS_ERROR_FE;
    hUart->readErrorCnt++;
    }
    else if ((lineStatus & UART_PARITY_ERROR) != 0U)
    {
    hUart->readTrans.status = UART_TRANSFER_STATUS_ERROR_PE;
    hUart->readErrorCnt++;
    }
    else
    {
    hUart->readTrans.status = UART_TRANSFER_STATUS_ERROR_OE;
    hUart->readErrorCnt++;
    }

    当检测到线路状态错误时、中断处理程序 (UART_LLD_controllerIsr) 会调用此函数。

    因此、虽然您提到的特定字节读取函数可能只会同时丢弃包含所有错误类型的字节(似乎是一个错误)、但驱动程序确实会通过 UART_procLineStatusErr 在中断级别正确处理各个错误。

    为了正确处理 UART_readByte 和 UART_getCharFifo 中的单个错误、该条件应检查是否存在任何错误(按位或运算)、而不是要求所有错误都匹配。

    让我在内部提出一个错误、让我们的驾驶员专家审查实施情况。

    此致、
    Shaunak

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

    我在内部提出了一个错误以供审核: jira.itg.ti.com/.../MCUSDK-14895

    此致、
    Shaunak

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

    尊敬的 Shaunak Deshpande:

    由于我对 UART 使用自定义协议、因此我仅使用 UART LLD 函数的几个函数。

    TI 驱动程序是制作自己的定制驱动程序的良好起点。

    我希望 TI 驾驶员对其他人使用的错误更少。

    此致、

    Jeuk Chang

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

    尊敬的 Jeeuk:

    抱歉、您必须面对此错误、我已开始 与团队进行讨论、以获得此错误的解决方案。 此问题将在 TI.com 上的下一个 SDK 版本中得到修复、该修复程序也将很快通过 GitHub TI SDK 获取(在 TI.com 正式发布之前)

    此致、
    Shaunak