Good day.
I'm implementing communication for CortexM7 IMX8MP and FPGA via QSPI. I've ported fsl_flexspi and fsl_flexspi_edma from IMX RT family. Then I changed EDMA to SDMA, because realization of EDMA is very different. When I using FLEXSPI_TransferBlocking() method everything works fine. But when I change it to FLEXSPI_TransferSDMA() - I can see CMD, ADDR and then no data and clocks, but CS signal steel in low state:

Here is my SDMA transfering:
/* Prepare transfer. */
SDMA_PrepareTransfer(&xferConfig, (uint32_t)xfer->data, (uint32_t)&base->TFDR[0], (uint32_t)handle->nsize, (uint32_t)handle->nsize, (uint32_t)handle->nbytes,
(uint32_t)xfer->dataSize, 36U, kSDMA_PeripheralNormal, kSDMA_MemoryToPeripheral);
/* Submit transfer. */
SDMA_SubmitTransfer(handle->txSdmaHandle, &xferConfig);
SDMA_SetCallback(handle->txSdmaHandle, FLEXSPI_TransferSDMACallback,
&s_sdmaPrivateHandle[FLEXSPI_GetInstance(base)]);
SDMA_StartTransfer(handle->txSdmaHandle);
/* Enable FLEXSPI TX SDMA. */
FLEXSPI_EnableTxDMA(base, true);
/* Start Transfer. */
base->IPCMD |= FLEXSPI_IPCMD_TRG_MASK;
Device config:
flexspi_device_config_t deviceconfig = {
.flexspiRootClk = 6250000,
.flashSize = FLASH_SIZE,
.CSIntervalUnit = kFLEXSPI_CsIntervalUnit1SckCycle,
.CSInterval = 2,
.CSHoldTime = 3,
.CSSetupTime = 3,
.dataValidTime = 0,
.columnspace = 0,
.enableWordAddress = 0,
.AWRSeqIndex = NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_SINGLE,
.AWRSeqNumber = 1,
.ARDSeqIndex = NOR_CMD_LUT_SEQ_IDX_READ_FAST,
.ARDSeqNumber = 1,
.AHBWriteWaitUnit = kFLEXSPI_AhbWriteWaitUnit2AhbCycle,
.AHBWriteWaitInterval = 0,
};
Page program command:
flashXfer.deviceAddress = dstAddr;
flashXfer.port = kFLEXSPI_PortA1;
flashXfer.cmdType = kFLEXSPI_Write;
flashXfer.SeqNumber = 1;
flashXfer.seqIndex = NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_SINGLE;
flashXfer.data = (uint32_t *)src;
flashXfer.dataSize = FLASH_PAGE_SIZE;
DMA settings:
#define FLEXSPI_DMA (SDMAARM1)
#define FLEXSPI_TX_DMA_CHANNEL (1U)
#define FLEXSPI_RX_DMA_CHANNEL (2U)
SDMA_GetDefaultConfig(&sdmaConfig);
sdmaConfig.ratio = kSDMA_HalfARMClockFreq;
SDMA_Init(FLEXSPI_DMA, &sdmaConfig);
/* Create the SDMA channel handles */
SDMA_CreateHandle(&dmaTxHandle, FLEXSPI_DMA, FLEXSPI_TX_DMA_CHANNEL, &context_Tx);
SDMA_CreateHandle(&dmaRxHandle, FLEXSPI_DMA, FLEXSPI_RX_DMA_CHANNEL, &context_Rx);
dmaTxHandle.priority = 3;
dmaRxHandle.priority = 4;
SDMA_SetChannelPriority(FLEXSPI_DMA, FLEXSPI_TX_DMA_CHANNEL, 3U);
SDMA_SetChannelPriority(FLEXSPI_DMA, FLEXSPI_RX_DMA_CHANNEL, 4U);
LUT table the same as in the nor_flash example in RT family.
Also I see that FLEXSPI_TransferSDMACallback() works.
Could you help me with this issue?
Regards, Stanislav.