123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248 |
- #ifndef _FSL_DSPI_H_
- #define _FSL_DSPI_H_
- #include "fsl_common.h"
- #define FSL_DSPI_DRIVER_VERSION (MAKE_VERSION(2, 2, 0))
- #ifndef DSPI_DUMMY_DATA
- #define DSPI_DUMMY_DATA (0x00U)
- #endif
- extern volatile uint8_t g_dspiDummyData[];
- enum _dspi_status
- {
- kStatus_DSPI_Busy = MAKE_STATUS(kStatusGroup_DSPI, 0),
- kStatus_DSPI_Error = MAKE_STATUS(kStatusGroup_DSPI, 1),
- kStatus_DSPI_Idle = MAKE_STATUS(kStatusGroup_DSPI, 2),
- kStatus_DSPI_OutOfRange = MAKE_STATUS(kStatusGroup_DSPI, 3)
- };
- enum _dspi_flags
- {
- kDSPI_TxCompleteFlag = SPI_SR_TCF_MASK,
- kDSPI_EndOfQueueFlag = SPI_SR_EOQF_MASK,
- kDSPI_TxFifoUnderflowFlag = SPI_SR_TFUF_MASK,
- kDSPI_TxFifoFillRequestFlag = SPI_SR_TFFF_MASK,
- kDSPI_RxFifoOverflowFlag = SPI_SR_RFOF_MASK,
- kDSPI_RxFifoDrainRequestFlag = SPI_SR_RFDF_MASK,
- kDSPI_TxAndRxStatusFlag = SPI_SR_TXRXS_MASK,
- kDSPI_AllStatusFlag = SPI_SR_TCF_MASK | SPI_SR_EOQF_MASK | SPI_SR_TFUF_MASK | SPI_SR_TFFF_MASK | SPI_SR_RFOF_MASK |
- SPI_SR_RFDF_MASK | SPI_SR_TXRXS_MASK
- };
- enum _dspi_interrupt_enable
- {
- kDSPI_TxCompleteInterruptEnable = SPI_RSER_TCF_RE_MASK,
- kDSPI_EndOfQueueInterruptEnable = SPI_RSER_EOQF_RE_MASK,
- kDSPI_TxFifoUnderflowInterruptEnable = SPI_RSER_TFUF_RE_MASK,
- kDSPI_TxFifoFillRequestInterruptEnable = SPI_RSER_TFFF_RE_MASK,
- kDSPI_RxFifoOverflowInterruptEnable = SPI_RSER_RFOF_RE_MASK,
- kDSPI_RxFifoDrainRequestInterruptEnable = SPI_RSER_RFDF_RE_MASK,
- kDSPI_AllInterruptEnable = SPI_RSER_TCF_RE_MASK | SPI_RSER_EOQF_RE_MASK | SPI_RSER_TFUF_RE_MASK |
- SPI_RSER_TFFF_RE_MASK | SPI_RSER_RFOF_RE_MASK | SPI_RSER_RFDF_RE_MASK
-
- };
- enum _dspi_dma_enable
- {
- kDSPI_TxDmaEnable = (SPI_RSER_TFFF_RE_MASK | SPI_RSER_TFFF_DIRS_MASK),
- kDSPI_RxDmaEnable = (SPI_RSER_RFDF_RE_MASK | SPI_RSER_RFDF_DIRS_MASK)
- };
- typedef enum _dspi_master_slave_mode
- {
- kDSPI_Master = 1U,
- kDSPI_Slave = 0U
- } dspi_master_slave_mode_t;
- typedef enum _dspi_master_sample_point
- {
- kDSPI_SckToSin0Clock = 0U,
- kDSPI_SckToSin1Clock = 1U,
- kDSPI_SckToSin2Clock = 2U
- } dspi_master_sample_point_t;
- typedef enum _dspi_which_pcs_config
- {
- kDSPI_Pcs0 = 1U << 0,
- kDSPI_Pcs1 = 1U << 1,
- kDSPI_Pcs2 = 1U << 2,
- kDSPI_Pcs3 = 1U << 3,
- kDSPI_Pcs4 = 1U << 4,
- kDSPI_Pcs5 = 1U << 5
- } dspi_which_pcs_t;
- typedef enum _dspi_pcs_polarity_config
- {
- kDSPI_PcsActiveHigh = 0U,
- kDSPI_PcsActiveLow = 1U
- } dspi_pcs_polarity_config_t;
- enum _dspi_pcs_polarity
- {
- kDSPI_Pcs0ActiveLow = 1U << 0,
- kDSPI_Pcs1ActiveLow = 1U << 1,
- kDSPI_Pcs2ActiveLow = 1U << 2,
- kDSPI_Pcs3ActiveLow = 1U << 3,
- kDSPI_Pcs4ActiveLow = 1U << 4,
- kDSPI_Pcs5ActiveLow = 1U << 5,
- kDSPI_PcsAllActiveLow = 0xFFU
- };
- typedef enum _dspi_clock_polarity
- {
- kDSPI_ClockPolarityActiveHigh = 0U,
- kDSPI_ClockPolarityActiveLow = 1U
- } dspi_clock_polarity_t;
- typedef enum _dspi_clock_phase
- {
- kDSPI_ClockPhaseFirstEdge = 0U,
- kDSPI_ClockPhaseSecondEdge = 1U
- } dspi_clock_phase_t;
- typedef enum _dspi_shift_direction
- {
- kDSPI_MsbFirst = 0U,
- kDSPI_LsbFirst = 1U
- } dspi_shift_direction_t;
- typedef enum _dspi_delay_type
- {
- kDSPI_PcsToSck = 1U,
- kDSPI_LastSckToPcs,
- kDSPI_BetweenTransfer
- } dspi_delay_type_t;
- typedef enum _dspi_ctar_selection
- {
- kDSPI_Ctar0 = 0U,
- kDSPI_Ctar1 = 1U,
- kDSPI_Ctar2 = 2U,
- kDSPI_Ctar3 = 3U,
- kDSPI_Ctar4 = 4U,
- kDSPI_Ctar5 = 5U,
- kDSPI_Ctar6 = 6U,
- kDSPI_Ctar7 = 7U
- } dspi_ctar_selection_t;
- #define DSPI_MASTER_CTAR_SHIFT (0U)
- #define DSPI_MASTER_CTAR_MASK (0x0FU)
- #define DSPI_MASTER_PCS_SHIFT (4U)
- #define DSPI_MASTER_PCS_MASK (0xF0U)
- enum _dspi_transfer_config_flag_for_master
- {
- kDSPI_MasterCtar0 = 0U << DSPI_MASTER_CTAR_SHIFT,
- kDSPI_MasterCtar1 = 1U << DSPI_MASTER_CTAR_SHIFT,
- kDSPI_MasterCtar2 = 2U << DSPI_MASTER_CTAR_SHIFT,
- kDSPI_MasterCtar3 = 3U << DSPI_MASTER_CTAR_SHIFT,
- kDSPI_MasterCtar4 = 4U << DSPI_MASTER_CTAR_SHIFT,
- kDSPI_MasterCtar5 = 5U << DSPI_MASTER_CTAR_SHIFT,
- kDSPI_MasterCtar6 = 6U << DSPI_MASTER_CTAR_SHIFT,
- kDSPI_MasterCtar7 = 7U << DSPI_MASTER_CTAR_SHIFT,
- kDSPI_MasterPcs0 = 0U << DSPI_MASTER_PCS_SHIFT,
- kDSPI_MasterPcs1 = 1U << DSPI_MASTER_PCS_SHIFT,
- kDSPI_MasterPcs2 = 2U << DSPI_MASTER_PCS_SHIFT,
- kDSPI_MasterPcs3 = 3U << DSPI_MASTER_PCS_SHIFT,
- kDSPI_MasterPcs4 = 4U << DSPI_MASTER_PCS_SHIFT,
- kDSPI_MasterPcs5 = 5U << DSPI_MASTER_PCS_SHIFT,
- kDSPI_MasterPcsContinuous = 1U << 20,
- kDSPI_MasterActiveAfterTransfer =
- 1U << 21,
- };
- #define DSPI_SLAVE_CTAR_SHIFT (0U)
- #define DSPI_SLAVE_CTAR_MASK (0x07U)
- enum _dspi_transfer_config_flag_for_slave
- {
- kDSPI_SlaveCtar0 = 0U << DSPI_SLAVE_CTAR_SHIFT,
-
- };
- enum _dspi_transfer_state
- {
- kDSPI_Idle = 0x0U,
- kDSPI_Busy,
- kDSPI_Error
- };
- typedef struct _dspi_command_data_config
- {
- bool isPcsContinuous;
- dspi_ctar_selection_t whichCtar;
- dspi_which_pcs_t whichPcs;
- bool isEndOfQueue;
- bool clearTransferCount;
- } dspi_command_data_config_t;
- typedef struct _dspi_master_ctar_config
- {
- uint32_t baudRate;
- uint32_t bitsPerFrame;
- dspi_clock_polarity_t cpol;
- dspi_clock_phase_t cpha;
- dspi_shift_direction_t direction;
- uint32_t pcsToSckDelayInNanoSec;
- uint32_t lastSckToPcsDelayInNanoSec;
- uint32_t betweenTransferDelayInNanoSec;
- } dspi_master_ctar_config_t;
- typedef struct _dspi_master_config
- {
- dspi_ctar_selection_t whichCtar;
- dspi_master_ctar_config_t ctarConfig;
- dspi_which_pcs_t whichPcs;
- dspi_pcs_polarity_config_t pcsActiveHighOrLow;
- bool enableContinuousSCK;
- bool enableRxFifoOverWrite;
- bool enableModifiedTimingFormat;
- dspi_master_sample_point_t samplePoint;
- } dspi_master_config_t;
- typedef struct _dspi_slave_ctar_config
- {
- uint32_t bitsPerFrame;
- dspi_clock_polarity_t cpol;
- dspi_clock_phase_t cpha;
-
- } dspi_slave_ctar_config_t;
- typedef struct _dspi_slave_config
- {
- dspi_ctar_selection_t whichCtar;
- dspi_slave_ctar_config_t ctarConfig;
- bool enableContinuousSCK;
- bool enableRxFifoOverWrite;
- bool enableModifiedTimingFormat;
- dspi_master_sample_point_t samplePoint;
- } dspi_slave_config_t;
- typedef struct _dspi_master_handle dspi_master_handle_t;
- typedef struct _dspi_slave_handle dspi_slave_handle_t;
- typedef void (*dspi_master_transfer_callback_t)(SPI_Type *base,
- dspi_master_handle_t *handle,
- status_t status,
- void *userData);
- typedef void (*dspi_slave_transfer_callback_t)(SPI_Type *base,
- dspi_slave_handle_t *handle,
- status_t status,
- void *userData);
- typedef struct _dspi_transfer
- {
- uint8_t *txData;
- uint8_t *rxData;
- volatile size_t dataSize;
- uint32_t
- configFlags;
- } dspi_transfer_t;
- typedef struct _dspi_half_duplex_transfer
- {
- uint8_t *txData;
- uint8_t *rxData;
- size_t txDataSize;
- size_t rxDataSize;
- uint32_t configFlags;
- bool isPcsAssertInTransfer;
- bool isTransmitFirst;
- } dspi_half_duplex_transfer_t;
- struct _dspi_master_handle
- {
- uint32_t bitsPerFrame;
- volatile uint32_t command;
- volatile uint32_t lastCommand;
- uint8_t fifoSize;
- volatile bool
- isPcsActiveAfterTransfer;
- volatile bool isThereExtraByte;
- uint8_t *volatile txData;
- uint8_t *volatile rxData;
- volatile size_t remainingSendByteCount;
- volatile size_t remainingReceiveByteCount;
- size_t totalByteCount;
- volatile uint8_t state;
- dspi_master_transfer_callback_t callback;
- void *userData;
- };
- struct _dspi_slave_handle
- {
- uint32_t bitsPerFrame;
- volatile bool isThereExtraByte;
- uint8_t *volatile txData;
- uint8_t *volatile rxData;
- volatile size_t remainingSendByteCount;
- volatile size_t remainingReceiveByteCount;
- size_t totalByteCount;
- volatile uint8_t state;
- volatile uint32_t errorCount;
- dspi_slave_transfer_callback_t callback;
- void *userData;
- };
- #if defined(__cplusplus)
- extern "C" {
- #endif
- void DSPI_MasterInit(SPI_Type *base, const dspi_master_config_t *masterConfig, uint32_t srcClock_Hz);
- void DSPI_MasterGetDefaultConfig(dspi_master_config_t *masterConfig);
- void DSPI_SlaveInit(SPI_Type *base, const dspi_slave_config_t *slaveConfig);
- void DSPI_SlaveGetDefaultConfig(dspi_slave_config_t *slaveConfig);
- void DSPI_Deinit(SPI_Type *base);
- static inline void DSPI_Enable(SPI_Type *base, bool enable)
- {
- if (enable)
- {
- base->MCR &= ~SPI_MCR_MDIS_MASK;
- }
- else
- {
- base->MCR |= SPI_MCR_MDIS_MASK;
- }
- }
- static inline uint32_t DSPI_GetStatusFlags(SPI_Type *base)
- {
- return (base->SR);
- }
- static inline void DSPI_ClearStatusFlags(SPI_Type *base, uint32_t statusFlags)
- {
- base->SR = statusFlags;
- }
- void DSPI_EnableInterrupts(SPI_Type *base, uint32_t mask);
- static inline void DSPI_DisableInterrupts(SPI_Type *base, uint32_t mask)
- {
- base->RSER &= ~mask;
- }
- static inline void DSPI_EnableDMA(SPI_Type *base, uint32_t mask)
- {
- base->RSER |= mask;
- }
- static inline void DSPI_DisableDMA(SPI_Type *base, uint32_t mask)
- {
- base->RSER &= ~mask;
- }
- static inline uint32_t DSPI_MasterGetTxRegisterAddress(SPI_Type *base)
- {
- return (uint32_t) & (base->PUSHR);
- }
- static inline uint32_t DSPI_SlaveGetTxRegisterAddress(SPI_Type *base)
- {
- return (uint32_t) & (base->PUSHR_SLAVE);
- }
- static inline uint32_t DSPI_GetRxRegisterAddress(SPI_Type *base)
- {
- return (uint32_t) & (base->POPR);
- }
- uint32_t DSPI_GetInstance(SPI_Type *base);
- static inline void DSPI_SetMasterSlaveMode(SPI_Type *base, dspi_master_slave_mode_t mode)
- {
- base->MCR = (base->MCR & (~SPI_MCR_MSTR_MASK)) | SPI_MCR_MSTR(mode);
- }
- static inline bool DSPI_IsMaster(SPI_Type *base)
- {
- return (bool)((base->MCR) & SPI_MCR_MSTR_MASK);
- }
- static inline void DSPI_StartTransfer(SPI_Type *base)
- {
- base->MCR &= ~SPI_MCR_HALT_MASK;
- }
- static inline void DSPI_StopTransfer(SPI_Type *base)
- {
- base->MCR |= SPI_MCR_HALT_MASK;
- }
- static inline void DSPI_SetFifoEnable(SPI_Type *base, bool enableTxFifo, bool enableRxFifo)
- {
- base->MCR = (base->MCR & (~(SPI_MCR_DIS_RXF_MASK | SPI_MCR_DIS_TXF_MASK))) | SPI_MCR_DIS_TXF(!enableTxFifo) |
- SPI_MCR_DIS_RXF(!enableRxFifo);
- }
- static inline void DSPI_FlushFifo(SPI_Type *base, bool flushTxFifo, bool flushRxFifo)
- {
- base->MCR = (base->MCR & (~(SPI_MCR_CLR_TXF_MASK | SPI_MCR_CLR_RXF_MASK))) | SPI_MCR_CLR_TXF(flushTxFifo) |
- SPI_MCR_CLR_RXF(flushRxFifo);
- }
- static inline void DSPI_SetAllPcsPolarity(SPI_Type *base, uint32_t mask)
- {
- base->MCR = (base->MCR & ~SPI_MCR_PCSIS_MASK) | SPI_MCR_PCSIS(mask);
- }
- uint32_t DSPI_MasterSetBaudRate(SPI_Type *base,
- dspi_ctar_selection_t whichCtar,
- uint32_t baudRate_Bps,
- uint32_t srcClock_Hz);
- void DSPI_MasterSetDelayScaler(
- SPI_Type *base, dspi_ctar_selection_t whichCtar, uint32_t prescaler, uint32_t scaler, dspi_delay_type_t whichDelay);
- uint32_t DSPI_MasterSetDelayTimes(SPI_Type *base,
- dspi_ctar_selection_t whichCtar,
- dspi_delay_type_t whichDelay,
- uint32_t srcClock_Hz,
- uint32_t delayTimeInNanoSec);
- static inline void DSPI_MasterWriteData(SPI_Type *base, dspi_command_data_config_t *command, uint16_t data)
- {
- base->PUSHR = SPI_PUSHR_CONT(command->isPcsContinuous) | SPI_PUSHR_CTAS(command->whichCtar) |
- SPI_PUSHR_PCS(command->whichPcs) | SPI_PUSHR_EOQ(command->isEndOfQueue) |
- SPI_PUSHR_CTCNT(command->clearTransferCount) | SPI_PUSHR_TXDATA(data);
- }
- void DSPI_GetDefaultDataCommandConfig(dspi_command_data_config_t *command);
- void DSPI_MasterWriteDataBlocking(SPI_Type *base, dspi_command_data_config_t *command, uint16_t data);
- static inline uint32_t DSPI_MasterGetFormattedCommand(dspi_command_data_config_t *command)
- {
-
- return (uint32_t)(SPI_PUSHR_CONT(command->isPcsContinuous) | SPI_PUSHR_CTAS(command->whichCtar) |
- SPI_PUSHR_PCS(command->whichPcs) | SPI_PUSHR_EOQ(command->isEndOfQueue) |
- SPI_PUSHR_CTCNT(command->clearTransferCount));
- }
- void DSPI_MasterWriteCommandDataBlocking(SPI_Type *base, uint32_t data);
- static inline void DSPI_SlaveWriteData(SPI_Type *base, uint32_t data)
- {
- base->PUSHR_SLAVE = data;
- }
- void DSPI_SlaveWriteDataBlocking(SPI_Type *base, uint32_t data);
- static inline uint32_t DSPI_ReadData(SPI_Type *base)
- {
- return (base->POPR);
- }
- void DSPI_SetDummyData(SPI_Type *base, uint8_t dummyData);
- void DSPI_MasterTransferCreateHandle(SPI_Type *base,
- dspi_master_handle_t *handle,
- dspi_master_transfer_callback_t callback,
- void *userData);
- status_t DSPI_MasterTransferBlocking(SPI_Type *base, dspi_transfer_t *transfer);
- status_t DSPI_MasterTransferNonBlocking(SPI_Type *base, dspi_master_handle_t *handle, dspi_transfer_t *transfer);
- status_t DSPI_MasterHalfDuplexTransferBlocking(SPI_Type *base, dspi_half_duplex_transfer_t *xfer);
- status_t DSPI_MasterHalfDuplexTransferNonBlocking(SPI_Type *base,
- dspi_master_handle_t *handle,
- dspi_half_duplex_transfer_t *xfer);
- status_t DSPI_MasterTransferGetCount(SPI_Type *base, dspi_master_handle_t *handle, size_t *count);
- void DSPI_MasterTransferAbort(SPI_Type *base, dspi_master_handle_t *handle);
- void DSPI_MasterTransferHandleIRQ(SPI_Type *base, dspi_master_handle_t *handle);
- void DSPI_SlaveTransferCreateHandle(SPI_Type *base,
- dspi_slave_handle_t *handle,
- dspi_slave_transfer_callback_t callback,
- void *userData);
- status_t DSPI_SlaveTransferNonBlocking(SPI_Type *base, dspi_slave_handle_t *handle, dspi_transfer_t *transfer);
- status_t DSPI_SlaveTransferGetCount(SPI_Type *base, dspi_slave_handle_t *handle, size_t *count);
- void DSPI_SlaveTransferAbort(SPI_Type *base, dspi_slave_handle_t *handle);
- void DSPI_SlaveTransferHandleIRQ(SPI_Type *base, dspi_slave_handle_t *handle);
- #if defined(__cplusplus)
- }
- #endif
-
- #endif
|