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.

Concerto SSI DMA RX issue

Hello forum members - 

I'm working with Concerto (F28M35) .  I'm trying to implement uDMA transfers to SDCARD via SS1 channel.

Data transmit with uDMA seems to work OK.  However, in RX I'm getting all zero data in my receive buffer.

Some info I gathered:

1.  When doing non DMA receive (by calling SSIDataGet() function, I'm getting valid data from RX FIFO.

2. The DMA RX transaction is emptying the RX FIFO.  I tried to call SSIDataGet() after end of transaction and got stuck.

3. As I mentioned, the data I'm getting in my target buffer is all zeroes.

Does anybody have idea what is the issue here?

Here is the code for my test:

#pragma DATA_ALIGN(DMAControlTable, 1024)
BYTE DMAControlTable[1024];

BYTE testVec[4] = { 0xFF, 0xFF, 0xFF, 0xFF };
ULONG temp = 0;
BYTE rcv[4] = {0,0,0,0};

SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);
uDMAControlBaseSet(DMAControlTable);
uDMAEnable();

uDMAChannelControlSet(UDMA_CHANNEL_SSI1TX | UDMA_PRI_SELECT,
UDMA_SIZE_8 | UDMA_SRC_INC_8 |
UDMA_DST_INC_NONE | UDMA_ARB_1);
uDMAChannelControlSet(UDMA_CHANNEL_SSI1RX | UDMA_PRI_SELECT,
UDMA_SIZE_8 | UDMA_SRC_INC_NONE |
UDMA_DST_INC_8 | UDMA_ARB_1);

uDMAChannelAttributeDisable(UDMA_CHANNEL_SSI1RX,
UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
UDMA_ATTR_HIGH_PRIORITY | UDMA_ATTR_REQMASK);
uDMAChannelAttributeDisable(UDMA_CHANNEL_SSI1TX,
UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
UDMA_ATTR_HIGH_PRIORITY | UDMA_ATTR_REQMASK);

//uDMAChannelAttributeEnable(SSIHandle[stSDCard].DMAChannelTX, UDMA_ATTR_USEBURST);
//uDMAChannelAttributeEnable(SSIHandle[stSDCard].DMAChannelRX, UDMA_ATTR_USEBURST);


// Configure interrupt
IntDisable(INT_SSI1);
IntRegister(INT_SSI1, SSITestIntHandler);
IntEnable(INT_SSI1);

SSIDMAEnable(SSI1_BASE, SSI_DMA_TX | SSI_DMA_RX);

uDMAChannelTransferSet(UDMA_CHANNEL_SSI1TX | UDMA_PRI_SELECT,
UDMA_MODE_BASIC, (void*)testVec, (void *)(SSI1_BASE + SSI_O_DR),
4);

uDMAChannelTransferSet(UDMA_CHANNEL_SSI1RX | UDMA_PRI_SELECT,
UDMA_MODE_BASIC, (void *)(SSI1_BASE + SSI_O_DR), (void*)&rcv[0],
4);

while(SSIDataGetNonBlocking(SSI1_BASE, &temp))
{
}

uDMAChannelEnable(UDMA_CHANNEL_SSI1TX);
uDMAChannelEnable(UDMA_CHANNEL_SSI1RX);

while (uDMAChannelModeGet(UDMA_CHANNEL_SSI1TX) != UDMA_MODE_STOP);
while (uDMAChannelModeGet(UDMA_CHANNEL_SSI1RX) != UDMA_MODE_STOP);

Thanks,

Tal