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:MIBSPI 上的 DMA 传输即使源数据已被修改、也会持续发送相同的数据

Guru**** 2454880 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/638934/tms570lc4357-dma-transfer-on-mibspi-keeps-sending-the-same-data-even-if-source-data-has-been-modified

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

我使用 DMA 在 FreeRTOS 任务中使用 MIBSPI2传输1024字节输出。

我指定了一个全局变量 ScreenBuffer、可用于更改数据内容、然后调用将设置 DMA 以启动传输的函数。

执行 DMA 后、它会正确传输 ScreenBuffer 的原始内容。

当任务修改 ScreenBuffer 内容并执行 DMA 传输时、DMA 会继续发送初始化的原始数据。  在 DMA 调用之前插入断点会显示屏幕缓冲区内容已更新/修改。

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

    Nino、您好!

    我认为原因必须是高速缓存设置。 如果您使用的是 HALCoGen、它会将整个 SRAM 配置为可通过写回缓存。 因此、对 SRAM 的任何写入实际上都被写入缓存、而不是写入 SRAM。 当 DMA 试图提取数据时、它会读取旧数据、因为新数据只存储在缓存中。

    如果您需要对多个总线主控使用 SRAM、我建议您创建一个不可缓存和可共享的存储器区域、并将该区域用于共享存储器。 或者、您仍然可以启用高速缓存、但将其配置为直写存储器。 这将使任何写入高速缓存和原始位置的写入操作。另一种方法是禁用内核上的高速缓存

    谢谢、此致、

    Veena

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我之前已经在 HalCOGen 中指定了 MPU 区域设置、很不幸。

    因此、我进一步检出了 FreeRTOS 代码、发现在创建任务时、它会将所有区域设置为可缓存、如您所示。 现在、我尝试使用 xTaskCreateRestricted 创建一个任务、并指定了我要更新的缓冲区以及使用 DMA。 我使用的是(portMPU_normal_OINC_shared|portMPU_PRIV_RW_USER_RW_NOexec)的 region 属性。

    现在可以使用。

    谢谢。

    Niño μ A