86 #include "lpspi_hw_access.h"
146 (void)LPSPI_SetMasterSlaveMode(base, LPSPI_SLAVE);
148 (void)LPSPI_SetPinConfigMode(base, LPSPI_SDI_IN_SDO_OUT, LPSPI_DATA_OUT_RETAINED,
true);
150 LPSPI_GetFifoSizes(base, &(lpspiState->
fifoSize), NULL);
156 lpspi_tx_cmd_config_t txCmdCfg = {
158 .width = LPSPI_SINGLE_BIT_XFER,
169 LPSPI_SetTxCommandReg(base, &txCmdCfg);
210 const uint8_t *sendBuffer,
211 uint8_t *receiveBuffer,
212 uint16_t transferByteCount,
249 const uint8_t *sendBuffer,
250 uint8_t *receiveBuffer,
251 uint16_t transferByteCount)
255 DEV_ASSERT(!((sendBuffer == NULL) && (receiveBuffer == NULL)));
260 if ((uint16_t)(transferByteCount % state->
bytesPerFrame) != (uint16_t)0)
272 LPSPI_SetFlushFifoCmd(base,
true,
true);
274 LPSPI_SetFlushFifoCmd(base,
true,
true);
276 (void)LPSPI_ClearStatusFlag(base, LPSPI_ALL_STATUS);
278 LPSPI_SetIntMode(base,LPSPI_TRANSMIT_ERROR ,
true);
279 LPSPI_SetIntMode(base,LPSPI_RECEIVE_ERROR ,
true);
281 state->
txBuff = (
const uint8_t *)sendBuffer;
282 state->
rxBuff = (uint8_t *)receiveBuffer;
285 state->
txCount = transferByteCount;
286 state->
rxCount = transferByteCount;
291 LPSPI_SetRxWatermarks(base, 0U);
292 LPSPI_SetTxWatermarks(base, 2U);
298 LPSPI_SetIntMode(base,LPSPI_TX_DATA_FLAG ,
true);
306 LPSPI_SetIntMode(base, LPSPI_RX_DATA_FLAG,
true);
316 LPSPI_SetRxWatermarks(base, 0U);
317 LPSPI_SetTxWatermarks(base, 3U);
326 if(receiveBuffer != NULL)
329 (uint32_t)(&(base->
RDR)),(uint32_t)receiveBuffer, dmaTransferSize, (uint32_t)1U<<(uint8_t)(dmaTransferSize),
330 (uint32_t)transferByteCount/(uint32_t)((uint32_t)1U <<(uint8_t)(dmaTransferSize)),
true);
332 state->
rxCount = transferByteCount;
340 if(sendBuffer != NULL)
343 (uint32_t)sendBuffer, (uint32_t)(&(base->
TDR)), dmaTransferSize, (uint32_t)1U<<(uint8_t)(dmaTransferSize),
344 (uint32_t)transferByteCount/(uint32_t)((uint32_t)1U <<(uint8_t)(dmaTransferSize)),
true);
346 state->
txCount = transferByteCount;
358 if(receiveBuffer != NULL)
368 if (receiveBuffer != NULL)
370 LPSPI_SetRxDmaCmd(base,
true);
372 if (sendBuffer != NULL)
374 LPSPI_SetTxDmaCmd(base,
true);
384 uint16_t txCount, rxCount;
387 if ((
bool)LPSPI_GetStatusFlag(base, LPSPI_TRANSMIT_ERROR) && (lpspiState->
txBuff != NULL))
393 if (LPSPI_GetStatusFlag(base, LPSPI_RECEIVE_ERROR) && (lpspiState->
rxBuff != NULL))
401 if(LPSPI_GetStatusFlag(base,LPSPI_RX_DATA_FLAG))
407 if (LPSPI_GetStatusFlag(base,LPSPI_TX_DATA_FLAG) && ((txCount != (uint8_t)0)))
414 if (txCount == (uint8_t)0)
416 LPSPI_SetIntMode(base, LPSPI_TX_DATA_FLAG,
false);
419 if (rxCount == (uint8_t)0)
421 LPSPI_SetIntMode(base, LPSPI_RX_DATA_FLAG,
false);
423 if ((rxCount == (uint8_t)0) && (txCount == (uint8_t)0))
426 LPSPI_SetIntMode(base,LPSPI_TRANSMIT_ERROR ,
false);
427 LPSPI_SetIntMode(base,LPSPI_RECEIVE_ERROR ,
false);
460 LPSPI_SetIntMode(base, LPSPI_TX_DATA_FLAG,
false);
461 LPSPI_SetIntMode(base, LPSPI_RX_DATA_FLAG,
false);
466 LPSPI_SetRxDmaCmd(base,
false);
467 LPSPI_SetTxDmaCmd(base,
false);
474 LPSPI_SetFlushFifoCmd(base,
true,
true);
476 LPSPI_SetFlushFifoCmd(base,
true,
true);
495 if (bytesRemained != NULL)
497 *bytesRemained = lpspiState->
txCount;
515 uint32_t instance = (uint32_t)parameter;
volatile uint16_t rxFrameCnt
#define LPSPI_INSTANCE_COUNT
volatile uint16_t txFrameCnt
Runtime state structure for the LPSPI master driver.
void LPSPI_DRV_ReadRXBuffer(uint32_t instance)
The function LPSPI_DRV_ReadRXBuffer reads data from RX hardware buffer and writes this data in RX sof...
status_t EDMA_DRV_InstallCallback(uint8_t virtualChannel, edma_callback_t callback, void *parameter)
Registers the callback function and the parameter for eDMA channel.
volatile const uint32_t RDR
status_t OSIF_SemaDestroy(const semaphore_t *const pSem)
Destroys a previously created semaphore.
status_t EDMA_DRV_ConfigMultiBlockTransfer(uint8_t virtualChannel, edma_transfer_type_t type, uint32_t srcAddr, uint32_t destAddr, edma_transfer_size_t transferSize, uint32_t blockSize, uint32_t blockCount, bool disableReqOnCompletion)
Configures a multiple block data transfer with DMA.
LPSPI_Type * g_lpspiBase[(2u)]
Table of base pointers for SPI instances.
lpspi_transfer_type transferType
lpspi_signal_polarity_t pcsPolarity
lpspi_which_pcs_t whichPcs
status_t OSIF_SemaCreate(semaphore_t *const pSem, const uint8_t initValue)
Creates a semaphore with a given value.
void LPSPI_DRV_FillupTxBuffer(uint32_t instance)
The function LPSPI_DRV_FillupTxBuffer writes data in TX hardware buffer depending on driver state and...
status_t LPSPI_DRV_SlaveTransfer(uint32_t instance, const uint8_t *sendBuffer, uint8_t *receiveBuffer, uint16_t transferByteCount)
Starts the transfer data on LPSPI bus using a non-blocking call.
void INT_SYS_DisableIRQ(IRQn_Type irqNumber)
Disables an interrupt for a given IRQ number.
lpspi_clock_phase_t clkPhase
volatile uint16_t rxCount
edma_chn_status_t
Channel status for eDMA channel.
status_t LPSPI_DRV_SlaveTransferBlocking(uint32_t instance, const uint8_t *sendBuffer, uint8_t *receiveBuffer, uint16_t transferByteCount, uint32_t timeout)
Transfers data on LPSPI bus using a blocking call.
edma_transfer_size_t
eDMA transfer configuration Implements : edma_transfer_size_t_Class
volatile uint16_t txCount
lpspi_sck_polarity_t clkPolarity
status_t
Status return codes. Common error codes will be a unified enumeration (C enum) that will contain all ...
status_t LPSPI_DRV_SlaveInit(uint32_t instance, lpspi_state_t *lpspiState, const lpspi_slave_config_t *slaveConfig)
Initializes a LPSPI instance for a slave mode operation, using interrupt mechanism.
User configuration structure for the SPI slave driver. Implements : lpspi_slave_config_t_Class.
void LPSPI_DRV_DisableTEIEInterrupts(uint32_t instance)
Disable the TEIE interrupts at the end of a transfer. Disable the interrupts and clear the status for...
static void LPSPI_DRV_SlaveCompleteDMATransfer(void *parameter, edma_chn_status_t status)
Finish up a transfer DMA. The main purpose of this function is to create a function compatible with D...
status_t OSIF_SemaWait(semaphore_t *const pSem, const uint32_t timeout)
Decrement a semaphore with timeout.
volatile bool isTransferInProgress
status_t LPSPI_DRV_SlaveAbortTransfer(uint32_t instance)
Aborts the transfer that started by a non-blocking call transfer function.
lpspi_state_t * g_lpspiStatePtr[(2u)]
status_t OSIF_SemaPost(semaphore_t *const pSem)
Increment a semaphore.
status_t EDMA_DRV_StartChannel(uint8_t virtualChannel)
Starts an eDMA channel.
lpspi_transfer_type transferType
status_t LPSPI_DRV_SlaveGetTransferStatus(uint32_t instance, uint32_t *bytesRemained)
Returns whether the previous transfer is finished.
void INT_SYS_EnableIRQ(IRQn_Type irqNumber)
Enables an interrupt for a given IRQ number.
status_t LPSPI_DRV_SlaveDeinit(uint32_t instance)
Shuts down an LPSPI instance interrupt mechanism.
void LPSPI_DRV_SlaveIRQHandler(uint32_t instance)
Interrupt handler for LPSPI slave mode. This handler uses the buffers stored in the lpspi_master_stat...
semaphore_t lpspiSemaphore
IRQn_Type g_lpspiIrqId[(2u)]
Table to save LPSPI IRQ enumeration numbers defined in the CMSIS header file.