Kinetis MKV11Z128VFM7 dspi edma slave, jumbled data, sdk 2.2.0

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Kinetis MKV11Z128VFM7 dspi edma slave, jumbled data, sdk 2.2.0

Jump to solution
1,363 Views
eriklidgren123
Contributor I

Hi

I've a MKV11Z128VFM7 that I want to use as a spi slave. I'm trying to get edma and dspi to work, but the data is jumbled.

E.g I received:

1A, 1C, 1D, 1E, 1F, 20, 21, 1E, 22, 1F, 23, 20, 24, 21, 25, 22, 15

When the master sent:

15, 16, 17, 18, 19, 1A, 1B, 1C, 1D, 1E, 1F, 20, 21, 22, 23, 24, 25

Same in the other direction, data comes out different from what's in the transmit buffer.

Spi without dma is working, using the function DSPI_SlaveTransferNonBlocking. Data is sent and received correctly.

Here is my init code. Have I missed something or am I using it wrong?

dspi_slave_edma_handle_t spiHandle;
edma_handle_t g_spiTxDmaHandle;
edma_handle_t g_spiRxDmaHandle;
dspi_transfer_t xfer;
edma_config_t edmaConfig;

#define SPI_TX_DMA_CHANNEL 3
#define SPI_RX_DMA_CHANNEL 0

#define SPI_TX_DMA_REQUEST (kDmaRequestMux0SPI0Tx)
#define SPI_RX_DMA_REQUEST (kDmaRequestMux0SPI0Rx)

uint8_t testdata[17] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};

void init(void)
{

// Sets up the DMA.
DMAMUX_Init(DMAMUX0);
DMAMUX_SetSource(DMAMUX0, SPI_TX_DMA_CHANNEL, SPI_TX_DMA_REQUEST);
DMAMUX_EnableChannel(DMAMUX0, SPI_TX_DMA_CHANNEL);
DMAMUX_SetSource(DMAMUX0, SPI_RX_DMA_CHANNEL, SPI_RX_DMA_REQUEST);
DMAMUX_EnableChannel(DMAMUX0, SPI_RX_DMA_CHANNEL);

/* EDMA init */
/*
* userConfig.enableRoundRobinArbitration = false;
* userConfig.enableHaltOnError = true;
* userConfig.enableContinuousLinkMode = false;
* userConfig.enableDebugMode = false;
*/
EDMA_GetDefaultConfig(&edmaConfig);
EDMA_Init(DMA0, &edmaConfig);

/* Slave config */
slaveConfig.whichCtar = kDSPI_Ctar0;
slaveConfig.ctarConfig.bitsPerFrame = 8;
slaveConfig.ctarConfig.cpol = kDSPI_ClockPolarityActiveHigh;
slaveConfig.ctarConfig.cpha = kDSPI_ClockPhaseFirstEdge;
slaveConfig.enableContinuousSCK = false;
slaveConfig.enableRxFifoOverWrite = false;
slaveConfig.enableModifiedTimingFormat = false;
slaveConfig.samplePoint = kDSPI_SckToSin0Clock;
DSPI_SlaveInit(DSPI_INSTANCE, &slaveConfig);


/* Creates the DMA handle. */
memset(&(g_spiTxDmaHandle), 0, sizeof(g_spiTxDmaHandle));
memset(&(g_spiRxDmaHandle), 0, sizeof(g_spiRxDmaHandle));
EDMA_CreateHandle(&g_spiTxDmaHandle, DMA0, SPI_TX_DMA_CHANNEL);
EDMA_CreateHandle(&g_spiRxDmaHandle, DMA0, SPI_RX_DMA_CHANNEL);
DSPI_SlaveTransferCreateHandleEDMA(SPI0, &spiHandle, DSPI_EDMASlaveUserCallback, NULL, &g_spiTxDmaHandle, &g_spiRxDmaHandle);

// Prepares to send.
xfer.txData = testdata;//(uint8_t*)&txSpiPacket;
xfer.rxData = (uint8_t*)&rxSpiPacket;
xfer.dataSize = SPI_BUFFER_SIZE;
xfer.configFlags = kDSPI_SlaveCtar0;
// Sends out.
DSPI_SlaveTransferEDMA(SPI0, &spiHandle, &xfer);

}

Best regards

Erik

0 Kudos
1 Solution
1,186 Views
jingpan
NXP TechSupport
NXP TechSupport

Dear Erik Lidgren, 

There is an example in KV11 SDK "frdmkv11z_driver_examples_dspi_edma_b2b_transfer_slave". It's very similar to your case. Have you tried it?


I found line 463 in your code is "DSPI_SlaveTransferCreateHandleEDMA(SPI0, &spiHandle, DSPI_EDMASlaveUserCallback, NULL, &g_spiTxDmaHandle, &g_spiRxDmaHandle);"

But the definition of the function is

          void DSPI_SlaveTransferCreateHandleEDMA(SPI_Type *base,
                                        dspi_slave_edma_handle_t *handle,
                                        dspi_slave_edma_transfer_callback_t callback,
                                        void *userData,
                                        edma_handle_t *edmaRxRegToRxDataHandle,
                                        edma_handle_t *edmaTxDataToTxRegHandle)

Maybe you should exchange the last two parameters.

 

Regards

View solution in original post

0 Kudos
2 Replies
1,186 Views
eriklidgren123
Contributor I

Hi Jing

Thank you, I think you answered me on my support ticket too. Sorry, I've been busy so I didn't answer back.

Regards

Erik

0 Kudos
1,187 Views
jingpan
NXP TechSupport
NXP TechSupport

Dear Erik Lidgren, 

There is an example in KV11 SDK "frdmkv11z_driver_examples_dspi_edma_b2b_transfer_slave". It's very similar to your case. Have you tried it?


I found line 463 in your code is "DSPI_SlaveTransferCreateHandleEDMA(SPI0, &spiHandle, DSPI_EDMASlaveUserCallback, NULL, &g_spiTxDmaHandle, &g_spiRxDmaHandle);"

But the definition of the function is

          void DSPI_SlaveTransferCreateHandleEDMA(SPI_Type *base,
                                        dspi_slave_edma_handle_t *handle,
                                        dspi_slave_edma_transfer_callback_t callback,
                                        void *userData,
                                        edma_handle_t *edmaRxRegToRxDataHandle,
                                        edma_handle_t *edmaTxDataToTxRegHandle)

Maybe you should exchange the last two parameters.

 

Regards

0 Kudos