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.

[参考译文] AM2434:am2434

Guru**** 2422790 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1533623/am2434-am2434

器件型号:AM2434


工具/软件:

29-2025

尊敬的 E2E 支持团队:

 

主题:AM243xLP 版本 A 上的 UART 通信错误

我正在使用 AM243xLP A 版电路板、利用 UART #3 和 UART #4、配置为 3,000,000 波特率、8 位、1 个停止位、无奇偶校验。 在传输由 8 位计数器序列 (0x00 到 0xFF) 组成的长消息时、我在大约 1000 个字符后遇到了一致的错误。

具体来说:

  • 对于 1200 字节的消息、大约 1000 个字符后、发送 0x94 会导致接收 0xA4。 随后、接收到的字节不正确递增(0xA5、0xA6 等)。
  • 类似地、发送 0x00 时发生了另一种类型的错误;接收到的字节是不正确的 0x10、然后是顺序错误。

我的设置涉及由 150µs 计时器中断触发的轮询模式 UART 传输。 我已验证在 UART 传输之前保存数据的阵列包含正确的数据、表明在进入 UART 发送缓冲区之前没有问题。

下面是相关的传输代码片段:

tx_fifo_Cycle13[uart_id]= uart_hwregs[uart_id]->TXFIFO_LVL;

tx_fifo_cplace = max_char_fifo_tx - tx_fifo_cycle13[uart_id];

 

if (tx_fifo_place < output_message_length[uart_id]){

   for (send_index = 0;send_index < tx_fifo_place;send_index++){

       tx_save_tx_buff[uart_id][tx_save_tx_buff_index[uart_id]+]=*uart_data_to_send[uart_id];

       uart_hwregs[uart_id]->RBR_THR_DLL =(uint32_t)*uart_data_to_send[uart_id]++;

   }

   output_message_length[uart_id]-= tx_fifo_place;

}

您能否说明这些 UART 传输错误的潜在原因并提出纠正措施建议?

感谢您的帮助。

此致、

Baruch Einziger

 

 

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

    您好、

    我的设置涉及由 150µs 计时器中断触发的轮询模式 UART 传输

    对于 256 字节的数据发送大小、TX FIFO 触发电平的大小是多少? 是 16 个字节还是 8 个字节?

    除此之外、如果波特率为 3M、您是否确认在线路上实际看到 3M(通过一些波形,逻辑分析仪)。

    一些将从热角度弥合差距的计算:

    1200 字节以 3M 波特率和默认 UART 设置传输约意味着:4 毫秒或 4000 微秒。

    (1 个开始位+ 8 个数据位+无奇偶校验位+ 1 个停止位)= 10 个数据位。

    (1200 * 10) 位/ 3000000 = 0.004 秒或 4 毫秒或 4000 微秒。

    我的设置涉及由 150µs 计时器中断触发的轮询模式 UART 传输

    给出以下设置基本上意味着每 15 微秒、发送 1200 字节、但理论上说至少需要 4000 微秒。

    请告诉我您的想法。

    此致、

    Vaibhav

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

    你好、 Vaibhav

    您的观察结果是准确的、但消息长度不在此列。 对于 UART #4、我的数据大小为 1200 字节;对于 UART #3、则为 1300 字节。 传输的数据包含一个 8 位计数器、该计数器会从 0 持续循环到 0xFF、直到消息结束。

    我通过将 TX 线路直接连接到 RX 线路、使用示波器验证了传输。 此测试在独立 AM243X-LP 板和连接我的接口卡 (RS422) 的 AM243X-LP 上都执行。 在这两种配置中、结果非常相似。

    此致、

    Baruch

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

    H Baruch,

    对于 UART #4、我的数据大小为 1200 字节、对于 UART #3、数据大小为 1300 字节。

    这对我来说绝对没问题。

    给出以下设置基本上意味着每 15 微秒发送 1200 个字节、但理论上说至少需要 4000 微秒。

    这是我唯一关注的问题。 您对此陈述有何看法。

    此致、

    Vaibhav

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

    尊敬的 Vaibhav:

    我很抱歉耽误了我的答复。

    澄清一下、该中断是 150µs 计时器中断、而不是 15µs 中断。 波特率为 3,000,000bps 时、每个中断周期最多可管理 45 个字符。

    我实现了一个用于 UART 发送和接收的状态机、这两者都由此 150µs 计时器中断激活。 从未缓存的共享缓冲区读取消息并将其写入共享存储器发送缓冲区。

    目前、由于 AM243X-LP 的内部 RAM 限制、我仅使用内核 R00 进行 UDP 1Gb/秒 UDP 通信、使用 R01 进行 UART 处理。

    关于位 4 上发生的 UART 错误、不清楚该问题是否与接收或发送有关。 但是、由于错误在初始事件后的每个字符上始终发生(超过大约 1000 个字符)、我怀疑这可能是与传输相关的错误。

    谢谢您、

    Baruch

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

    尊敬的 Baruch:

    、波特率为 3,000,000bps

    请告诉我 3M UART 波特率的设置是否与 TRM 中显示的设置匹配、然后我们可以继续调试。

    期待您的答复。

    谢谢、

    Vaibhav

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

    尊敬的 Vaibhav:

    我测试了 48MHz 和 96MHz 时钟选项。 在这两种情况下、波特率保持不变、错误仍然存在。

    谢谢、
    Baruch

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

    尊敬的 Baruch:

    但是、由于初始事件后每个字符上始终出现错误(大约超过 1000 个字符)、我怀疑这可能是与传输相关的错误。

    您能否将一些调试日志放在 UART_write/UART_read API 中、以获取故障发生位置的标记。

    如果您需要这方面的任何帮助、请告诉我。

    除此之外、您还可以尝试其他 UART 模式、例如轮询模式吗?

    谢谢、

    Vaibhav

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

    尊敬的 Vaibhav:

    我目前处于轮询模式、直接访问 UART 寄存器。

    在发送循环中、我将写入 UART 的字符存储在一个数组中。 我确认在填充 TX FIFO 时没有错误。 在软件开发过程中、我通过 AM243x-LP 上的 RS422 连接器将接收器线路从外部连接到发送线路、有效地将 UART TX 环回到 UART RX。

    但是、我在发送环路中遇到问题。 错误始终显示在消息的末尾、但不会出现在固定位置。 我已经在 UART 状态机管理的缓冲区中直接验证了这一点、随后在使用 Winsock 以 1Gbps 的速率通过 UDP 发送消息时观察到了这一点。

    以下是使用的典型环路:

    传输环路:

    tx_fifo_place = max_char_fifo_tx - UART_hwregs[uart_id]->TXFIFO_LVL;
    
    if (tx_fifo_place < output_message_length[uart_id])
    {
        for (send_index = 0; send_index < tx_fifo_place; send_index++)
        {
            tx_save_tx_buff[uart_id][tx_save_tx_buff_index[uart_id]++] = *uart_data_to_send[uart_id];
            UART_hwregs[uart_id]->RBR_THR_DLL = (uint32_t)*uart_data_to_send[uart_id]++;
        }
        output_message_length[uart_id] -= tx_fifo_place;
    }

    接收循环:

    case normal_mode:
    
    rx_fifo_place = UART_hwregs[uart_id]->RXFIFO_LVL;
    
    if ((rx_fifo_place + input_buffer_cs_index[uart_id]) <= 1400)
    {
        for (send_index = 0; send_index < rx_fifo_place; send_index++)
        {
            *uart_data_to_read[uart_id] = UART_hwregs[uart_id]->RBR_THR_DLL;
            rx_save_rx_buff[uart_id][rx_save_rx_buff_index[uart_id]++] = *uart_data_to_read[uart_id];
            input_buffer_cs[uart_id] += *uart_data_to_read[uart_id]++;
        }
        input_buffer_cs_index[uart_id] += rx_fifo_place;
    }

    您能否提供有关如何解决此问题的建议?

    此致、Baruch

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

    您好、

    “那你就回去吧。“

    谢谢、

    Vaibhav

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

    你好、 Vaibhav

    谢谢

    Baruch

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

    您好、

    我涉及到一些高优先级问题、因此请预计此主题的响应会延迟。

    感谢您的耐心。

    此致、

    Vaibhav