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.

CC3200MODLAUNCHXL: SPI DMA on master side

Part Number: CC3200MODLAUNCHXL

Hello -

I am having trouble getting the master side of the SPI working using DMA.  In my code, I have a user provide input which then gets sent over SPI to the slave device.  Unfortunately, my code hangs after it sends the data over SPI since an interrupt never occurs (the interrupt flag used is SPI_INT_EOW).  The slave device has registers which can be accessed via SPI and all I want to do is read and write to those registers using DMA on the master side.  I do not know if anything is actually happening because my code hangs.

static void IntHandler()
{
  unsigned long ulStatus;
 
  ulStatus = MAP_SPIIntStatus(GSPI_BASE,true);

  MAP_SPIIntClear(GSPI_BASE,SPI_INT_EOW);
 
  MAP_SPICSDisable(GSPI_BASE);
 
  transfer_status = 1;
 
 if (!(ulStatus & SPI_INT_EOW)) {
  Report("\n\rError: Unexpected SPI interrupt!");
 }

}

And in my main funcution:

  //
  // Reset SPI
  //
  MAP_SPIReset(GSPI_BASE);
 
  //
  // Configure SPI interface
  //
  MAP_SPIConfigSetExpClk(GSPI_BASE,MAP_PRCMPeripheralClockGet(PRCM_GSPI),
                     SPI_IF_BIT_RATE,SPI_MODE_SLAVE,SPI_SUB_MODE_0,
                     (SPI_HW_CTRL_CS |
                     SPI_4PIN_MODE |
                     SPI_TURBO_OFF |
                     SPI_CS_ACTIVELOW |
                     SPI_WL_32));
     
  SPIFIFOEnable(GSPI_BASE, SPI_RX_FIFO|SPI_TX_FIFO);
  SPIWordCountSet(GSPI_BASE,TR_BUFF_SIZE);
  SPIFIFOLevelSet(GSPI_BASE,AFL,AFL);

  //
  // Initialize UDMA
  //
  UDMAInit();
     
  MAP_uDMAChannelAssign(UDMA_CH30_GSPI_RX);
  MAP_uDMAChannelAssign(UDMA_CH31_GSPI_TX);
 
  MAP_uDMAChannelControlSet(UDMA_CH30_GSPI_RX | UDMA_PRI_SELECT,UDMA_SIZE_32 |
            UDMA_SRC_INC_NONE |
            UDMA_DST_INC_32 |
            UDMA_ARB);
  MAP_uDMAChannelEnable(UDMA_CH30_GSPI_RX);
        
  MAP_uDMAChannelControlSet(UDMA_CH31_GSPI_TX,UDMA_SIZE_32 |
            UDMA_SRC_INC_32 |
            UDMA_DST_INC_NONE |
            UDMA_ARB);
  MAP_uDMAChannelEnable(UDMA_CH31_GSPI_TX);

  SPIDmaEnable(GSPI_BASE,SPI_RX_DMA | SPI_TX_DMA);
 
  //
  // Enable Interrupts
  //
  MAP_SPIIntEnable(GSPI_BASE,SPI_INT_EOW);

  //
  // Enable SPI for communication
  //
  MAP_SPIEnable(GSPI_BASE);
 
  //
  // Register Interrupt Handler
  //
  MAP_SPIIntRegister(GSPI_BASE,IntHandler);

  while (1) {
 transfer_status = 0;
 ulUserData = 0;
 ulUserData2 = 0;
 User = UserInput();
 ulUserData = ((User.addr&0xFFF) << 12) | ((User.readwrite&0x1) << 11) | ((User.data >> 8)&0xFF);
 ulUserData2 = ulUserData2 | User.data << 24;
 g_ucTxBuff[0] = ulUserData;
 g_ucTxBuff[1] = ulUserData2;
 Report("\n\rSending over SPI: %08x%02x", ulUserData, User.data&0xFF);

 ulModeP = MAP_uDMAChannelModeGet(UDMA_CH30_GSPI_RX | UDMA_PRI_SELECT);
 if (ulModeP == UDMA_MODE_STOP) {
  MAP_uDMAChannelTransferSet(UDMA_CH30_GSPI_RX | UDMA_PRI_SELECT,UDMA_MODE_BASIC,
        (void *)(GSPI_BASE + MCSPI_O_RX0),
        g_ucRxBuffA,
        TR_BUFF_SIZE);
  Report("\n\rData from A: %x",g_ucRxBuffA[TR_BUFF_SIZE-1]);
  MAP_uDMAChannelEnable(UDMA_CH30_GSPI_RX);
 }
 
 ulModeTX = MAP_uDMAChannelModeGet(UDMA_CH31_GSPI_TX | UDMA_PRI_SELECT);
 if (ulModeTX == UDMA_MODE_STOP) {
  MAP_uDMAChannelTransferSet(UDMA_CH31_GSPI_TX,UDMA_MODE_BASIC,
        (void *)g_ucTxBuff,
        (void *)(GSPI_BASE + MCSPI_O_TX0),
        TR_BUFF_SIZE);
  Report("\n\rData sent");
  MAP_uDMAChannelEnable(UDMA_CH31_GSPI_TX);
 }
 
 MAP_SPICSEnable(GSPI_BASE);
 
 while (!transfer_status) {}
 
  }

Thanks!