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.

[参考译文] TMS570LS1227:SCI 在发送大数据块时会丢失字节

Guru**** 2682475 points

Other Parts Discussed in Thread: TMS570LS1227

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1564272/tms570ls1227-sci-is-losing-bytes-when-transmitting-large-data-blocks

器件型号:TMS570LS1227


工具/软件:

您好、

我使用的是两个使用 CCS Studio 的 TMS570LS1227 板。 我需要通过 SCI 将一个大数据块 (~10kB) 从一个电路板传输到另一个电路板。

在上 发送端 、已正确发送完整的 10 KB(使用 Docklight 验证)。 但是、在上 接收端 (中断)、我始终输不清 1000 至 3000 字节 所以我只收到了关于 7–8 KB 而不是整个块。

我不明白根本原因。 代码完全与 SCI 相关、其他方面未运行。 我尝试过:

  • 将最高优先级分配给 SCI

  • 将波特率降低至 9600

  • 优化中断处理程序、使其尽可能小

但问题仍然存在。 我还注意到 SCI 中断经常与一起触发 超限标志 迭代。

此外、这个 SCI 模块不支持 DMA 多缓冲模式 这使得处理大型数据变得更加困难。

您能帮助我识别并解决这个问题吗?

谢谢、
Sajith

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

    尊敬的 Sajith:

    此外、此 SCI 模块不支持 DMA 多缓冲模式 、这使得处理大型数据变得更加困难。

    对于这种大型数据应用而言、如果没有 DMA、这非常具有挑战性。 以下是您可以尝试一次的一些建议。

    1.在发送端 、确保仅在 TX EMPTY 标志为空时才写入、因为这可确保移位寄存器和数据寄存器均为空、与 TXRDY 标志相比、这最终会产生一些额外的延迟。

    2.我不明白为什么你不在至少接收端使用 DMA ,即使设备支持它。

    --
    此致、
    Jagadish。

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

    您好、
    很抱歉消息传递延迟。
    我实施了用于 SCI 的 DMA。

    我需要接收固定数量的字节。 我正在将 DMA 用于 TX、它运行正常—我已经使用 Docklight 进行了验证。 每隔一秒、我将通过 DMA 以 230400 的波特率发送 8KB 的数据。
    传输运行良好。

    我面临的问题是接待。 即使在为 RX 实施 DMA 后、我也无法接收全部 8000 个字节。 我使用 SOF ($#) 和 EOF(0x0D,)标识数据包 0x0A

    然而、每当我在块传输后获得 DMA 中断时、接收到的缓冲区都会完全失真、我永远不会获得完整的正确帧。 例如、如果我$#在开始和0x0D 0x0A结束时发送 8 KB、这些标记将出现在缓冲区中的随机位置。

    但当我发送较小的数据(大约 10 到 100 字节)时、一切都正常。

    Tx 和 Rx 缓冲区大小为 8000 字节



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

    尊敬的 Sajith:

    对延迟的回复表示歉意。

    您的 DMA 配置对我来说似乎没问题。 您可以尝试以下方法一次:

    1. DMA 配置问题:
    • 帧和元素计数配置似乎导致缓冲区损坏
    • 对于大型传输 (8KB)、需要正确配置 DMA 元素大小和帧计数
    • 建议的方法是使用 32 位传输、而不是尝试对大型块进行 8 位传输
    1. 建议的 DMA 配置:
    • 将 DMA 配置为使用 32 位元素大小
    • 将元素数量设置为 2(对于 8 字节块)
    • 设置帧数以处理您的总传输大小
    • 使用块传输完成 (BTC) 中断来处理完成  
    1. 缓冲器配置:
    • 对于 8KB 传输、请配置 DMA 以更小的块进行传输
    • 使用两次 32 位传输可一次移动 8 个字节
    • 确保针对 32 位传输正确对齐缓冲区地址

    //配置 DMA 以进行接收
    1、将元素大小设置为 32 位
    2.设置元素数量=2(每次传输处理 8 个字节)
    3.为您的 8KB 总大小设置帧数=(8000 / 8)//
    4.为连续接收启用自动初始化
    5.将源配置为 SCI RX 寄存器
    6.将目标配置为接收缓冲区

    --
    此致、
    Jagadish。