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:外部 DMAE0触发 SPI

Guru**** 2387830 points
Other Parts Discussed in Thread: ADS131A02, BOOSTXL-EDUMKII
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/700592/msp432p401r-external-dmae0-trigger-spi

器件型号:MSP432P401R

您好!

我尝试获取外部 DMA 触发器以与外部 ADC (ADS131A02)配合使用。

我正在从 ADS131A02接收 INT、但 DMA 未收到触发信号。  

我的代码是否有任何问题:

#define SAMPLE_LENGTH 512
Int32_t DATA_ARRAY1[SAMPLE_LENGTH];
Int32_t DATA_ARRAY2[SAMPLE_LENGTH];
uint8_t DATA_ARRAY[4]={0x00、0x00、0x00、0x00};
volatile int SWITCH_DATA = 0; 

void ADS131A02_DMASetup (void)
{

//将 DMA 分配给 SPI 通道
DMA_enableModule();
DMA_setControlBase (controlTable);


DMA_assignChannel (DMA_CH0_EUSCIB0TX0);
DMA_assignChannel (DMA_CH1_EUSCIB0RX0);
DMA_assignChannel (DMA_CH6_EXTERNALPIN);

dma_disableChannelAttribute (dma_CH6_EXTERNALPIN、Udma_attr_ALTSELECT | Udma_attr_USEBURST | Udma_attr_high_priority | Udma_attr_REQMASK);

//设置 TX 传输特性和缓冲区
DMA_setChannelControl (DMA_CH6_EXTERNALPIN | UDMA_PRI_SELECT、UDMA_SIZE_32 | UDMA_SRC_INC_NONE | UDMA_DST_INC_32 | UDMA_ARB_1);
DMA_setChannelTransfer (DMA_CH6_EXTERNALPIN | UDMA_PRI_SELECT、UDMA_MODE_BASIC、DATA_ARRAY、(void *) MAP_SPI_getTransmitBufferAddressForDMA (EUSCI_B0_BASE)、4);

DMA_setChannelControl (DMA_CH0_EUSCIB0TX0 | UDMA_PRI_SELECT、UDMA_SIZE_32 | UDMA_SRC_INC_NONE | UDMA_DST_INC_32 | UDMA_ARB_1);
DMA_setChannelTransfer (DMA_CH0_EUSCIB0TX0 | UDMA_PRI_SELECT、UDMA_MODE_BASIC、DATA_ARRAY、(void *) MAP_SPI_getTransmitBufferAddressForDMA (EUSCI_B0_BASE)、3);

DMA_setChannelControl (DMA_CH1_EUSCIB0RX0 | UDMA_PRI_SELECT、UDMA_SIZE 32 | UDMA_SRC_INC_NONE | UDMA_DST_INC_32 | UDMA_ARB_1);
DMA_setChannelTransfer (DMA_CH1_EUSCIB0RX0 | UDMA_PRI_SELECT、UDMA_MODE_PINGONG、(void *) MAP_SPI_getReceiveBufferAddressForDMA (EUSCI_B0_BASE)、DATA_array1、SAMPLE_LENGTH);

DMA_setChannelControl (DMA_CH1_EUSCIB0RX0 | UDMA_PRI_SELECT、UDMA_SIZE 32 | UDMA_SRC_INC_NONE | UDMA_DST_INC_32 | UDMA_ARB_1);
DMA_setChannelTransfer (DMA_CH1_EUSCIB0RX0 | UDMA_PRI_SELECT、UDMA_MODE_PINGONG、(void *) MAP_SPI_getReceiveBufferAddressForDMA (EUSCI_B0_BASE)、DATA_ARRAY2、SAMPLE_LENGTH);

DMA_assignInterrupt (DMA_INT1、6);
DMA_clearInterruptFlag (INT_DMA_INT1);
DMA_clearInterruptFlag (6);

INTERRUPT_enableInterrupt (DMA_INT1);
interrupt_enableMaster();
DMA_enableChannel (6);
DMA_enableChannel (0);
DMA_enableChannel (1);
} 

这里是我的 DMA INT:

void DMA_INT1_IRQHandler (void)
{
DMA_clearInterruptFlag (6);
/*使用 DMA 的交替模式在主缓冲器和备用缓冲器之间切换*/
IF (DMA_getChannelAttribute (6)& UDMA_ATTR_ALTSELECT)
{
DMA_setChannelControl (UDMA_PRI_SELECT | DMA_CH1_EUSCIB0RX0、UDMA_SIZE _32 | UDMA_SRC_INC_NONE | UDMA_DST_INC_32 | UDMA_ARB_1);
DMA_setChannelTransfer (UDMA_PRI_SELECT | DMA_CH1_EUSCIB0RX0、UDMA_MODE_PINGONG、(void*) MAP_SPI_getReceiveBufferAddressForDMA (EUSCI_B0_BASE)、DATA_array1、SAMPLE_LENGTH);
switch_data = 1;
}
其他
{
DMA_setChannelControl (UDMA_ALT_SELECT | DMA_CH1_EUSCIB0RX0、UDMA_SIZE 32 | UDMA_SRC_INC_NONE | UDMA_DST_INC_32 | UDMA_ARB_1);
DMA_setChannelTransfer (UDMA_ALT_SELECT | DMA_CH1_EUSCIB0RX0、UDMA_MODE_PINGONG、(void*) MAP_SPI_getReceiveBufferAddressForDMA (EUSCI_B0_BASE)、DATA_ARRAY2、SAMPLE_LENGTH);
switch_data = 0;
}
} 

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

    查看代码、您似乎希望使用 SPI 与外部 ADC 进行通信、并且无法通过 DMA 配置 SPI。 如果理解正确、您是否参考了以下文件夹中 SimpleLink MSP432P4 SDK 中的示例:./simplelink_msp432p4_SDK_2_20_00_12/examples/nortos/MSP_EXP432P401R/driverlib?

    有两个使用带有 DMA 的 SPI 的示例-"dma_eusci_spi_loopback "和"dma_eusci_spi_s散 射_集中"。

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

    您好、Sai、

    我知道这个示例、并且我已经有具有 DMA 的 SPI 与其他项目一起工作。

    我不太确定的是添加 DMAE0外部引脚来触发 DMA。

    有没有这方面的示例?

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

    我有一个 BOOSTXL-EDUMKII_MicrophoneFFT_MSP432P401R 示例、该示例使用内部14位 ADC、该 ADC 也通过 DMA CH7_ADC14直接触发 DMA。 此示例工作正常、也使用了乒乓模式、但我没有使其成为中断。
    第二步是使用 DMA 发送 SPI 桩模块。
    首先、我必须使 DMA_CH6_EXTERNALPIN 在 DMA_INT1_IRQHandler 处触发中断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我看不到您将 P7.0设置为(备用功能) DMAE0的位置[请参阅 SLAS826G 表6-68。]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bruce、
    对于替代函数、您意味着什么? DMAE0应仅是连接到 ADC INT 的外部引脚。 一旦触发来自 ADC 的 INT、它将触发外部 DMAE0 (引脚7.0)、这将处理 SPI 传输、而无需唤醒 CPU。
    如果 DMA 接收缓冲区有512个值、它应该在读取512个值后点亮 DMA_INT1_IR 来唤醒 CPU。 一旦 CPU 从第一个缓冲区中读取数据、DMA 就会不断读取数据并将其保存到第二个缓冲区中。 (乒乓球)
    我有一个示例、它可以与内部14位 ADC 配合使用、但在这里它使用 DMA_CH7_ADC14来触发 DMA。

    我的问题是 dma_int1_IR 永远不会被调用。 我将缓冲区大小更改为1字节、希望启用 DMA_INT1_IR、但不会启用。 我认为 DMA_CH6_EXTERNALPIN 不能在我的代码或其他内容上正确设置。
    有什么想法吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的想法是、您没有正确设置 P7SELx 来获取 P7.0的 DMAE0替代函数。 MSP432P401R 数据表(SLAS826G、产品页面顶部的链接)中的表6-68 (第148页)对此进行了说明。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bruce、

    我认为我的配置是正确的:

    GPIO_setAsInputPinWithPullUpResistor (GPIO_PORT_P7、GPIO_PIN0);
    
    GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P7、GPIO_PIN0、GPIO_PRIMARY_MODULE_FUNCTION); 

    下表:

    对吧? DMAE0应该只能是一个触发 DMA 的中断。 DMA 完成后、它将唤醒 MCU 并交换阵列。 就是这样。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我没有使用 driverlib、但这就是我使用 driverlib 时的工作方式。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    相关主题和后续讨论可在此处找到:

    e2e.ti.com/.../704661