void spi_master_transfer(spi_t *obj, const void *tx, size_t tx_length, void *rx, size_t rx_length, uint8_t bit_width, uint32_t handler, uint32_t event, DMAUsage hint) { if(spi_active(obj)) { return; } /* check corner case */ if(tx_length == 0) { tx_length = rx_length; tx = (void*) 0; } /* First, set the buffer */ spi_buffer_set(obj, tx, tx_length, rx, rx_length, bit_width); /* If using DMA, allocate channels only if they have not already been allocated */ if (hint != DMA_USAGE_NEVER) { /* User requested to transfer using DMA */ spi_enable_dma(obj, handler, hint); /* Check if DMA setup was successful */ if (obj->spi.spiDmaMasterRx.dmaUsageState != DMA_USAGE_ALLOCATED && obj->spi.spiDmaMasterRx.dmaUsageState != DMA_USAGE_TEMPORARY_ALLOCATED) { /* Set up an interrupt transfer as DMA is unavailable */ DSPI_MasterTransferCreateHandle(spi_address[obj->spi.instance], &obj->spi.spi_master_handle, (dspi_master_transfer_callback_t)handler, NULL); } } else { /* User requested to transfer using interrupts */ /* Disable the DMA */ spi_enable_dma(obj, handler, hint); /* Set up the interrupt transfer */ DSPI_MasterTransferCreateHandle(spi_address[obj->spi.instance], &obj->spi.spi_master_handle, (dspi_master_transfer_callback_t)handler, NULL); } /* Start the transfer */ if (spi_master_transfer_asynch(obj) != kStatus_Success) { obj->spi.status = kDSPI_Idle; } }
status_t DSPI_RTOS_Init(dspi_rtos_handle_t *handle, SPI_Type *base, const dspi_master_config_t *masterConfig, uint32_t srcClock_Hz) { OS_ERR err; if (handle == NULL) { return kStatus_InvalidArgument; } if (base == NULL) { return kStatus_InvalidArgument; } memset(handle, 0, sizeof(dspi_rtos_handle_t)); OSSemCreate(&handle->mutex, "DSPI", (OS_SEM_CTR)1, &err); if (OS_ERR_NONE != err) { return kStatus_Fail; } OSFlagCreate(&handle->event, "DSPI", (OS_FLAGS)0, &err); if (OS_ERR_NONE != err) { OSSemDel(&handle->mutex, OS_OPT_DEL_ALWAYS, &err); return kStatus_Fail; } handle->base = base; DSPI_MasterInit(handle->base, masterConfig, srcClock_Hz); DSPI_MasterTransferCreateHandle(handle->base, &handle->drv_handle, DSPI_RTOS_Callback, (void *)handle); return kStatus_Success; }