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.

[参考译文] TMS570LC4357:SCI 通过 DMA 使用时的 RX 问题

Guru**** 2478765 points
Other Parts Discussed in Thread: TMS570LC4357, HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/984861/tms570lc4357-rx-issue-when-sci-used-over-dma

器件型号:TMS570LC4357
主题中讨论的其他器件: HALCOGEN

大家好、

在我们的 TMS570LC4357应用中、对于串行通信、我们使用的是基于 DMA 的 SCI3。 DMA 的数据包配置与 halcogen 中提供的示例类似、tType 的配置与帧传输类似。 在 Rx 端、我们看到数据在接收到一定数量的字节后丢失。

意见1:
我们已将 PC 连接到处理器的 Rx 端、并且我们将以100ms 的速率和每次发送的字节为200的字节从 PC 传输数据。
在 DMA 数据包中、配置的 Rx 帧大小为512、元素大小为1。 我们观察到、在接收到~1.6Lakh 字节后的某个时间、数据将丢失。 错过的数据大小和此事件的实例不是每次都固定的。 它可能会随迭代而变化。

意见2:
观察 1中提到的连接一样、如果我们尝试以相同的速率将数据大小增加到300、那么如果配置的帧大小相同、问题的发生非常快。

意见3:
正如观察 1中提到的大小、如果 我们保持不变、即200、并且如果我们将 PC 的传输速率提高到200ms、那么我们已经观察到该问题的发生在某种程度上会延迟。

目前、我们将 SCI 配置为以57600波特率运行、具有1个停止位且无奇偶校验。

请您帮助我们解决此问题、因为随着我们通过 DMA 使用 SCI 操作的时间的推移、这会影响 SCI 操作的质量。

此致。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="464300" URL"~/support/microcontrollers/other/f/other-microcontrollers-forum/984861/tms570lc4357-rx-issue-when-sci-used-over-dma "]错过的数据的大小

    您是否意味着传输大小被覆盖?

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

    您能否将 DMA 帧大小更改为要发送的字节数:200字节或200字节?  

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

    我在 SCI2和 SCI3之间进行了测试。 SCI3每次传输传输200字节(帧)、总共传输100次。 SCI2正确接收所有数据。

    SCI2和 SCI 都使用 DMA。

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

    感谢您的快速响应。 实际上、我们无法控制接收数据包中帧的大小、因为我们每次接收多少字节时都不会固定帧大小。

    事实上、我们还想知道共享 RAM 的重要性。 我在这里附上了 ti 票证、其中指示使用共享 RAM 存储器区域来存储 DMA 缓冲区。 我想详细了解、如果我们不使用共享 RAM 概念、会产生什么影响。 如果我们不使用它、它将起作用? 或任何其他影响。

    目前、在我们的代码中、我们尚未配置共享 RAM、我们仅将 RAM 部分用于 DMA 缓冲区、其中用于完整 RAM 的策略为正常、在特权和用户模式下、写入时无需进行写分配、读取/写入访问均在此处、 我们能够建立通信、但会随着时间的推移而发现缺少数据字节的问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    由于存储器配置为直写式、而不分配写入、因此数据将写入主存储器(高速缓存命中或高速缓存未命中)。 但所有可高速缓存的存储器都是可读分配的。 当 CPU 从 SRAM (或 DMA 接收缓冲区)读取数据时、它将读取缓存中存在的数据(缓存命中时)、而不是 SRAM 中可用的新数据。

    您可以在读取操作之前执行缓存失效。 高速缓存失效后、CPU 从高速缓存读取的内容将保持一致。

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

    大家好、我相信 DMA 引擎会将接收到的 UART 数据复制到物理存储器空间(DMA 缓冲器)中。 用户应用程序访问时、如果不能确保缓存一致性、是否可以从缓存的 DMA 缓冲区读取错误的数据?

    您是否建议我们是否必须将所有 DMA 缓冲器放入一个通过链接器强制的存储器区域中、并使用 MPU 设置特定的存储器保护属性? 您认为我们是否需要禁用此区域的缓存? 或者我们需要使其保持启用状态? 如果需要启用、那么我们需要使用哪些建议的高速缓存策略?

    请就这些澄清提供您的反馈。

    谢谢、

    Kishore

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

    您好 Kishore、

    [引用 userid="416523" URL"~/support/microcontrollers/other/f/other-microcontrollers-forum/984861/tms570lc4357-rx-issue-when-sci-used-over-dma/3644822 #3644822"]如果访问时不能确保高速缓存一致性,用户应用程序可以从高速缓存的 DMA 缓冲区读取错误的数据?

    QJ>是的、您回答正确。  

    [引用 userid="416523" URL"~/support/microcontrollers/other/f/other-microcontrollers-forum/984861/tms570lc4357-rx-issue-when-sci-used-over-dma/3644822 #3644822"]您是否建议我们是否必须将所有 DMA 缓冲器放入通过链接器强制的存储器区域并使用 MPU 设置特定的存储器保护属性? 您认为我们是否需要禁用此区域的缓存? 或者我们需要使其保持启用状态? 如果需要启用、那么我们需要使用哪些建议的高速缓存策略?

    QJ>我更喜欢为 DMA 缓冲器分配共享存储器区域。 例如

    #pragma SET_DATA_SECTION (".sharedRAM")

      uint32 TX_buffer[128];      系统 RAM 中的/*发送缓冲器*/
      uint32 rx_buffer[128]={0};//系统 RAM 中的接收缓冲区

    #pragma SET_DATA_SECTION ()

    链接器命令:

    存储器

      (笑声)
     SHAREDRAM (RW):origin=0x0807A000 length=0x0005000

    部分

      (笑声)
     sharedRAM:{}> SHAREDRAM

    HALCoHen MPU 设置:

    为 SHAREDRAM 存储器区域选择一个未使用的 MPU 区域、将其配置为直写和写分配。  

    但 DMA 写入和 CPU 读取之前、仍然需要缓存无效。

    DMA 将数据写入 RX_buffer []

    2.使 Rx_buffer 的缓存行无效[]  

    CPU 读取 RX_buffer []。 由于读取分配策略、因此会分配一个缓存行、并将 Rx_buffer []从 SRAM 复制到缓存。  

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

    如果使用回写和写分配策略、则需要在 CPU 写入 TX_buffer 后[]和 DMA 传输前执行缓存清理。

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

    TMS570LC43x 器件具有一个名为 uSCU 的模块。 此单元可确保 d 高速缓存与写槽区域上的其他主器件(例如 DMA 和以太网)之间的数据一致性。

    因此不需要步骤#2 (使缓存无效)。  

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

    你(们)好。 我们已根据您的指导配置了设置。 但是我们没有找到'Write-Through and Write-Allocated'配置、但我们完成了'Write-Through and no write-allocated'配置、并且仍然看到接收字节丢失。 在这种情况下、我们没有进行显式刷新并使共享存储器区域无效、但如果我们也这样做、它也不会产生任何影响。

    当我们完全禁用共享存储器区域的高速缓存时、我们不会看到任何问题。 我们还想知道、缓存有什么关系。

    您提到过"uSCU"会在 DMA 引擎将数据复制到 RX DMA 缓冲区时注意缓存堆叠、如果是这种情况、您为什么认为我们仍然看到这个问题?

    谢谢、

    Kishore

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

    您好  Kishore、

    可能需要 DMB 指令来确保在读取数据之前完成对 SRAM 的写入。