11#include <fsl_common.h>
27#define FSL_LPSPI_DRIVER_VERSION (MAKE_VERSION(2, 4, 0))
30#ifndef LPSPI_DUMMY_DATA
32#define LPSPI_DUMMY_DATA (0x00U)
36#ifndef SPI_RETRY_TIMES
37#define SPI_RETRY_TIMES 0U
41extern volatile uint8_t g_lpspiDummyData[];
46 kStatus_LPSPI_Busy = MAKE_STATUS(kStatusGroup_LPSPI, 0),
47 kStatus_LPSPI_Error = MAKE_STATUS(kStatusGroup_LPSPI, 1),
48 kStatus_LPSPI_Idle = MAKE_STATUS(kStatusGroup_LPSPI, 2),
49 kStatus_LPSPI_OutOfRange = MAKE_STATUS(kStatusGroup_LPSPI, 3),
50 kStatus_LPSPI_Timeout = MAKE_STATUS(kStatusGroup_LPSPI, 4)
56 kLPSPI_TxDataRequestFlag = LPSPI_SR_TDF_MASK,
57 kLPSPI_RxDataReadyFlag = LPSPI_SR_RDF_MASK,
58 kLPSPI_WordCompleteFlag = LPSPI_SR_WCF_MASK,
59 kLPSPI_FrameCompleteFlag = LPSPI_SR_FCF_MASK,
60 kLPSPI_TransferCompleteFlag = LPSPI_SR_TCF_MASK,
61 kLPSPI_TransmitErrorFlag = LPSPI_SR_TEF_MASK,
62 kLPSPI_ReceiveErrorFlag = LPSPI_SR_REF_MASK,
63 kLPSPI_DataMatchFlag = LPSPI_SR_DMF_MASK,
64 kLPSPI_ModuleBusyFlag = LPSPI_SR_MBF_MASK,
65 kLPSPI_AllStatusFlag = (LPSPI_SR_TDF_MASK | LPSPI_SR_RDF_MASK | LPSPI_SR_WCF_MASK | LPSPI_SR_FCF_MASK |
66 LPSPI_SR_TCF_MASK | LPSPI_SR_TEF_MASK | LPSPI_SR_REF_MASK | LPSPI_SR_DMF_MASK |
71enum _lpspi_interrupt_enable
73 kLPSPI_TxInterruptEnable = LPSPI_IER_TDIE_MASK,
74 kLPSPI_RxInterruptEnable = LPSPI_IER_RDIE_MASK,
75 kLPSPI_WordCompleteInterruptEnable = LPSPI_IER_WCIE_MASK,
76 kLPSPI_FrameCompleteInterruptEnable = LPSPI_IER_FCIE_MASK,
77 kLPSPI_TransferCompleteInterruptEnable = LPSPI_IER_TCIE_MASK,
78 kLPSPI_TransmitErrorInterruptEnable = LPSPI_IER_TEIE_MASK,
79 kLPSPI_ReceiveErrorInterruptEnable = LPSPI_IER_REIE_MASK,
80 kLPSPI_DataMatchInterruptEnable = LPSPI_IER_DMIE_MASK,
81 kLPSPI_AllInterruptEnable =
82 (LPSPI_IER_TDIE_MASK | LPSPI_IER_RDIE_MASK | LPSPI_IER_WCIE_MASK | LPSPI_IER_FCIE_MASK | LPSPI_IER_TCIE_MASK |
83 LPSPI_IER_TEIE_MASK | LPSPI_IER_REIE_MASK | LPSPI_IER_DMIE_MASK)
89 kLPSPI_TxDmaEnable = LPSPI_DER_TDDE_MASK,
90 kLPSPI_RxDmaEnable = LPSPI_DER_RDDE_MASK
94typedef enum _lpspi_master_slave_mode
98} lpspi_master_slave_mode_t;
101typedef enum _lpspi_which_pcs_config
110typedef enum _lpspi_pcs_polarity_config
112 kLPSPI_PcsActiveHigh = 1U,
113 kLPSPI_PcsActiveLow = 0U
114} lpspi_pcs_polarity_config_t;
117enum _lpspi_pcs_polarity
119 kLPSPI_Pcs0ActiveLow = 1U << 0,
120 kLPSPI_Pcs1ActiveLow = 1U << 1,
121 kLPSPI_Pcs2ActiveLow = 1U << 2,
122 kLPSPI_Pcs3ActiveLow = 1U << 3,
123 kLPSPI_PcsAllActiveLow = 0xFU
127typedef enum _lpspi_clock_polarity
129 kLPSPI_ClockPolarityActiveHigh = 0U,
130 kLPSPI_ClockPolarityActiveLow = 1U
131} lpspi_clock_polarity_t;
134typedef enum _lpspi_clock_phase
136 kLPSPI_ClockPhaseFirstEdge = 0U,
138 kLPSPI_ClockPhaseSecondEdge = 1U
140} lpspi_clock_phase_t;
143typedef enum _lpspi_shift_direction
145 kLPSPI_MsbFirst = 0U,
147} lpspi_shift_direction_t;
150typedef enum _lpspi_host_request_select
152 kLPSPI_HostReqExtPin = 0U,
153 kLPSPI_HostReqInternalTrigger = 1U
154} lpspi_host_request_select_t;
157typedef enum _lpspi_match_config
159 kLPSI_MatchDisabled = 0x0U,
160 kLPSI_1stWordEqualsM0orM1 = 0x2U,
161 kLPSI_AnyWordEqualsM0orM1 = 0x3U,
162 kLPSI_1stWordEqualsM0and2ndWordEqualsM1 = 0x4U,
163 kLPSI_AnyWordEqualsM0andNxtWordEqualsM1 = 0x5U,
164 kLPSI_1stWordAndM1EqualsM0andM1 = 0x6U,
165 kLPSI_AnyWordAndM1EqualsM0andM1 = 0x7U,
166} lpspi_match_config_t;
169typedef enum _lpspi_pin_config
171 kLPSPI_SdiInSdoOut = 0U,
172 kLPSPI_SdiInSdiOut = 1U,
173 kLPSPI_SdoInSdoOut = 2U,
174 kLPSPI_SdoInSdiOut = 3U
178typedef enum _lpspi_data_out_config
180 kLpspiDataOutRetained = 0U,
181 kLpspiDataOutTristate = 1U
182} lpspi_data_out_config_t;
185typedef enum _lpspi_transfer_width
187 kLPSPI_SingleBitXfer = 0U,
188 kLPSPI_TwoBitXfer = 1U,
189 kLPSPI_FourBitXfer = 2U
190} lpspi_transfer_width_t;
193typedef enum _lpspi_delay_type
195 kLPSPI_PcsToSck = 1U,
197 kLPSPI_BetweenTransfer
200#define LPSPI_MASTER_PCS_SHIFT (4U)
201#define LPSPI_MASTER_PCS_MASK (0xF0U)
204enum _lpspi_transfer_config_flag_for_master
206 kLPSPI_MasterPcs0 = 0U << LPSPI_MASTER_PCS_SHIFT,
207 kLPSPI_MasterPcs1 = 1U << LPSPI_MASTER_PCS_SHIFT,
208 kLPSPI_MasterPcs2 = 2U << LPSPI_MASTER_PCS_SHIFT,
209 kLPSPI_MasterPcs3 = 3U << LPSPI_MASTER_PCS_SHIFT,
211 kLPSPI_MasterPcsContinuous = 1U << 20,
213 kLPSPI_MasterByteSwap =
228#define LPSPI_SLAVE_PCS_SHIFT (4U)
229#define LPSPI_SLAVE_PCS_MASK (0xF0U)
232enum _lpspi_transfer_config_flag_for_slave
234 kLPSPI_SlavePcs0 = 0U << LPSPI_SLAVE_PCS_SHIFT,
235 kLPSPI_SlavePcs1 = 1U << LPSPI_SLAVE_PCS_SHIFT,
236 kLPSPI_SlavePcs2 = 2U << LPSPI_SLAVE_PCS_SHIFT,
237 kLPSPI_SlavePcs3 = 3U << LPSPI_SLAVE_PCS_SHIFT,
239 kLPSPI_SlaveByteSwap =
255enum _lpspi_transfer_state
326typedef void (*lpspi_master_transfer_callback_t)(LPSPI_Type *base,
339typedef void (*lpspi_slave_transfer_callback_t)(LPSPI_Type *base,
425#if defined(__cplusplus)
441void LPSPI_MasterInit(LPSPI_Type *base,
const lpspi_master_config_t *masterConfig, uint32_t srcClock_Hz);
485void LPSPI_Deinit(LPSPI_Type *base);
493void LPSPI_Reset(LPSPI_Type *base);
501uint32_t LPSPI_GetInstance(LPSPI_Type *base);
509static inline void LPSPI_Enable(LPSPI_Type *base,
bool enable)
513 base->CR |= LPSPI_CR_MEN_MASK;
517 base->CR &= ~LPSPI_CR_MEN_MASK;
535static inline uint32_t LPSPI_GetStatusFlags(LPSPI_Type *base)
545static inline uint8_t LPSPI_GetTxFifoSize(LPSPI_Type *base)
547 return (1U << ((base->PARAM & LPSPI_PARAM_TXFIFO_MASK) >> LPSPI_PARAM_TXFIFO_SHIFT));
555static inline uint8_t LPSPI_GetRxFifoSize(LPSPI_Type *base)
557 return (1U << ((base->PARAM & LPSPI_PARAM_RXFIFO_MASK) >> LPSPI_PARAM_RXFIFO_SHIFT));
565static inline uint32_t LPSPI_GetTxFifoCount(LPSPI_Type *base)
567 return ((base->FSR & LPSPI_FSR_TXCOUNT_MASK) >> LPSPI_FSR_TXCOUNT_SHIFT);
575static inline uint32_t LPSPI_GetRxFifoCount(LPSPI_Type *base)
577 return ((base->FSR & LPSPI_FSR_RXCOUNT_MASK) >> LPSPI_FSR_RXCOUNT_SHIFT);
593static inline void LPSPI_ClearStatusFlags(LPSPI_Type *base, uint32_t statusFlags)
595 base->SR = statusFlags;
620static inline void LPSPI_EnableInterrupts(LPSPI_Type *base, uint32_t mask)
635static inline void LPSPI_DisableInterrupts(LPSPI_Type *base, uint32_t mask)
660static inline void LPSPI_EnableDMA(LPSPI_Type *base, uint32_t mask)
676static inline void LPSPI_DisableDMA(LPSPI_Type *base, uint32_t mask)
691static inline uint32_t LPSPI_GetTxRegisterAddress(LPSPI_Type *base)
693 return (uint32_t) & (base->TDR);
706static inline uint32_t LPSPI_GetRxRegisterAddress(LPSPI_Type *base)
708 return (uint32_t) & (base->RDR);
728bool LPSPI_CheckTransferArgument(LPSPI_Type *base,
lpspi_transfer_t *transfer,
bool isEdma);
738static inline void LPSPI_SetMasterSlaveMode(LPSPI_Type *base, lpspi_master_slave_mode_t mode)
740 base->CFGR1 = (base->CFGR1 & (~LPSPI_CFGR1_MASTER_MASK)) | LPSPI_CFGR1_MASTER(mode);
749static inline void LPSPI_SelectTransferPCS(LPSPI_Type *base, lpspi_which_pcs_t
select)
751 base->TCR = (base->TCR & (~LPSPI_TCR_PCS_MASK)) | LPSPI_TCR_PCS((uint8_t)
select);
765static inline void LPSPI_SetPCSContinous(LPSPI_Type *base,
bool IsContinous)
769 base->TCR |= LPSPI_TCR_CONT_MASK;
773 base->TCR &= ~LPSPI_TCR_CONT_MASK;
783static inline bool LPSPI_IsMaster(LPSPI_Type *base)
785 return (
bool)((base->CFGR1) & LPSPI_CFGR1_MASTER_MASK);
795static inline void LPSPI_FlushFifo(LPSPI_Type *base,
bool flushTxFifo,
bool flushRxFifo)
797 base->CR |= ((uint32_t)flushTxFifo << LPSPI_CR_RTF_SHIFT) | ((uint32_t)flushRxFifo << LPSPI_CR_RRF_SHIFT);
811static inline void LPSPI_SetFifoWatermarks(LPSPI_Type *base, uint32_t txWater, uint32_t rxWater)
813 base->FCR = LPSPI_FCR_TXWATER(txWater) | LPSPI_FCR_RXWATER(rxWater);
830static inline void LPSPI_SetAllPcsPolarity(LPSPI_Type *base, uint32_t mask)
832 base->CFGR1 = (base->CFGR1 & ~LPSPI_CFGR1_PCSPOL_MASK) | LPSPI_CFGR1_PCSPOL(~mask);
854static inline void LPSPI_SetFrameSize(LPSPI_Type *base, uint32_t frameSize)
856 base->TCR = (base->TCR & ~LPSPI_TCR_FRAMESZ_MASK) | LPSPI_TCR_FRAMESZ(frameSize - 1U);
882uint32_t LPSPI_MasterSetBaudRate(LPSPI_Type *base,
883 uint32_t baudRate_Bps,
884 uint32_t srcClock_Hz,
885 uint32_t *tcrPrescaleValue);
909void LPSPI_MasterSetDelayScaler(LPSPI_Type *base, uint32_t scaler, lpspi_delay_type_t whichDelay);
939uint32_t LPSPI_MasterSetDelayTimes(LPSPI_Type *base,
940 uint32_t delayTimeInNanoSec,
941 lpspi_delay_type_t whichDelay,
942 uint32_t srcClock_Hz);
956static inline void LPSPI_WriteData(LPSPI_Type *base, uint32_t data)
970static inline uint32_t LPSPI_ReadData(LPSPI_Type *base)
985void LPSPI_SetDummyData(LPSPI_Type *base, uint8_t dummyData);
1008void LPSPI_MasterTransferCreateHandle(LPSPI_Type *base,
1010 lpspi_master_transfer_callback_t callback,
1030status_t LPSPI_MasterTransferBlocking(LPSPI_Type *base,
lpspi_transfer_t *transfer);
1061status_t LPSPI_MasterTransferGetCount(LPSPI_Type *base,
lpspi_master_handle_t *handle,
size_t *count);
1094void LPSPI_SlaveTransferCreateHandle(LPSPI_Type *base,
1096 lpspi_slave_transfer_callback_t callback,
1128status_t LPSPI_SlaveTransferGetCount(LPSPI_Type *base,
lpspi_slave_handle_t *handle,
size_t *count);
1154#if defined(__cplusplus)
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds, unsigned long timeout)
Wait for events to occur on one or more I/O resources associated with a set of file descriptors (fds)...
LPSPI master configuration structure.
Definition fsl_lpspi.h:264
lpspi_pcs_polarity_config_t pcsActiveHighOrLow
Definition fsl_lpspi.h:279
lpspi_shift_direction_t direction
Definition fsl_lpspi.h:269
lpspi_data_out_config_t dataOutConfig
Definition fsl_lpspi.h:284
bool enableInputDelay
Definition fsl_lpspi.h:286
uint32_t baudRate
Definition fsl_lpspi.h:265
lpspi_clock_phase_t cpha
Definition fsl_lpspi.h:268
uint32_t betweenTransferDelayInNanoSec
Definition fsl_lpspi.h:275
uint32_t bitsPerFrame
Definition fsl_lpspi.h:266
uint32_t lastSckToPcsDelayInNanoSec
Definition fsl_lpspi.h:273
lpspi_which_pcs_t whichPcs
Definition fsl_lpspi.h:278
uint32_t pcsToSckDelayInNanoSec
Definition fsl_lpspi.h:271
lpspi_clock_polarity_t cpol
Definition fsl_lpspi.h:267
lpspi_pin_config_t pinCfg
Definition fsl_lpspi.h:281
LPSPI master transfer handle structure used for transactional API.
Definition fsl_lpspi.h:358
uint8_t *volatile txData
Definition fsl_lpspi.h:373
volatile uint8_t fifoSize
Definition fsl_lpspi.h:366
uint8_t *volatile rxData
Definition fsl_lpspi.h:374
volatile uint8_t state
Definition fsl_lpspi.h:385
volatile uint32_t writeRegRemainingTimes
Definition fsl_lpspi.h:378
volatile uint8_t bytesEachRead
Definition fsl_lpspi.h:371
volatile uint8_t rxWatermark
Definition fsl_lpspi.h:368
lpspi_master_transfer_callback_t callback
Definition fsl_lpspi.h:387
volatile uint32_t readRegRemainingTimes
Definition fsl_lpspi.h:379
volatile size_t txRemainingByteCount
Definition fsl_lpspi.h:375
volatile bool isTxMask
Definition fsl_lpspi.h:363
volatile uint16_t bytesPerFrame
Definition fsl_lpspi.h:364
void * userData
Definition fsl_lpspi.h:388
uint32_t txBuffIfNull
Definition fsl_lpspi.h:383
volatile bool writeTcrInIsr
Definition fsl_lpspi.h:360
volatile uint8_t bytesEachWrite
Definition fsl_lpspi.h:370
volatile bool isByteSwap
Definition fsl_lpspi.h:362
uint32_t totalByteCount
Definition fsl_lpspi.h:381
volatile size_t rxRemainingByteCount
Definition fsl_lpspi.h:376
volatile bool isPcsContinuous
Definition fsl_lpspi.h:359
LPSPI slave configuration structure.
Definition fsl_lpspi.h:292
lpspi_clock_phase_t cpha
Definition fsl_lpspi.h:295
lpspi_shift_direction_t direction
Definition fsl_lpspi.h:296
lpspi_pcs_polarity_config_t pcsActiveHighOrLow
Definition fsl_lpspi.h:299
lpspi_data_out_config_t dataOutConfig
Definition fsl_lpspi.h:304
uint32_t bitsPerFrame
Definition fsl_lpspi.h:293
lpspi_clock_polarity_t cpol
Definition fsl_lpspi.h:294
lpspi_which_pcs_t whichPcs
Definition fsl_lpspi.h:298
lpspi_pin_config_t pinCfg
Definition fsl_lpspi.h:301
LPSPI slave transfer handle structure used for transactional API.
Definition fsl_lpspi.h:393
volatile uint8_t state
Definition fsl_lpspi.h:414
volatile size_t txRemainingByteCount
Definition fsl_lpspi.h:406
volatile uint8_t rxWatermark
Definition fsl_lpspi.h:398
uint8_t *volatile rxData
Definition fsl_lpspi.h:404
void * userData
Definition fsl_lpspi.h:419
volatile size_t rxRemainingByteCount
Definition fsl_lpspi.h:407
volatile uint8_t fifoSize
Definition fsl_lpspi.h:396
volatile uint8_t bytesEachRead
Definition fsl_lpspi.h:401
volatile uint32_t errorCount
Definition fsl_lpspi.h:416
volatile uint32_t readRegRemainingTimes
Definition fsl_lpspi.h:410
volatile uint8_t bytesEachWrite
Definition fsl_lpspi.h:400
uint8_t *volatile txData
Definition fsl_lpspi.h:403
uint32_t totalByteCount
Definition fsl_lpspi.h:412
volatile bool isByteSwap
Definition fsl_lpspi.h:394
volatile uint32_t writeRegRemainingTimes
Definition fsl_lpspi.h:409
lpspi_slave_transfer_callback_t callback
Definition fsl_lpspi.h:418
LPSPI master/slave transfer structure.
Definition fsl_lpspi.h:346
uint8_t * rxData
Definition fsl_lpspi.h:348
uint32_t configFlags
Definition fsl_lpspi.h:351
volatile size_t dataSize
Definition fsl_lpspi.h:349
uint8_t * txData
Definition fsl_lpspi.h:347