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.

[参考译文] MSP432P401R:由外部 ADC 数据触发的 DMA 外部触发准备就绪(&T);SPI 启动

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/593830/msp432p401r-dma-external-trigger-by-external-adc-data-ready---spi-starts

器件型号:MSP432P401R

您好!

是否有任何 外部 DMA 输入引脚"DMAE0"启动 SPI 通信的示例?

我想将外部24位 ADC 与 MSP432配合使用。

来自 ADC 的中断引脚"数据就绪"应该触发 DMAE0通道上的 DMA。

触发 DMA 后、应使用新数据开始 SPI 传输、并将值写入缓冲器。

如果缓冲区值大小已达到、DMA 应唤醒 CPU。

有一个使用内部14位 ADC 的示例、其中 DMA 写入512大小的缓冲区。

但如何将其用于外部 ADC?  

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

    Michael、

      我不知道有一个示例说明了您所描述的集成和协调级别。  其理念是、您可以获取现有示例并创建您描述的应用。

      您所描述的是集成三个单独的 DMA 通道。  第一个将是映射到源7的通道6、第二个将是 SPI 发送器(MOSI)、它可以位于任何通道 0、2、4 (但不是6、因为您需要用于 IO 触发器)、第三个将用于 SPI 接收器(MISO)、通道1、3、5。  所有这些都将配置为"基本"操作模式、这意味着需要相应的触发器才能发生 DMA 操作。  

      第一个 DMA DMAE0具有 SPI 发送缓冲器的源目标和存储器中某个位置的源目标、具有虚拟值。  SPI 事务仅在写入 TX 缓冲区时启动、因此即使只读取数据、也有必要访问 TX。  此事务仅发生一次且已完成、因此源寄存器或目的寄存器不会递增。  根据您的应用、只需 GPIO 中断即可将奇异字写入发送缓冲区、这可能会更简单。  您可以将此 DMA 通道映射到中断、但这不是必需的。

     第二个 DMA 通道是在 TX 缓冲区为空(TXIFG 置位)时重复向 TX 缓冲区写入。  由于第一个传输由第一个 DMA 通道完成、因此传输数量为512-1。  同样、写入 TX 缓冲区的值是无关的、因此源地址和目标地址都不会递增。

     第三个 DMA 实际上获取接收到的数据并将其放置在缓冲区中。  请注意、DMA 大小是8位 SPI 缓冲器的大小。  这意味着您实际上需要对 SPI TX 进行1536次写入以获取24位数据。  在该实现中、您将递增目的地址、而不是源地址、并且在传输完所有数据后、您需要将数据串联为原始24位值。  

     下面的示例适用于通道0和1的 eUSCIB0。

      /*设置 TX 传输特性和缓冲器*/

      MAP_DMA_setChannelControl (DMA_CH6_EXTERNALPIN | UDMA_PRI_SELECT、

      UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_NONE | UDMA_ARB_1);

      MAP_DMA_setChannelTransfer (DMA_CH6_EXTERNALPIN | UDMA_PRI_SELECT、

      UDMA_MODE_BASIC、mstxDummyData、

          (空*) MAP_SPI_getTransmitBufferAddressForDMA (EUSCI_B0_BASE)、

          1);

      /*设置 TX 传输特性和缓冲器*/

      MAP_DMA_setChannelControl (DMA_CH0_EUSCIB0TX0 | UDMA_PRI_SELECT、

      UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_NONE | UDMA_ARB_1);

      MAP_DMA_setChannelTransfer (DMA_CH0_EUSCIB0TX0 | UDMA_PRI_SELECT、

      UDMA_MODE_BASIC、mstxDummyData、

          (空*) MAP_SPI_getTransmitBufferAddressForDMA (EUSCI_B0_BASE)、

          MAP_SPI_MSG_LENGTH-1);

      /*设置 RX 传输特性和缓冲器*/

      MAP_DMA_setChannelControl (DMA_CH1_EUSCIB0RX0 | UDMA_PRI_SELECT、

      UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | UDMA_ARB_1);

      MAP_DMA_setChannelTransfer (DMA_CH1_EUSCIB0RX0 | UDMA_PRI_SELECT、

      UDMA_MODE_BASIC、

          (空*) MAP_SPI_getReceiveBufferAddressForDMA (EUSCI_B0_BASE)、

          msrxData、

          MAP_SPI_MSG_LENGTH);

    此致、

    Chris

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

    必须通过 IRQ (如果处于睡眠状态、则唤醒 MCU)

    有一个 MSP 竞争对手 完全符合 您所描述的内容:外设反射系统
    这位 销售汽车保险的蜥蜴的表亲。

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

    感谢您的回答!
    DMAE0不支持 SPI TX、因为我只能将 HIM 用作 INT 来设置 DMA 以写入 SPI TX 缓冲器。
    那么、是否有任何其他方法可以在不需要 CPU 的情况下通过外部触发 SPI TX 和 RX?

    下面是 DMAE0设置和 ADC14设置、用于接收和传输所有字节:

    /*配置 DMA 模块*/
    DMA_enableModule();
    DMA_setControlBase (controlTable);


    DMA_disableChannelAttribute (DMA_CH7_ADC14、
    UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
    UDMA_ATTR_HIGH_PRIOR|
    UDMA_ATTR_REQMASK);


    /*设置控制索引。 在本例中、我们将设置的源
    * DMA 传输到 ADC14存储器0
    *和目标到
    *目的数据数组。 *
    MAP_DMA_setChannelControl (UDMA_PRI_SELECT | DMA_CH7_ADC14、
    UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1);
    MAP_DMA_setChannelTransfer (UDMA_PRI_SELECT | DMA_CH7_ADC14、
    UDMA_MODE_pingpong、(void*)&ADC14->MEM[0]、
    data_array1、sample_length);

    MAP_DMA_setChannelControl (UDMA_ALT_SELECT | DMA_CH7_ADC14、
    UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1);
    MAP_DMA_setChannelTransfer (UDMA_ALT_SELECT | DMA_CH7_ADC14、
    UDMA_MODE_pingpong、(void*)&ADC14->MEM[0]、
    data_array2、sample_length);

    /*分配/启用中断*/
    MAP_DMA_赋 值中断(DMA_INT1、7);
    MAP_Interrupt_enableInterrupt (INT_DMA_INT1);
    MAP_DMA_赋 值通道(DMA_CH7_ADC14);
    MAP_DMA_clearInterruptFlag (7);
    MAP_Interrupt_enableMaster();

    /*现在 DMA 已启动并已设置,从而启用通道。 ADC14
    *硬件应接管并传输/接收所有字节*/
    MAP_DMA_enableChannel (7);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Michael、
    在最后一个 DMA (与 RX 相关的 DMA)完成之前、我尝试描述的序列不需要任何 CPU 交互。 此时、您需要重新配置所有 DMA 以执行另一个 SPI 接收。

    我没有注意到邮件大小大于1024、因此您需要使用乒乓方法而不是基本方法。 这意味着您将为与 RX 相关的 DMA 另外设置一个中断。 第一个中断与主修整相关联、第二个中断与副中断相关联。 该备选器件的完成将表示 SPI 事务的完成。

    只需重申一下:第一个 DMA 由实际的 GPIO DMAE0触发、当第一个 DMA 写入 eusci TX 缓冲区时、这将触发第二个 DMA 向 TX 缓冲区写入"n1"次(每次 TX 缓冲区移出时)、 发生这种情况时、eusci RX 会触发第三个 DMA、该 DMA 的读取次数为"n"次。 在第三个 DMA 执行"n"个传输后、可以使用中断来唤醒 CPU 以处理接收到的数据或复位 DMA。

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

    尊敬的 Chris:

    似乎是个好主意! 我们还在寻找一种从2个 SPI 从外设接收数据的方法。 那么、将使用6个 DMA 通道?

    然而、当 SPI 从设备外设不连续传输数据时、仍然存在一个问题。 如果每个数据传输之间有一些间隔、会怎么样? 在这种情况下,由于第二个 DMA 通道 持续虚拟 TX,第三个 DMA 通道将接收到错误的数据。 您对此问题有什么看法吗?

    此致