Hello all,
I want to configure the CC3200 GSPI module to receive 19 Bytes from a slave device.
I was successful in doing so using GSPI in normal transmit-receive mode.
But i want to do the same using DMA-FIFO mode.
I have used the following configuration and SPI interrupt handler:-
#define RX_BUFF_SIZE 19
//*****************************************************************************
//
//! SPI Master mode main loop
//!
//! This function configures SPI modelue as master and enables the channel for
//! communication
//!
//! \return None.
//
//*****************************************************************************
void Init_SPI_ETH()
{
unsigned long ulUserData;
unsigned long ulDummy;
signed int s32_Fn_LoopCountI;
static char c_Fn_ToggleJ = 0;
//
// Reset SPI
//
MAP_SPIReset(GSPI_BASE);
//
// Configure SPI interface
//
MAP_SPIConfigSetExpClk(GSPI_BASE,MAP_PRCMPeripheralClockGet(PRCM_GSPI),
SPI_IF_BIT_RATE,SPI_MODE_MASTER,SPI_SUB_MODE_1,
(SPI_SW_CTRL_CS |
SPI_4PIN_MODE |
SPI_TURBO_OFF |
SPI_CS_ACTIVELOW |
SPI_WL_8));
/*SPI_SUB_MODE_1 wherein GSPI clock is active-high and sampling occurs on falling edge
i.e. CPOL = 0 and CPHA = 2nd EDGE ~analogus to MCD*/
//
// Enable SPI for communication
//
MAP_SPIEnable(GSPI_BASE);
MAP_SPICSEnable(GSPI_BASE);
//Transfer initialization data of SLAVE device
MAP_SPITransfer(GSPI_BASE,g_ucTxBuff1,g_ucRxBuff1,50,
SPI_CS_ENABLE/*|SPI_CS_DISABLE*/);
MAP_uDMAChannelAssign( UDMA_CH30_GSPI_RX);
//MAP_uDMAChannelAssign( UDMA_CH31_GSPI_TX );
SetupTransfer(UDMA_CH30_GSPI_RX,UDMA_MODE_BASIC,RX_BUFF_SIZE,
UDMA_SIZE_8,UDMA_ARB_1,
(void *)(GSPI_BASE + MCSPI_O_RX0),UDMA_SRC_INC_NONE,
&g_ucRxBuff,UDMA_DST_INC_8);
/*SetupTransfer(UDMA_CH31_GSPI_TX,UDMA_MODE_BASIC,TR_BUFF_SIZE,
UDMA_SIZE_8,UDMA_ARB_1,
&g_ucTxBuff,UDMA_SRC_INC_8,(void *)(GSPI_BASE + MCSPI_O_TX0),
UDMA_DST_INC_NONE);*/
MAP_SPIWordCountSet(GSPI_BASE,RX_BUFF_SIZE);
MAP_SPIFIFOLevelSet(GSPI_BASE,1,19);
MAP_SPIFIFOEnable(GSPI_BASE,SPI_RX_FIFO);
MAP_SPIDmaEnable(GSPI_BASE,SPI_RX_DMA);
//
// Register Interrupt Handler
//
MAP_SPIIntRegister(GSPI_BASE,SPI_IntHandler);
//
// Enable Interrupts
//
MAP_SPIIntEnable(GSPI_BASE, SPI_INT_DMARX);
}
//*****************************************************************************
//
//! SPI Interrupt handler
//!
//! This function is invoked when ASIC SPI has its receive register full or
//! transmit register empty.
//!
//! \return None.
//
//*****************************************************************************
static void SPI_IntHandler()
{
unsigned long ulRecvData;
ulStatus = MAP_SPIIntStatus(GSPI_BASE,true);
MAP_SPIIntClear(GSPI_BASE,SPI_INT_DMARX);
if(ulStatus & SPI_INT_RX_FULL)
{
//COPY DATA FROM FIFO INTO DATA BUFFER
memcpy(Databuffer,g_ucRxBuff,RX_BUFF_SIZE);
}
}
Ideally i should get the spi interrupt after 19 bytes are received from the SLAVE device.
But, i am not getting the spi interrupt.
I have initialized the slave correctly since it works in normal mode (without DMA-FIFO).
Please point-out if i am going wrong anywhere.
Thank you in advance.
Warm regards,
Abhishek.