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:DMA 数据传输

Guru**** 2455620 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/1158641/tms570lc4357-dma-data-transfer

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

大家好、

我一直在尝试在 端口 A 和端口 B (MibSPI)之间使用 DMA 数据传输。  

1.使用 MPU 尝试使用共享存储器(正常的内部和外部不可分离和共享存储器类型)、如 example_mibspidma.c (Halcogen/examples)中所述。 此任务成功。

2.使用 coreCleanDCByAddress 和 coreCleanInvalidateDCByAddress 进行了尝试(没有任何 MPU 配置)。  当块传输完成但 RXDATA 为空时、我确实会看到 DMA 中断通知  

coreCleanDCByAddress ((uint32_t)&TXDATA[0]、D_size << 1U);/*清理字节*/
coreCleanInvalidateDCByAddress ((uint32_t)&RXDATA[0]、D_size << 1U);//清理并丢弃旧的高速缓存数据*/

i.是否有任何方法可以使用不带 MPU (正常的内部和外部不可缓存和共享存储器类型)的 DMA、如上所述或任何其他方法?

提前感谢

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

    您好!

    DMA 允许将数据从外设直接发送到存储器或从存储器发送到外设、从而使 CPU 无需参与数据传输并提高 CPU 的性能。

    但是、如果 CPU 具有数据缓存且启用了数据缓存、则使用 DMA 可能会导致缓存一致性问题。 DMA 控制器访问的 SRAM 中的数据可能不会使用缓存中存储的正确数据进行更新。

    有两种方法可以解决这种问题:

    1.在 DMA 和 CPU 共享的存储器区域上禁用高速缓存,就像在#1中所做的那样

    在这种方法中、CPU 和 DMA 共享的存储器区域被定义为使用存储器保护单元(MPU)不可高速缓存、同时将仅由 CPU 访问的存储器区域保留为可高速缓存。  共享存储器可由 CPU 和 DMA 同时更新。

    2.在 DMA 从 TXDATA 中读取数据之前清理缓存

      清理缓存–将标记为脏的缓存行写回主存储器。

      第一。 CPU 写入数据到 TXDATA[]

      2。 清除缓存操作、将缓存的 TXDATA[]刷新到 SRAM 中

      3号。 从 SRAM 读取的 DMA 现在将保持一致。

    3.以前对高速缓存进行初始化  

      使缓存无效–将缓存行标记为无效。 后续访问强制将数据从主存储器复制到高速缓存。

      第一。 DMA 将数据写入 RXDATA[]

      2。 使缓存的 RXDATA[]无效。

      3号。  然后、CPU 从高速缓存读取将保持一致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="457368" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1158641/tms570lc4357-dma-data-transfer "]

    coreCleanDCByAddress ((uint32_t)&TXDATA[0]、D_size << 1U);/*清理字节*/
    coreCleanInvalidateDCByAddress ((uint32_t)&RXDATA[0]、D_size << 1U);//清理并丢弃旧的高速缓存数据*/

    [/报价]

    当使用缓存清理并通过地址 API 使缓存无效时:

    Addr–必须与高速缓存行大小边界对齐。 这意味着 DMA 缓冲区地址必须与32字节边界对齐。

    dsize–必须是高速缓存行大小的倍数。 这意味着 DMA 缓冲区大小必须是32字节的倍数。