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.
您好,
我正在尝试使用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);
}
非常感谢您的回复。
这可能是问题所在,
购买以某种方式解决了添加单行的问题。 新代码类似于此。
我真的不知道为什么这解决了我的问题。
我的问题是我想使用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);
}