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.

[参考译文] TMS320F28379S:DMA 存储器访问冲突

Guru**** 2442090 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1528256/tms320f28379s-dma-memory-access-conflict

器件型号:TMS320F28379S

工具/软件:

您好:

我当前将 SPI FIFO(主器件)与 DMA 结合使用、并利用 DMA RX 中断。
总共使用了两个中断、包括一个 PWM 中断。

PWM 中断发生在 50kHz 处、而 DMA RX 中断大约每 110kHz–140kHz 触发一次。

每次发生 DMA RX 中断时、都会执行一个简单的过程:使用 GPIO 控制 CS 线路以选择下一个 SPI 从通道、然后再次触发 DMA。

在 PWM 中断内、我使用 SDFM 从四个通道读取数据。
之后、我访问 DMA RX 缓冲区。
此时、SDFM 数据偶尔会定期读取为 0、例如每 4、7 或 24 个周期读取一次。

我怀疑这个问题可能是由于 DMA 和 CPU 同时访问同一存储器总线造成的。
我尝试通过按如下方式重新定位内存区域来解决问题、但问题仍然存在:

  • DMA TX 缓冲器→ RAMGS0

  • DMA RX 缓冲器→ RAMGS1

  • SDFM 数据缓冲器→μ s RAMLS4

您能否告知根本原因、并分享任何潜在的解决方案?

谢谢你。

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

    您好、

    我不遵循您的应用程序和所需的配置。 如何结合使用 DMA、SPI 和 SDFM?  RAMLS4 也无法由 DMA 访问。

    PWM 中断以 50kHz 的频率发生、而 DMA RX 中断大约每 110kHz–140kHz 触发一次。

    这些频率是否由于某种原因需要同步(或不同步)?

    此时、SDFM 数据偶尔会定期读取为 0、例如每 4、7 或 24 个周期读取一次。

    SDFM 是由 PWM 复位还是由其他方式复位? 您是否可以验证是否存在要读取的新数据?

    此致、

    Kevin

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

    您好:
    DMA 不访问 RAMLS。
    在上述设置中、DMA 被分配给 RAMGS0 和 RAMGS1。
    SDFM 配置为由 PWM11 和 PWM12 触发、并使用 PWM11 (50kHz) 中断。
    由于 Sync3 和 OSR 设置为 128、因此转换会在 50kHz 中断发生之前完成。
    因此、当 PWM11 中断被触发时、SDFM 已经完成了转换、并且存储在中的值Sdfm1Regs.SDDATA1.all被读入变量sdfm_data
    我尝试sdfm_data在 RAMLS4 中放置。
    这是为了测试问题是否与 RAM 区域有关、但问题没有得到解决。

    DMA 频率与 PWM 频率不同步。
    使用 10MHz 时钟发送和接收 6 个数据字。
    这是为了解释 DMA 工作频率并不一致、因为优先考虑 PWM 中断工作负载。

    DMA 当前配置为突发= 5、传输= 5 且 SPI FIFO = 6。
    当配置为突发= 0、传输= 0 且 SPI FIFO = 1 时、SDFM 在特定周期读取为零的问题会消失。

    其他测试结果如下:

    1. 当 DMA 停止时、SDFM 读数都是正常的(每 50kHz 一次)。

    2. 在 DMA 运行期间、如果从 DMA RX 缓冲器读取的行被注释掉、则读数正常(首先读取 SDFM、随后访问 RX 缓冲区)。

    3. 在 DMA 操作期间、如果读取与 DMA 无关的测试全局变量缓冲区、则在特定周期中会出现零值。

    4. 将 DMA TX 和 RX 缓冲器分离到 RAMGS0 和 RAMGS1、并将存储 SDFM 寄存器数据的变量放置到 RAMLS4 中、不能解决该问题。

    5. 当 DMA 突发= 5、传输= 5 且 SPI FIFO = 6 时、在特定周期读取零值。

    6. 当 DMA 突发= 0、传输= 0 且 SPI FIFO = 1 时、SDFM 读数是正常的。

    若要访问相同的资源、只有 CPU 和 CLA 可以与 DMA 争用。
    在 CPU 和 DMA 之间、优先级由硬件仲裁器使用轮循逻辑进行仲裁。
    在 CLA 和 DMA 之间、通过用户多路复用器配置确定优先级。
    因此、应该与 SDFM 没有关系、这使得这个问题非常奇怪。

    如果上述行为与中断服务例程中的处理顺序一致、
    则在以下情况下:

    “在 DMA 运行期间、如果对 DMA RX 缓冲器的行读取被注释掉、则 SDFM 读数正常“、
    首先会处理 SDFM 结果读取、而注释掉后续步骤会使先前的错误消失。 该器件很难理解。
    我假设 SDFM 和 DMA 之间没有硬件级相关性 — 这一假设是否会错误?

    由于时差、如果您能完全理解我的问题并列出您能想到的所有潜在原因、我将不胜感激。
    我将执行所有建议的测试、然后返回给您并提供结果。
    非常感谢您为快速解决问题提供的帮助。

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

    您好、

    SDFM 或 DMA 是否可能出现下溢情况? 在新数据到达之前从存储器空间读取的数据? 不同步的行为甚至可能导致这种情况。

    此致、

    Kevin