Tool/software: TI-RTOS
Reposting since I didn't get a response on my query part of another thread.
I managed to get SPI in blocking mode as a slave working, but I'm facing issues when I configure it to work in non-blocking mode.
What's happening is, SPI_Transfer in callback mode doesn't trigger the callback when transfer is completed, Neither is it receiving/transmitting data.
Within the mssInitTask, I initialize DMA and SPI
DMA_Params_init(&dmaParams); gDmaHandle = DMA_open(0, &dmaParams, &errCode); if(gDmaHandle == NULL) { printf("Open DMA driver failed with error=%d\n", errCode); return; }
SPI_Params_init(¶ms); params.mode = SPI_SLAVE; params.dataSize = 8; params.dmaEnable = 1; params.dmaHandle = gDmaHandle; params.u.slaveParams.dmaCfg.txDmaChanNum =1U; params.u.slaveParams.dmaCfg.rxDmaChanNum =0U; params.frameFormat = SPI_POL0_PHA1; params.shiftFormat = SPI_MSB_FIRST; params.pinMode = SPI_PINMODE_4PIN_CS; params.transferMode = SPI_MODE_CALLBACK; params.eccEnable = 1; params.csHold = 1; params.transferCallbackFxn = spiCallback;
And then start the task
Task_Params_init(&spiTaskParams); spiTaskParams.priority = 4; spiTaskParams.stackSize = 3*1024; Task_create(SPITask,&spiTaskParams, NULL); Semaphore_post(SPISem);
I define my callback
void spiCallback(SPI_Handle handle, SPI_Transaction *transaction) { if(transaction->status == SPI_TRANSFER_COMPLETED) { Semaphore_post(SPISem); } return; }
I create a task to perform SPI related stuff
void SPITask(UArg arg0, UArg arg1) { char *msg = "1abcdefghijklmnopqrstuvwxyzDONE2abcdefghijklmnopqrstuvwxyzDONE"; char rx[63]; System_printf("SPI Task Started \n"); spiTransaction.count = (size_t)62; spiTransaction.txBuf = (void*) msg; spiTransaction.rxBuf = (void * )rx; spiTransaction.arg = NULL; spiTransaction.slaveIndex = 0U; while(1){ Semaphore_pend(SPISem, BIOS_WAIT_FOREVER); System_printf("Transfer now\n"); SPI_transfer(handle, &spiTransaction); } }
SPI in blocking mode works fine until the transaction.count goes to beyond 50 bytes, whereafter, SPI_Transfer stops blocking.
In non blocking mode, my callbacks are never called after SPI Transfer is complete. I don't either see signals coming out from the MISO line.