92 #include "lpspi_hw_access.h"
98 #define MICROSECONDS 1000000
108 const uint8_t * sendBuffer,
109 uint8_t * receiveBuffer,
110 uint16_t transferByteCount);
155 (void)LPSPI_SetMasterSlaveMode(base, LPSPI_MASTER);
157 (void)LPSPI_SetPinConfigMode(base, LPSPI_SDI_IN_SDO_OUT, LPSPI_DATA_OUT_RETAINED,
true);
159 LPSPI_GetFifoSizes(base, &(lpspiState->
fifoSize), NULL);
172 lpspiState->
dummy = 0;
242 uint32_t delaySCKtoPCS, uint32_t delayPCStoSCK)
250 uint32_t realDelayBetwenTransfers, realDelaySCKtoPCS, realDelayPCStoSCK;
251 lpspi_prescaler_t prescaler;
253 errorCode = LPSPI_Disable(base);
258 prescaler = LPSPI_GetClockPrescaler(base);
259 realDelayBetwenTransfers = delayBetwenTransfers * lpspiState->
lpspiSrcClk / s_baudratePrescaler[prescaler] / (uint32_t)
MICROSECONDS;
260 realDelaySCKtoPCS = delaySCKtoPCS * lpspiState->
lpspiSrcClk / s_baudratePrescaler[prescaler] / (uint32_t)
MICROSECONDS;
261 realDelayPCStoSCK = delayPCStoSCK * lpspiState->
lpspiSrcClk/ s_baudratePrescaler[prescaler] / (uint32_t)
MICROSECONDS;
264 if (realDelayBetwenTransfers > (uint32_t)257U)
266 realDelayBetwenTransfers = (uint32_t)257U;
268 if(realDelaySCKtoPCS > (uint32_t)256U)
270 realDelaySCKtoPCS = (uint32_t)256U;
272 if(realDelayPCStoSCK > (uint32_t)256U)
274 realDelayPCStoSCK = (uint32_t)256U;
276 if (realDelayBetwenTransfers < (uint32_t)2U)
278 realDelayBetwenTransfers = (uint32_t)2U;
280 if(realDelaySCKtoPCS == (uint32_t)0)
282 realDelaySCKtoPCS = (uint32_t)1U;
284 if(realDelayPCStoSCK == (uint32_t)0U)
286 realDelayPCStoSCK = (uint32_t)1U;
289 (void)LPSPI_SetDelay(base, LPSPI_SCK_TO_PCS, realDelaySCKtoPCS-1U);
290 (void)LPSPI_SetDelay(base, LPSPI_PCS_TO_SCK, realDelayPCStoSCK-1U);
291 (void)LPSPI_SetDelay(base, LPSPI_BETWEEN_TRANSFER, realDelayBetwenTransfers-2U);
318 uint32_t * calculatedBaudRate)
331 uint32_t tcrPrescaleValue;
381 LPSPI_SetSamplingPoint(base,
true);
385 if (baudRate == (uint32_t)0)
390 if (calculatedBaudRate != NULL)
392 *calculatedBaudRate = baudRate;
395 lpspi_tx_cmd_config_t txCmdCfg =
398 .width = LPSPI_SINGLE_BIT_XFER,
406 .preDiv = tcrPrescaleValue,
410 LPSPI_SetTxCommandReg(base, &txCmdCfg);
432 const uint8_t * sendBuffer,
433 uint8_t * receiveBuffer,
434 uint16_t transferByteCount,
445 if (transferByteCount == (uint16_t)0)
459 LPSPI_SetIntMode(base, LPSPI_TX_DATA_FLAG,
false);
460 LPSPI_SetIntMode(base, LPSPI_RX_DATA_FLAG,
false);
463 LPSPI_SetIntMode(base, LPSPI_TRANSFER_COMPLETE,
false);
464 (void)LPSPI_ClearStatusFlag(base, LPSPI_TRANSFER_COMPLETE);
485 LPSPI_SetIntMode(base, LPSPI_TRANSFER_COMPLETE,
false);
486 (void)LPSPI_ClearStatusFlag(base, LPSPI_TRANSFER_COMPLETE);
511 const uint8_t * sendBuffer,
512 uint8_t * receiveBuffer,
513 uint16_t transferByteCount)
519 if (transferByteCount == (uint16_t)0)
555 if (bytesRemained != NULL)
557 *bytesRemained = lpspiState->
rxCount;
584 LPSPI_SetFlushFifoCmd(base,
true,
true);
586 LPSPI_SetFlushFifoCmd(base,
true,
true);
612 result = LPSPI_SetPcsPolarityMode(base, whichPcs, polarity);
617 LPSPI_SetPcs(base, whichPcs);
631 const uint8_t * sendBuffer,
632 uint8_t * receiveBuffer,
633 uint16_t transferByteCount)
643 if (LPSPI_GetStatusFlag(base, LPSPI_MODULE_BUSY))
651 if (LPSPI_GetStatusFlag(base, LPSPI_MODULE_BUSY))
659 if ((transferByteCount % lpspiState->
bytesPerFrame) != (uint16_t)0)
665 LPSPI_SetContCBit(base);
669 LPSPI_SetRxWatermarks(base, 0U);
670 LPSPI_SetTxWatermarks(base, 2U);
674 (void)LPSPI_ClearStatusFlag(base, LPSPI_ALL_STATUS);
676 LPSPI_SetIntMode(base,LPSPI_TRANSMIT_ERROR ,
true);
677 if (receiveBuffer != NULL)
679 LPSPI_SetIntMode(base,LPSPI_RECEIVE_ERROR ,
true);
684 lpspiState->
txBuff = (
const uint8_t *)sendBuffer;
685 lpspiState->
rxBuff = (uint8_t *)receiveBuffer;
688 lpspiState->
txCount = transferByteCount;
695 LPSPI_SetFlushFifoCmd(base,
true,
true);
697 LPSPI_SetFlushFifoCmd(base,
true,
true);
701 if (lpspiState->
rxBuff == NULL)
709 LPSPI_SetIntMode(base, LPSPI_RX_DATA_FLAG,
true);
710 lpspiState->
rxCount = transferByteCount;
713 LPSPI_SetIntMode(base, LPSPI_TX_DATA_FLAG,
true);
718 if (receiveBuffer == NULL)
724 lpspiState->
rxCount = transferByteCount;
736 if (sendBuffer != NULL)
739 (uint32_t)sendBuffer, (uint32_t)(&(base->
TDR)), dmaTransferSize, (uint32_t)1U<<(uint8_t)(dmaTransferSize),
740 (uint32_t)transferByteCount/(uint32_t)((uint32_t)1U <<(uint8_t)(dmaTransferSize)),
true);
745 (uint32_t)(&(lpspiState->
dummy)), (uint32_t)(&(base->
TDR)), dmaTransferSize, (uint32_t)1U<<(uint8_t)(dmaTransferSize),
746 (uint32_t)transferByteCount/(uint32_t)((uint32_t)1U <<(uint8_t)(dmaTransferSize)),
true);
751 if(receiveBuffer != NULL)
754 (uint32_t)(&(base->
RDR)),(uint32_t)receiveBuffer, dmaTransferSize, (uint32_t)1U<<(uint8_t)(dmaTransferSize),
755 (uint32_t)transferByteCount/(uint32_t)((uint32_t)1U <<(uint8_t)(dmaTransferSize)),
true);
773 if (receiveBuffer!=NULL)
775 LPSPI_SetRxDmaCmd(base,
true);
777 LPSPI_SetTxDmaCmd(base,
true);
797 LPSPI_SetRxDmaCmd(base,
false);
798 LPSPI_SetTxDmaCmd(base,
false);
803 LPSPI_SetIntMode(base, LPSPI_RX_DATA_FLAG,
false);
804 LPSPI_SetIntMode(base, LPSPI_TX_DATA_FLAG,
false);
808 LPSPI_SetIntMode(base, LPSPI_TRANSFER_COMPLETE,
false);
809 (void)LPSPI_ClearStatusFlag(base, LPSPI_TRANSFER_COMPLETE);
828 uint32_t instance = (uint32_t)parameter;
841 uint32_t instance = (uint32_t)parameter;
846 LPSPI_ClearContCBit(base);
859 uint16_t txCount, rxCount;
864 if ((
bool)LPSPI_GetStatusFlag(base, LPSPI_TRANSMIT_ERROR) && (lpspiState->
txBuff != NULL))
868 (void)LPSPI_ClearStatusFlag(base, LPSPI_TRANSMIT_ERROR);
871 if (LPSPI_GetStatusFlag(base, LPSPI_RECEIVE_ERROR) && (lpspiState->
rxBuff != NULL))
875 (void)LPSPI_ClearStatusFlag(base, LPSPI_RECEIVE_ERROR);
880 if(LPSPI_GetStatusFlag(base,LPSPI_RX_DATA_FLAG) && (rxCount != (uint16_t)0))
885 if (LPSPI_GetStatusFlag(base,LPSPI_TX_DATA_FLAG) && ((txCount != (uint16_t)0)))
891 if (txCount == (uint16_t)0)
894 LPSPI_SetIntMode(base, LPSPI_TX_DATA_FLAG,
false);
895 LPSPI_SetIntMode(base, LPSPI_TRANSFER_COMPLETE,
true);
897 if (rxCount == (uint16_t)0)
899 if (LPSPI_GetStatusFlag(base, LPSPI_TRANSFER_COMPLETE) ==
true)
volatile uint16_t rxFrameCnt
#define LPSPI_INSTANCE_COUNT
volatile uint16_t txFrameCnt
Runtime state structure for the LPSPI master driver.
Data structure containing information about a device on the SPI bus.
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.
lpspi_signal_polarity_t pcsPolarity
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.
status_t LPSPI_DRV_SetPcs(uint32_t instance, lpspi_which_pcs_t whichPcs, lpspi_signal_polarity_t polarity)
Select the chip to communicate with.
LPSPI_Type * g_lpspiBase[(2u)]
Table of base pointers for SPI instances.
status_t LPSPI_DRV_MasterDeinit(uint32_t instance)
Shuts down a LPSPI instance.
lpspi_transfer_type transferType
lpspi_transfer_type transferType
static void LPSPI_DRV_MasterCompleteTransfer(uint32_t instance)
Finish up a transfer. Cleans up after a transfer is complete. Interrupts are disabled, and the LPSPI module is disabled. This is not a public API as it is called from other driver functions.
status_t LPSPI_DRV_MasterConfigureBus(uint32_t instance, const lpspi_master_config_t *spiConfig, uint32_t *calculatedBaudRate)
Configures the LPSPI port physical parameters to access a device on the bus when the LSPI instance is...
status_t LPSPI_DRV_MasterInit(uint32_t instance, lpspi_state_t *lpspiState, const lpspi_master_config_t *spiConfig)
Initializes a LPSPI instance for interrupt driven master mode operation.
status_t LPSPI_DRV_MasterTransfer(uint32_t instance, const uint8_t *sendBuffer, uint8_t *receiveBuffer, uint16_t transferByteCount)
Performs an interrupt driven non-blocking SPI master mode transfer.
status_t OSIF_SemaCreate(semaphore_t *const pSem, const uint8_t initValue)
Creates a semaphore with a given value.
status_t LPSPI_DRV_MasterGetTransferStatus(uint32_t instance, uint32_t *bytesRemained)
Returns whether the previous interrupt driven transfer is completed.
void LPSPI_DRV_FillupTxBuffer(uint32_t instance)
The function LPSPI_DRV_FillupTxBuffer writes data in TX hardware buffer depending on driver state and...
void INT_SYS_DisableIRQ(IRQn_Type irqNumber)
Disables an interrupt for a given IRQ number.
volatile uint16_t rxCount
void LPSPI_DRV_MasterIRQHandler(uint32_t instance)
Interrupt handler for LPSPI master mode. This handler uses the buffers stored in the lpspi_state_t st...
edma_chn_status_t
Channel status for eDMA channel.
edma_transfer_size_t
eDMA transfer configuration Implements : edma_transfer_size_t_Class
lpspi_clock_phase_t clkPhase
volatile uint16_t txCount
status_t LPSPI_DRV_MasterTransferBlocking(uint32_t instance, const uint8_t *sendBuffer, uint8_t *receiveBuffer, uint16_t transferByteCount, uint32_t timeout)
Performs an interrupt driven blocking SPI master mode transfer.
status_t LPSPI_DRV_MasterSetDelay(uint32_t instance, uint32_t delayBetwenTransfers, uint32_t delaySCKtoPCS, uint32_t delayPCStoSCK)
Configures the LPSPI master mode bus timing delay options.
status_t
Status return codes. Common error codes will be a unified enumeration (C enum) that will contain all ...
lpspi_signal_polarity_t
LPSPI Signal (PCS and Host Request) Polarity configuration. Implements : lpspi_signal_polarity_t_Clas...
lpspi_which_pcs_t
LPSPI Peripheral Chip Select (PCS) configuration (which PCS to configure). Implements : lpspi_which_p...
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 status_t LPSPI_DRV_MasterStartTransfer(uint32_t instance, const uint8_t *sendBuffer, uint8_t *receiveBuffer, uint16_t transferByteCount)
status_t OSIF_SemaWait(semaphore_t *const pSem, const uint32_t timeout)
Decrement a semaphore with timeout.
lpspi_which_pcs_t whichPcs
static void LPSPI_DRV_MasterCompleteDMATransfer(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...
volatile bool isTransferInProgress
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.
void INT_SYS_EnableIRQ(IRQn_Type irqNumber)
Enables an interrupt for a given IRQ number.
status_t LPSPI_DRV_MasterAbortTransfer(uint32_t instance)
Terminates an interrupt driven asynchronous transfer early.
lpspi_sck_polarity_t clkPolarity
semaphore_t lpspiSemaphore
IRQn_Type g_lpspiIrqId[(2u)]
Table to save LPSPI IRQ enumeration numbers defined in the CMSIS header file.
static void LPSPI_DRV_MasterClearCountinuous(void *parameter, edma_chn_status_t status)
Clear the continuous mode. The main purpose of this function is to clear continuous mode...