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.

[参考译文] MSP430FR5994:DMA 配置

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/978068/msp430fr5994-dma-configuration

器件型号:MSP430FR5994

你(们)好

你好。

我们的客户在使用带有 SPI 的 DMA 从从从器件读取多字节时遇到问题。 他们正在尝试使用 DMA 从 ADXL362进行 SPI 突发读取、并将 DMA 配置 为与 RXbuffer 配合使用并发送读取指令、但没有使 DMA 正常工作。

这是 DMA 配置。




  这是 ISR:

SPIconfiguration




以下是运行 DMA 代码时逻辑分析仪的屏幕截图。 读取指令被发送到 ADXL362、但是没有接收到任何内容。 DMA 配置是否错误?



感谢您的帮助。

此致、
卡洛

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

    在 SPI 主器件中、必须向 TXBUF 馈送某个数据、才能使 SPI 时钟运行。 该代码提供一个字节、因此时钟仅运行一个字节。

    对于 SPI+DMA,通常使用第二个 DMA 通道为 Tx 侧供电-- DMASZ 相同,但 SRCINCR=0重复发送相同(虚拟)字节。  

    遗憾的是、在 FR5994中、UCB1-3对 Tx 和 Rx 使用相同的 DMA 通道、因此存在冲突[参考数据表(SLASE54C)表6-11]。 如果可以改用 UCB0或 UCA0-3之一、这将是最简单的解决方案。 此处概述了另一种使用计时器的解决方案:

    https://e2e.ti.com/support/microcontrollers/msp430/f/166/p/971225/3588909

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

    我们的客户使用 UCB0实现带有 DMA 的 SPI、因为 UCB1-3对 Tx 和 Rx 使用相同的 DMA 通道、这会导致冲突、并且我们的客户不希望使用计时器 在 Rx 和 Tx 之间进行切换。 现在、他们可以从 ADXL362加速计读取156个字节、但他们所面临的问题是、在接收到156个字节后、MCU 永远不会唤醒。  LPM0用于等待传输完成、它们不知道 DMA 配置是否错误或 DMA ISR 是问题所在。
    以下是 SPI 配置:
    以下是我调用的函数,用于读取配置了两个 DMA 通道的156个字节 :
    这是 ISR:
    感谢您的任何帮助。

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

    我不想指出(原谅我的不满)这里需要修复的所有问题、而是建议您从另一个线程中的代码中大量借用。 尽管使用异常、但它主要是标准 SPI+DMA 设置;唯一不寻常的是触发。

    对于本例中的触发:除了 DMACTL0设置外、还必须处理 TXIFG。 有两种方法:

    1) 1)使用 DMALEVEL=1。 其效果是在(Tx 侧) DMAEN 被置位时启动 DMA、因为 TXIFG=1已经被置位。

    2) 2)使用 DMALEVEL=0、并发送第一个字节、直接写入 TXBUF。 为了实现这一目的、您需要(a)在 Tx 侧 DMAEN 被设定后只执行一次(b)同时将(初始) Tx 侧 DMASZ 递减一(并根据需要使 Tx 侧 SA 递增)、以考虑直接写入的字节。  

    ----------

    另一个线程使用旋转环路来完成、主要是为了简化演示。 上述 ISR 大部分都可以正常运行、但以下情况除外:

    > IF (DMAIV 和 DMAIV_DMA0IFG)

    DMAIV 包含一个小整数、而不是一个位掩码。 尝试:

    >IF (DMAIV == DMAIV_DMA0IFG)

    和:

    >_BIC_SR_REGISTER_ON_EXIT (LPM0_Bits | GIE);

    这会为中断禁用(GIE=0) main、这可能不是您想要的。 尝试:

    >_BIC_SR_REGISTER_ON_EXIT (LPM0_Bits);