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.

[参考译文] TM4C1290NCZAD:TM4C1290NCZAD UART 接收数据超过 UARTFIFO 大小

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1313594/tm4c1290nczad-tm4c1290nczad-uart-receiving-data-exceeds-uartfifo-size

器件型号:TM4C1290NCZAD

团队成员:

    我最近在两个设备之间进行 Modbus 通信。 我想问、当接收到的数据超过 UARTFIFO 大小时、作为从设备、我该如何处理?

   我在 UART 接收中断中设置了一个接收阵列来接收数据。

   在配置 UARTFIFO 之前、我使用串行端口调试助手发送帧长度为11字节的数据。 每次数组只能接收前8个字节。 最后三个数据将丢失。

---------------- 原因是 UARTFIFO 默认处于"UART_FIFO_RX4_8"模式、即每8个字节触发一次中断、因此主机发送11个字节、接收前8个字节、无法接收后3个字节、因为未触发中断。 到达

   有两个方向可以解决这个问题

  一种是调整 FIFO 深度并将 UARTFIFO 设置为"UART_FIFO_RX7_8"模式、即触发中断以接收多达14个字节、然后我发送的11个字节肯定一次可以完全接收。 但是、如果我发送的数据超过14字节、数据是否会像以前一样丢失?

  第二种解决方案是参考以下链接、并将 FIFO 设置为最小长度、即两个字节会触发一个中断。 但是、我调试发现、如果我发送了11个字节的数据、我将接收5个中断、而不是6次、这仍然会导致数据丢失,所以将 FIFO 设置为2、4、8、12、14字节、 我每次发送的数据必须是它们的整数倍?

链接: e2e.ti.com/.../tms320f280039c-q1-uart-rxfifo-uart-received-is-more-than-rxfifo-size

我的问题总结如下:
(__LW_AT__1)UARTFIFO 级别设置 UART_FIFO_RX1_8、UART_FIFO_RX2_8、UART_FIFO_RX4_8、UART_FIFO_RX6_8、 UART_FIFO_RX7_8。 如果设置为 UART_FIFO_RX1_8模式、则 TM4C1290NCZAD UARTFIFO 的大小为16*8位。 设置此模式的意义是每2个字节一次。 ,触发接收中断? 如果主机发送11个字节的数据并且配置为该模式、那么它是否需要触发5个或6个中断?   当我将 UARFIFO 模式设置为 UART_FIFO_RX7_8时、如果根据上述了解、每14字节触发一次接收中断、为什么在接收11个字节时可以触发中断?

(__LW_AT__2)如果发送的数据超过 UARTFIFO 大小、我们如何才能完全接收该数据帧?

(__LW_AT__3)如何配置 TM4C 以作为中断接收字节?虽然这会占用大量资源、这样一来、无论发送何种数据、都可以完全接收到。

我希望专家能耐心回答我的问题。 如果您有任何问题、请及时向我发送私人消息。 非常感谢。

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

    您好!

     看起来只要接收帧大小不是 RXFIFO 触发大小的倍数、RXFIFO 中就会有大量未生成的数据、而不会产生中断。 在这种情况下、我建议您考虑禁用 FIFO、以便接收到的每个字符都能生成中断。 请参见下方的。  

    另一种方法是通过校验 RXFE 位来检查 RXFIFO 中是否还有剩余数据。 如果 RXFIFO 中仍然有3个数据、那么继续并读取它们。 如果 RXFE 未置位、则表示 RXFIFO 中仍有数据。