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:am243x-lp

Guru**** 2539500 points
Other Parts Discussed in Thread: SYSCONFIG

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

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

器件型号:AM2434
主题:SysConfig 中讨论的其他器件

工具/软件:

主题: AM243X-LP 上 230400 波特时 UART RS485 数据损坏

大家好:

在使用 AM243X-LP 时、我在处理长消息(超过 1000 个字符)时在通过 RS485 接收 UART 数据时遇到问题。 在某些情况下、某些接收到的字节会被更改、例如、位 7 显示为卡在 1。

昨天、在波特率为 230400 时、消息更短(约 50 字节)也出现了同样的问题。 这也是在 RS485 通信线上执行的。 这次、误差明显出现在接收器侧。

我使用外接显示器验证数据:

  • 监护仪收到此消息时未出现错误。

  • AM243X-LP 接收到数据且存在校验和错误。

这表明在 MCU 接收过程内发生了数据损坏。

问题:

  1. 什么可能导致 AM243X-LP 上发生这种 UART 数据损坏?

  2. 向 FIFO 读取访问添加额外的等待状态是否有助于缓解该问题?

如有任何见解或建议、将不胜感激。

谢谢您、

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

    您好、

    [引述 userid=“555359" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1552303/am2434-am243x-lp
    • 什么可能导致 AM243X-LP 上发生这种 UART 数据损坏?

    • 向 FIFO 读取访问添加额外的等待状态是否有助于缓解该问题?

    [/报价]

    您是否也测试过中断、轮询和 DMA?

    在进行测试时、我也考虑您使用最新的 SDK。

    谢谢、

    Vaibhav

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

    你好、Vaibhavi

    我正在处理所有 UART 的池化问题。 我有 150us 计时器中断。 我在 fifo 后读和写 fifo。

    在中断服务例程期间、我禁用所有中断。 时间很好、我仍然显示接收错误。

    谢谢 Baruch

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

    你好、Vaibhav  

    我仅使用池模式。 我有 150us 中断手处理 UART 接收和发送、并由中断处理程序发送。  

    我以 mcu_plus_sdk_am243x_10_01_00_32 开头

    谢谢

    Baruch

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

    您好、Baruch、

    关于 SDL、我以 mcu_plus_sdk_am243x_10_01_00_32
    开头

    我看不到此 SDK 与当前最新 SDK 之间有任何驱动程序差异、因此在这种情况下排除了任何错误修复的可能性。

    另外、我知道您的流程只需从 RS485 读取即可。

    您能否确保 RS485 的波特率<UART 波特率的+/- 1.5%?

    此外、UART 写入操作会被排除、因此 我们重点介绍 UART 读取调用。

    您能否将 SysConfig GUI 中的 Rx 触发电平设置为较低的值(如 1 或 8)并对此进行测试?

    您是否也能共享 MPU ARMv7 配置?

    期待您的答复。

    谢谢、

    Vaibhav

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

    尊敬的 Vaibhav:

    我的工作方法是直接与 UART 寄存器连接。 在每个 150µs 期间、我读取每个 UART FIFO 的内容并处理每个 UART 的 TX 和 RX FIFO。 如前所述、误差发生在外部环路中。

    编程过程从我查看过并发现正确的 SysConfig 开始。 但是、关于 230,400 bps 的波特率、我无法在保持可接受容差的情况下进行调整。 这是因为我们生成的波特率时钟的系数为 16、任何更改都会导致波特率错误。 对于 48MHz UART 时钟、误差超过 7%、太高。 即使使用 192MHz UART 时钟、误差也保持在 2%左右。

    我没有找到任何明确的理由提出这些问题。 程序无法正常运行、我不确定要尝试的其他方法。 无计时问题、无错误消息

    我可以向您发送一个示例、以便重现错误并与我的代码一同查看。

    谢谢您、
    Baruch

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

    尊敬的 Vaibhav:

    在上次尝试调试问题时、我将波特率从 3,000,000 更改为 115,200。 这时,我注意到最后一个字符有一个错误。 使用示波器,我观察到预期的字符是0x9F,但传输的字符是0xAF. 这表明问题与 TX 错误有关。

    在状态机中、我进行了修改:我删除了最后一个状态、并减小了写入 RX FIFO 的最终子消息的大小。 令我惊讶的是、这解决了错误、但我并不完全理解原因。

    以下代码正常工作:

    if (tx_fifo_place > output_message_length[uart_id])
         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;

    但是、以下版本会导致该错误:

    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;
    }
    else
    {
    for (send_index = 0; send_index < output_message_length[uart_id]; 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] = 0;
    }

    在这两种实现中、我都会在将每个字节写入 TX FIFO 之前保存一份消息副本、这里不会出现错误。

    我还不明白为什么第一次修改可以解决问题。

    谢谢您、
    Baruch