int32_t DRV_SPI_MasterRMReceive8BitISR( struct DRV_SPI_DRIVER_OBJECT * pDrvInstance ) { register SPI_MODULE_ID spiId = pDrvInstance->spiId; register DRV_SPI_JOB_OBJECT * currentJob = pDrvInstance->currentJob; if (currentJob == NULL) { return 0; } if (PLIB_SPI_ReceiverBufferIsFull(spiId)) { /* We have data waiting in the SPI buffer */ if (currentJob->dataLeftToRx != 0) { /* Receive the data and updates the count */ currentJob->rxBuffer[currentJob->dataRxed] = PLIB_SPI_BufferRead(spiId); currentJob->dataRxed++; currentJob->dataLeftToRx --; } else { /* No Data but dummy data: Note: We cannot just clear the buffer because we have to keep track of how many symbols/units we have received, and the number may have increased since we checked how full the buffer is.*/ PLIB_SPI_BufferRead(spiId); //SYS_CONSOLE_MESSAGE("Rd "); currentJob->dummyLeftToRx--; } /* No longer have a symbol in progress */ pDrvInstance->symbolsInProgress = 0; } return 0; }
int32_t DRV_SPI1_BufferAddWriteRead(const void * txBuffer, void * rxBuffer, uint32_t size) { bool continueLoop; int32_t txcounter = 0; int32_t rxcounter = 0; do { continueLoop = false; if(!PLIB_SPI_TransmitBufferIsFull(SPI_ID_2) && txcounter < size) { PLIB_SPI_BufferWrite(SPI_ID_2, ((uint8_t*)txBuffer)[txcounter]); txcounter++; continueLoop = true; } while (txcounter != rxcounter) { while(!PLIB_SPI_ReceiverBufferIsFull(SPI_ID_2)); ((uint8_t*)rxBuffer)[rxcounter] = PLIB_SPI_BufferRead(SPI_ID_2); rxcounter++; continueLoop = true; } if (txcounter > rxcounter) { continueLoop = true; } }while(continueLoop); return txcounter; }
void SPIPut(uint16_t channel, unsigned char data) { // Wait for free buffer while(!PLIB_SPI_TransmitBufferIsEmpty(channel)); PLIB_SPI_BufferWrite(channel, data); // Wait for data byte while(!PLIB_SPI_ReceiverBufferIsFull(channel)); return; }
bool DRV_SPI0_ReceiverBufferIsFull(void) { return (PLIB_SPI_ReceiverBufferIsFull(SPI_ID_4)); }