工具/软件:
您好、TI 专家。
UART 示例“uart_echo_low_delay_polling"使用“使用“uart_getCharFifo"的“的函数。
该函数在“/source/drivers/uart/v0/lld/uart_v0.lld.c “中定义。
似乎该函数丢弃带有所有 RX 错误的接收到的 RX 数据。
(我们无法访问的函数“uart_readByte"是“是相同是相同的。)
我认为需要进行一些修改。
请注意、
Jeuk Chang
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.
工具/软件:
您好、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 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