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:具有SPI的MSP432 DMA传输

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/658480/msp432p401r-msp432-dma-transfer-with-spi

部件号:MSP432P401R

您好,

我正在尝试使用SPI和DMA传输驱动WS2812 RGB LED。

它的RGB LED基本上需要长脉冲或短脉冲来指定0和1。

我曾尝试研究过DMA传输,但因为很难,所以没能研究。我查看了DriverLib示例,并尝试修改我的问题,但是

仅进行1次传输,然后不执行任何传输。

如果你能帮助我,我会很高兴。 我所写的守则的有关部分附在后。

如果您能告诉我如何了解DMA传输,我将不胜感激

此致

主回路

同时(1)
   {
       WS2812_send (WSBuffer,2); //内部参数目前无法正常工作
       while (dmaDone ==0);
       dmaDone = 0;
   }

dma控制器c文件:

/*
 * WS2812_Driver.c
 *
 * 创建日期:2018年10月22日
 *     作者:Kerem
 */
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>

Const eUSI_SPI_MasterConfig spiMasterConfig =

       EUSCI_B_SPI_CLOCKSOURCE_SMCLK,            // SMCLK时钟源
       1200万,                                  // SMCLK = DCO = 3MHz
       600万,                                   // SPICLK = 500kHz
       EUSCI_B_SPI_MSB_FIRST,                    // MSB FIRST
       EUSCI_B_SPI_PHASE DATA_Captured_ONFIRST_Changed_ON_NEXT   ,//相位
//       EUSCI_B_SPI_PHASE DATA_Captured_ONFIRST_Changed_on_NEXT,
       EUSCI_B_SPI_CLOCKPOLARITY_INactivity LOW,//高极性
//       EUSCI_B_SPI_CLOCKPOLARITY_INLEATE_LOW,
       EUSCI_B_SPI_3引脚                          // 3线SPI模式
};

/* DMA控制表*/
#pragma data_align(MSP_EXP432P401RLP_DMAControlTable, 1024)
静态DMA_ControlTable MSP_EXP432P401RLP_DMAControlTable[32];

UINT8_t mstxData[26]="您好,这是主SPI";
#define MAP_SPI_MSG_LENGTH   26.
uINT8_t dmaDone = 0;

void WS2812_init()

   SPI_INITMASTER(EUSI_B0_base,&spiMasterConfig);       /*在3Wire主模式下配置SPI */
   SPI_enableModule(EUSI_B0_BASE;                       /*启用SPI模块*/

   SPI_clearInterruptFlag (EUSI_B0_BASE,EUSI_SPI_Receive_interrupt + EUSI_SPI_Transmit_interrupt);

   GPIO _setAsPeripheralModuleFunctionOutputPin (GPIO_PORT_P1, GPIO _PIN5, GPIO _PRIMARY_MODULE_FUNCTION ); //为1.5 EUSCI_B0_SPI_I2C EUSCI_B0_SPI_I2C.CLK配置WFP
   GPIO _setAsPeripheralModuleFunctionOutputPin (GPIO_PORT_P1, GPIO _PIN6, GPIO _primary_module_function); //为1.6 EUSCI_B0_SPI_I2C EUSCI_B0_SPI_I2C.SIMO配置WFP
   GPIO _setAsPeripheralModuleFunctionInputPin (GPIO_PORT_P1, GPIO _PIN7, GPIO _primary_module_function); //为1.7 EUSCI_B0_SPI_I2C EUSCI_B0_SPI_I2C.SOMI配置WFP

   GPIO _setOutputLowOnPin (GPIO端口P5,GPIO _PIN7);
   GPIO _setAsOutputPin (GPIO端口P5,GPIO _PIN7);

   dma_enableModule();
   DMA_setControlBase (MSP_EXP432P401RLP_DMAControlTable);

   DMA_assignChannel (DMA_CH0_EUSCIB0TX0);

   DMA_setChannelControl(DMA_CH0_EUSCIB0TX0 | UDMA_PRI_SELECT,
                         UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_1);
   DMA_setChannelTransfer (DMA_CH0_EUSCIB0TX0 | UDMA_PRI_SELECT,
                         udma_mode_basic,mstxData,
                         (void *) MAP_SPI_getTransmitBufferAddressForDMA(EUSI_B0_BASE),
                         MAP_SPI_MSG_LENGTH);

   DMA_assignInterrupt (INT_DMA_INT1,0);
   DMA_clearInterruptFlag (DMA_CH0_EUSCIB0TX0);

   interrupT_enableInterrupt (INT_DMA_INT1);
   DMA_enableInterrupt (INT_DMA_INT1);

   dmaDone = 0;

}

void DMA_INT1_IRQHandler(void)

   DMA_clearInterruptFlag(0);
   dma_disableChannel(0);

   /*禁用中断以允许执行*/
//   Interrupt_DisableInterrupt (INT_DMA_INT0);
   DMA_disableInterrupt (INT_DMA_INT1);
   dmaDone = 1;
}

void WS2812_send (uint8_t* buff,uint8_t bc)

   uINT8_t i;
   interrupT_enableInterrupt (INT_DMA_INT1);
   DMA_enableInterrupt (INT_DMA_INT1);

   dma_enableChannel(0);
   EUSCI_B_SPI_clearInterruptFlag (EUSCI_B0_BBASE,EUSCI_B_SPI_Transmit_Interrupt);
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Kerem,
    我认为问题是运作的次序。 启用SPI模块,然后清除TX IFG,但不会向SPI模块发送字节。 如果向模块发送一个字节,则一旦发送,TXIFG将被设置为触发DMA。 我不完全理解您关于发送一个字节的评论,因此可能我错过了一些东西。 我建议将SPI模块的启用移动到配置DMA之后。 一旦启用SPI,TXIFG将自动设置,从而触发DMA。 请参见此处的示例:

    e2e.ti.com/.../191.5568万

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

    非常感谢您的回复。

    这可能是问题所在,
    购买以某种方式解决了添加单行的问题。 新代码类似于此。
    我真的不知道为什么这解决了我的问题。
    我的问题是我想使用DMA发送字节。 但我只能发送字节1。
    void WS2812_send (uint8_t* buff,uint16_t bc)

    uINT8_t i;
    interrupT_enableInterrupt (INT_DMA_INT1);
    DMA_enableInterrupt (INT_DMA_INT1);
    DMA_setChannelTransfer(DMA_CH0_EUSCIB0TX0| UDMA_PRI_SELECT,<==此单线解决了问题
    udma_mode_basic,buff,//mstxData,
    (void *) MAP_SPI_getTransmitBufferAddressForDMA(EUSI_B0_BASE),
    bc);//MAP_SPI_MSG_LENGTH);
    dma_enableChannel(0);
    EUSCI_B_SPI_clearInterruptFlag (EUSCI_B0_BBASE,EUSCI_B_SPI_Transmit_Interrupt);
    }