您好!
是否有任何 外部 DMA 输入引脚"DMAE0"启动 SPI 通信的示例?
我想将外部24位 ADC 与 MSP432配合使用。
来自 ADC 的中断引脚"数据就绪"应该触发 DMAE0通道上的 DMA。
触发 DMA 后、应使用新数据开始 SPI 传输、并将值写入缓冲器。
如果缓冲区值大小已达到、DMA 应唤醒 CPU。
有一个使用内部14位 ADC 的示例、其中 DMA 写入512大小的缓冲区。
但如何将其用于外部 ADC?
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.
您好!
是否有任何 外部 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