Part Number: MSP430FR6043
Hi!
My environment:
MSP430FR6043
Launchpad CC1352R1
CCS: 10.1
MSP SDK: 3.80.10.09
CC SDK: 4.40.04.04
Problem:
I'm traying to using SPI with DMA on MSP430FR6043 to get higher transmit frequency. MSP is connected to CC1352R1 which is Master. Everything works fine until I set SPI frequency to 1 MHz or higher, transmit data on MSP (MISO) started to be shifted/delayed (something like that). As a result not all data is transmitted and I never get interrupt from DMA.
Example setup: SPI is set to 2MHz, DMA transmit and receive channels are set to 6 byte length. Data is 6 byte: 0x2, 0x0, 0x09, 0x0, 0xF6, 0xFF. As you can see SPI transmitted same byte two times.
Here is my SPI and DMA configuration, at beginning I setup everything:
EUSCI_A_SPI_initSlaveParam spiParam = { 0 };
spiParam.msbFirst = EUSCI_A_SPI_MSB_FIRST;
spiParam.clockPhase = EUSCI_A_SPI_PHASE_DATA_CAPTURED_ONFIRST_CHANGED_ON_NEXT;
spiParam.clockPolarity = EUSCI_A_SPI_CLOCKPOLARITY_INACTIVITY_LOW;
spiParam.spiMode = EUSCI_A_SPI_4PIN_UCxSTE_ACTIVE_LOW;
EUSCI_A_SPI_initSlave(EUSCI_A0_BASE, &spiParam);
EUSCI_A_SPI_select4PinFunctionality(EUSCI_A0_BASE, EUSCI_A_SPI_ENABLE_SIGNAL_FOR_4WIRE_SLAVE);
DMA_initParam dmaRxParam = {
.channelSelect = DMA_CHANNEL_0,
.transferModeSelect = DMA_TRANSFER_SINGLE,
.triggerSourceSelect = DMA_TRIGGERSOURCE_14,
.transferSize = SPI_FRAME_SIZE, // 6
.transferUnitSelect = DMA_SIZE_SRCBYTE_DSTBYTE,
.triggerTypeSelect = DMA_TRIGGER_RISINGEDGE
};
DMA_initParam dmaTxParam = {
.channelSelect = DMA_CHANNEL_1,
.transferModeSelect = DMA_TRANSFER_SINGLE,
.triggerSourceSelect = DMA_TRIGGERSOURCE_15,
.transferSize = SPI_FRAME_SIZE, // 6
.transferUnitSelect = DMA_SIZE_SRCBYTE_DSTBYTE,
.triggerTypeSelect = DMA_TRIGGER_RISINGEDGE
};
DMA_init(&dmaRxParam);
DMA_init(&dmaTxParam);
before every transfer I reconfigure settings, transfer size and buffers can be changed during program life:
DMA_setTransferSize(DMA_CHANNEL_0, 6); // for example 6 bytes DMA_setTransferSize(DMA_CHANNEL_1, 6); // for example 6 bytes DMA_setSrcAddress(DMA_CHANNEL_0, EUSCI_A_SPI_getReceiveBufferAddress(EUSCI_A0_BASE), DMA_DIRECTION_UNCHANGED); DMA_setDstAddress(DMA_CHANNEL_0, (uint32_t)&rxFrame.data, DMA_DIRECTION_INCREMENT); DMA_setSrcAddress(DMA_CHANNEL_1, (uint32_t)&txFrame.data, DMA_DIRECTION_INCREMENT); DMA_setDstAddress(DMA_CHANNEL_1, EUSCI_A_SPI_getTransmitBufferAddress(EUSCI_A0_BASE), DMA_DIRECTION_UNCHANGED); EUSCI_A_SPI_enable(EUSCI_A0_BASE); DMA_clearInterrupt(DMA_CHANNEL_0); DMA_enableInterrupt(DMA_CHANNEL_0); DMA_enableTransfers(DMA_CHANNEL_0); DMA_enableTransfers(DMA_CHANNEL_1);
and after every transfer completion I disable DMA and SPI:
DMA_disableInterrupt(DMA_CHANNEL_0); DMA_disableTransfers(DMA_CHANNEL_0); DMA_disableTransfers(DMA_CHANNEL_1); EUSCI_A_SPI_disable(EUSCI_A0_BASE);
Is there something that I missed or configured wrong? Until I'm not set frequency to something like 1MHz and higher everything seems to works like a charm, but I want to use at least 4MHz.










