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