1 /*
2 * Copyright 2017-2020,2022 NXP
3 * All rights reserved.
4 *
5 *
6 * SPDX-License-Identifier: BSD-3-Clause
7 */
8
9 #ifndef FSL_SPI_H_
10 #define FSL_SPI_H_
11
12 #include "fsl_common.h"
13
14 /*!
15 * @addtogroup spi_driver
16 * @{
17 */
18
19 /*! @file */
20
21 /*******************************************************************************
22 * Definitions
23 ******************************************************************************/
24
25 /*! @name Driver version */
26 /*! @{ */
27 /*! @brief SPI driver version. */
28 #define FSL_SPI_DRIVER_VERSION (MAKE_VERSION(2, 0, 7))
29 /*! @} */
30
31 #ifndef SPI_DUMMYDATA
32 /*! @brief SPI dummy transfer data, the data is sent while txBuff is NULL. */
33 #define SPI_DUMMYDATA (0x00U)
34 #endif
35
36 /* Macro gate for enable/disable the SPI transactional API. 1 for enable, 0 for disable. */
37 #ifndef FSL_SDK_ENABLE_SPI_DRIVER_TRANSACTIONAL_APIS
38 #define FSL_SDK_ENABLE_SPI_DRIVER_TRANSACTIONAL_APIS 1
39 #endif
40
41 /*! @brief Retry times for waiting flag. */
42 #ifndef SPI_RETRY_TIMES
43 #define SPI_RETRY_TIMES 0U /* Define to zero means keep waiting until the flag is assert/deassert. */
44 #endif
45
46 /* @brief Dummy data for each instance. This data is used when user's tx buffer is NULL*/
47 extern volatile uint16_t s_dummyData[];
48
49 /*! @brief SPI transfer option.*/
50 enum _spi_xfer_option
51 {
52 kSPI_EndOfFrame = (SPI_TXDATCTL_EOF_MASK), /*!< Add delay at the end of each frame(the last clk edge). */
53 kSPI_EndOfTransfer =
54 (SPI_TXDATCTL_EOT_MASK), /*!< Re-assert the CS signal after transfer finishes to deselect slave. */
55 kSPI_ReceiveIgnore = (SPI_TXDATCTL_RXIGNORE_MASK), /*!< Ignore the receive data. */
56 };
57
58 /*! @brief SPI data shifter direction options.*/
59 typedef enum _spi_shift_direction
60 {
61 kSPI_MsbFirst = 0U, /*!< Data transfers start with most significant bit. */
62 kSPI_LsbFirst = 1U, /*!< Data transfers start with least significant bit. */
63 } spi_shift_direction_t;
64
65 /*! @brief SPI clock polarity configuration.*/
66 typedef enum _spi_clock_polarity
67 {
68 kSPI_ClockPolarityActiveHigh = 0x0U, /*!< Active-high SPI clock (idles low). */
69 kSPI_ClockPolarityActiveLow = 0x1U, /*!< Active-low SPI clock (idles high). */
70 } spi_clock_polarity_t;
71
72 /*! @brief SPI clock phase configuration.*/
73 typedef enum _spi_clock_phase
74 {
75 kSPI_ClockPhaseFirstEdge = 0x0U, /*!< First edge on SCK occurs at the middle of the first
76 * cycle of a data transfer. */
77 kSPI_ClockPhaseSecondEdge = 0x1U, /*!< First edge on SCK occurs at the start of the
78 * first cycle of a data transfer. */
79 } spi_clock_phase_t;
80
81 /*! @brief Slave select */
82 typedef enum _spi_ssel
83 {
84 kSPI_Ssel0Assert = (int)(~SPI_TXDATCTL_TXSSEL0_N_MASK), /*!< Slave select 0 */
85 #if defined(SPI_TXDATCTL_TXSSEL1_N_MASK)
86 kSPI_Ssel1Assert = (int)(~SPI_TXDATCTL_TXSSEL1_N_MASK), /*!< Slave select 1 */
87 #endif
88 #if defined(SPI_TXDATCTL_TXSSEL2_N_MASK)
89 kSPI_Ssel2Assert = (int)(~SPI_TXDATCTL_TXSSEL2_N_MASK), /*!< Slave select 2 */
90 #endif
91 #if defined(SPI_TXDATCTL_TXSSEL3_N_MASK)
92 kSPI_Ssel3Assert = (int)(~SPI_TXDATCTL_TXSSEL3_N_MASK), /*!< Slave select 3 */
93 #endif
94 kSPI_SselDeAssertAll = (SPI_TXDATCTL_TXSSEL0_N_MASK
95 #if defined(FSL_FEATURE_SPI_HAS_SSEL1) & FSL_FEATURE_SPI_HAS_SSEL1
96 | SPI_TXDATCTL_TXSSEL1_N_MASK
97 #endif
98 #if defined(FSL_FEATURE_SPI_HAS_SSEL2) & FSL_FEATURE_SPI_HAS_SSEL2
99 | SPI_TXDATCTL_TXSSEL2_N_MASK
100 #endif
101 #if defined(FSL_FEATURE_SPI_HAS_SSEL3) & FSL_FEATURE_SPI_HAS_SSEL3
102 | SPI_TXDATCTL_TXSSEL3_N_MASK
103 #endif
104 ),
105 } spi_ssel_t;
106
107 /*! @brief ssel polarity */
108 typedef enum _spi_spol
109 {
110 #if defined(FSL_FEATURE_SPI_HAS_SSEL0) & FSL_FEATURE_SPI_HAS_SSEL0
111 kSPI_Spol0ActiveHigh = SPI_CFG_SPOL0_MASK,
112 #endif
113 #if defined(FSL_FEATURE_SPI_HAS_SSEL1) & FSL_FEATURE_SPI_HAS_SSEL1
114 kSPI_Spol1ActiveHigh = SPI_CFG_SPOL1_MASK,
115 #endif
116 #if defined(FSL_FEATURE_SPI_HAS_SSEL2) & FSL_FEATURE_SPI_HAS_SSEL2
117 kSPI_Spol2ActiveHigh = SPI_CFG_SPOL2_MASK,
118 #endif
119 #if defined(FSL_FEATURE_SPI_HAS_SSEL3) & FSL_FEATURE_SPI_HAS_SSEL3
120 kSPI_Spol3ActiveHigh = SPI_CFG_SPOL3_MASK,
121 #endif
122 kSPI_SpolActiveAllHigh = (SPI_CFG_SPOL0_MASK
123 #if defined(FSL_FEATURE_SPI_HAS_SSEL1) & FSL_FEATURE_SPI_HAS_SSEL1
124 | SPI_CFG_SPOL1_MASK
125 #endif
126 #if defined(FSL_FEATURE_SPI_HAS_SSEL2) & FSL_FEATURE_SPI_HAS_SSEL2
127 | SPI_CFG_SPOL2_MASK
128 #endif
129 #if defined(FSL_FEATURE_SPI_HAS_SSEL3) & FSL_FEATURE_SPI_HAS_SSEL3
130 | SPI_CFG_SPOL3_MASK
131 #endif
132 ),
133 kSPI_SpolActiveAllLow = (int)(~kSPI_SpolActiveAllHigh),
134 } spi_spol_t;
135
136 /*! @brief Transfer data width */
137 typedef enum _spi_data_width
138 {
139 kSPI_Data4Bits = 3, /*!< 4 bits data width */
140 kSPI_Data5Bits = 4, /*!< 5 bits data width */
141 kSPI_Data6Bits = 5, /*!< 6 bits data width */
142 kSPI_Data7Bits = 6, /*!< 7 bits data width */
143 kSPI_Data8Bits = 7, /*!< 8 bits data width */
144 kSPI_Data9Bits = 8, /*!< 9 bits data width */
145 kSPI_Data10Bits = 9, /*!< 10 bits data width */
146 kSPI_Data11Bits = 10, /*!< 11 bits data width */
147 kSPI_Data12Bits = 11, /*!< 12 bits data width */
148 kSPI_Data13Bits = 12, /*!< 13 bits data width */
149 kSPI_Data14Bits = 13, /*!< 14 bits data width */
150 kSPI_Data15Bits = 14, /*!< 15 bits data width */
151 kSPI_Data16Bits = 15, /*!< 16 bits data width */
152 } spi_data_width_t;
153
154 /*! @brief SPI delay time configure structure.*/
155 typedef struct _spi_delay_config
156 {
157 uint8_t preDelay; /*!< Delay between SSEL assertion and the beginning of transfer. */
158 uint8_t postDelay; /*!< Delay between the end of transfer and SSEL deassertion. */
159 uint8_t frameDelay; /*!< Delay between frame to frame. */
160 uint8_t transferDelay; /*!< Delay between transfer to transfer. */
161 } spi_delay_config_t;
162
163 /*! @brief SPI master user configure structure.*/
164 typedef struct _spi_master_config
165 {
166 bool enableLoopback; /*!< Enable loopback for test purpose */
167 bool enableMaster; /*!< Enable SPI at initialization time */
168 uint32_t baudRate_Bps; /*!< Baud Rate for SPI in Hz */
169 spi_clock_polarity_t clockPolarity; /*!< Clock polarity */
170 spi_clock_phase_t clockPhase; /*!< Clock phase */
171 spi_shift_direction_t direction; /*!< MSB or LSB */
172 uint8_t dataWidth; /*!< Width of the data */
173 spi_ssel_t sselNumber; /*!< Slave select number */
174 spi_spol_t sselPolarity; /*!< Configure active CS polarity */
175 spi_delay_config_t delayConfig; /*!< Configure for delay time. */
176 } spi_master_config_t;
177
178 /*! @brief SPI slave user configure structure.*/
179 typedef struct _spi_slave_config
180 {
181 bool enableSlave; /*!< Enable SPI at initialization time */
182 spi_clock_polarity_t clockPolarity; /*!< Clock polarity */
183 spi_clock_phase_t clockPhase; /*!< Clock phase */
184 spi_shift_direction_t direction; /*!< MSB or LSB */
185 uint8_t dataWidth; /*!< Width of the data */
186 spi_spol_t sselPolarity; /*!< Configure active CS polarity */
187 } spi_slave_config_t;
188
189 /*! @brief SPI transfer status.*/
190 enum
191 {
192 kStatus_SPI_Busy = MAKE_STATUS(kStatusGroup_LPC_MINISPI, 0), /*!< SPI bus is busy */
193 kStatus_SPI_Idle = MAKE_STATUS(kStatusGroup_LPC_MINISPI, 1), /*!< SPI is idle */
194 kStatus_SPI_Error = MAKE_STATUS(kStatusGroup_LPC_MINISPI, 2), /*!< SPI error */
195 kStatus_SPI_BaudrateNotSupport =
196 MAKE_STATUS(kStatusGroup_LPC_MINISPI, 3), /*!< Baudrate is not support in current clock source */
197 kStatus_SPI_Timeout = MAKE_STATUS(kStatusGroup_LPC_MINISPI, 4) /*!< SPI Timeout polling status flags. */
198 };
199
200 /*! @brief SPI interrupt sources.*/
201 enum _spi_interrupt_enable
202 {
203 kSPI_RxReadyInterruptEnable = SPI_INTENSET_RXRDYEN_MASK, /*!< Rx ready interrupt */
204 kSPI_TxReadyInterruptEnable = SPI_INTENSET_TXRDYEN_MASK, /*!< Tx ready interrupt */
205 kSPI_RxOverrunInterruptEnable = SPI_INTENSET_RXOVEN_MASK, /*!< Rx overrun interrupt */
206 kSPI_TxUnderrunInterruptEnable = SPI_INTENSET_TXUREN_MASK, /*!< Tx underrun interrupt */
207 kSPI_SlaveSelectAssertInterruptEnable = SPI_INTENSET_SSAEN_MASK, /*!< Slave select assert interrupt */
208 kSPI_SlaveSelectDeassertInterruptEnable = SPI_INTENSET_SSDEN_MASK, /*!< Slave select deassert interrupt */
209 kSPI_AllInterruptEnable = (SPI_INTENSET_RXRDYEN_MASK | SPI_INTENSET_TXRDYEN_MASK | SPI_INTENSET_RXOVEN_MASK |
210 SPI_INTENSET_TXUREN_MASK | SPI_INTENSET_SSAEN_MASK | SPI_INTENSET_SSDEN_MASK)
211 };
212
213 /*! @brief SPI status flags.*/
214 enum _spi_status_flags
215 {
216 kSPI_RxReadyFlag = SPI_STAT_RXRDY_MASK, /*!< Receive ready flag. */
217 kSPI_TxReadyFlag = SPI_STAT_TXRDY_MASK, /*!< Transmit ready flag. */
218 kSPI_RxOverrunFlag = SPI_STAT_RXOV_MASK, /*!< Receive overrun flag. */
219 kSPI_TxUnderrunFlag = SPI_STAT_TXUR_MASK, /*!< Transmit underrun flag. */
220 kSPI_SlaveSelectAssertFlag = SPI_STAT_SSA_MASK, /*!< Slave select assert flag. */
221 kSPI_SlaveSelectDeassertFlag = SPI_STAT_SSD_MASK, /*!< slave select deassert flag. */
222 kSPI_StallFlag = SPI_STAT_STALLED_MASK, /*!< Stall flag. */
223 kSPI_EndTransferFlag = SPI_STAT_ENDTRANSFER_MASK, /*!< End transfer bit. */
224 kSPI_MasterIdleFlag = SPI_STAT_MSTIDLE_MASK, /*!< Master in idle status flag. */
225 };
226
227 /*! @brief SPI transfer structure */
228 typedef struct _spi_transfer
229 {
230 const uint8_t *txData; /*!< Send buffer */
231 uint8_t *rxData; /*!< Receive buffer */
232 size_t dataSize; /*!< Transfer bytes */
233 uint32_t configFlags; /*!< Additional option to control transfer @ref _spi_xfer_option. */
234 } spi_transfer_t;
235
236 #if defined(FSL_SDK_ENABLE_SPI_DRIVER_TRANSACTIONAL_APIS) && (FSL_SDK_ENABLE_SPI_DRIVER_TRANSACTIONAL_APIS)
237 /*! @brief Master handle type */
238 typedef struct _spi_master_handle spi_master_handle_t;
239
240 /*! @brief Slave handle type */
241 typedef spi_master_handle_t spi_slave_handle_t;
242
243 /*! @brief SPI master callback for finished transmit */
244 typedef void (*spi_master_callback_t)(SPI_Type *base, spi_master_handle_t *handle, status_t status, void *userData);
245
246 /*! @brief SPI slave callback for finished transmit */
247 typedef void (*spi_slave_callback_t)(SPI_Type *base, spi_slave_handle_t *handle, status_t status, void *userData);
248
249 /*! @brief SPI transfer handle structure */
250 struct _spi_master_handle
251 {
252 const uint8_t *volatile txData; /*!< Transfer buffer */
253 uint8_t *volatile rxData; /*!< Receive buffer */
254 volatile size_t txRemainingBytes; /*!< Number of data to be transmitted [in bytes] */
255 volatile size_t rxRemainingBytes; /*!< Number of data to be received [in bytes] */
256 size_t totalByteCount; /*!< A number of transfer bytes */
257 volatile uint32_t state; /*!< SPI internal state */
258 spi_master_callback_t callback; /*!< SPI callback */
259 void *userData; /*!< Callback parameter */
260 uint8_t dataWidth; /*!< Width of the data [Valid values: 1 to 16] */
261 uint32_t lastCommand; /*!< Last command for transfer. */
262 };
263 #endif /* FSL_SDK_ENABLE_SPI_DRIVER_TRANSACTIONAL_APIS */
264
265 #if defined(__cplusplus)
266 extern "C" {
267 #endif
268 /*******************************************************************************
269 * API
270 ******************************************************************************/
271
272 /*! @brief Returns instance number for SPI peripheral base address. */
273 uint32_t SPI_GetInstance(SPI_Type *base);
274
275 /*!
276 * @name Initialization and deinitialization
277 * @{
278 */
279
280 /*!
281 * @brief Sets the SPI master configuration structure to default values.
282 *
283 * The purpose of this API is to get the configuration structure initialized for use in SPI_MasterInit().
284 * User may use the initialized structure unchanged in SPI_MasterInit(), or modify
285 * some fields of the structure before calling SPI_MasterInit(). After calling this API,
286 * the master is ready to transfer.
287 * Example:
288 @code
289 spi_master_config_t config;
290 SPI_MasterGetDefaultConfig(&config);
291 @endcode
292 *
293 * @param config pointer to master config structure
294 */
295 void SPI_MasterGetDefaultConfig(spi_master_config_t *config);
296
297 /*!
298 * @brief Initializes the SPI with master configuration.
299 *
300 * The configuration structure can be filled by user from scratch, or be set with default
301 * values by SPI_MasterGetDefaultConfig(). After calling this API, the slave is ready to transfer.
302 * Example
303 @code
304 spi_master_config_t config = {
305 .baudRate_Bps = 500000,
306 ...
307 };
308 SPI_MasterInit(SPI0, &config);
309 @endcode
310 *
311 * @param base SPI base pointer
312 * @param config pointer to master configuration structure
313 * @param srcClock_Hz Source clock frequency.
314 */
315 status_t SPI_MasterInit(SPI_Type *base, const spi_master_config_t *config, uint32_t srcClock_Hz);
316
317 /*!
318 * @brief Sets the SPI slave configuration structure to default values.
319 *
320 * The purpose of this API is to get the configuration structure initialized for use in SPI_SlaveInit().
321 * Modify some fields of the structure before calling SPI_SlaveInit().
322 * Example:
323 @code
324 spi_slave_config_t config;
325 SPI_SlaveGetDefaultConfig(&config);
326 @endcode
327 *
328 * @param config pointer to slave configuration structure
329 */
330 void SPI_SlaveGetDefaultConfig(spi_slave_config_t *config);
331
332 /*!
333 * @brief Initializes the SPI with slave configuration.
334 *
335 * The configuration structure can be filled by user from scratch or be set with
336 * default values by SPI_SlaveGetDefaultConfig().
337 * After calling this API, the slave is ready to transfer.
338 * Example
339 @code
340 spi_slave_config_t config = {
341 .polarity = kSPI_ClockPolarityActiveHigh;
342 .phase = kSPI_ClockPhaseFirstEdge;
343 .direction = kSPI_MsbFirst;
344 ...
345 };
346 SPI_SlaveInit(SPI0, &config);
347 @endcode
348 *
349 * @param base SPI base pointer
350 * @param config pointer to slave configuration structure
351 */
352 status_t SPI_SlaveInit(SPI_Type *base, const spi_slave_config_t *config);
353
354 /*!
355 * @brief De-initializes the SPI.
356 *
357 * Calling this API resets the SPI module, gates the SPI clock.
358 * Disable the fifo if enabled.
359 * The SPI module can't work unless calling the SPI_MasterInit/SPI_SlaveInit to initialize module.
360 *
361 * @param base SPI base pointer
362 */
363 void SPI_Deinit(SPI_Type *base);
364
365 /*!
366
367 * @brief Enable or disable the SPI Master or Slave
368 * @param base SPI base pointer
369 * @param enable or disable ( true = enable, false = disable)
370 */
SPI_Enable(SPI_Type * base,bool enable)371 static inline void SPI_Enable(SPI_Type *base, bool enable)
372 {
373 if (enable)
374 {
375 base->CFG |= SPI_CFG_ENABLE_MASK;
376 }
377 else
378 {
379 base->CFG &= ~SPI_CFG_ENABLE_MASK;
380 }
381 }
382
383 /*! @} */
384
385 /*!
386 * @name Status
387 * @{
388 */
389
390 /*!
391 * @brief Gets the status flag.
392 *
393 * @param base SPI base pointer
394 * @return SPI Status, use status flag to AND @ref _spi_status_flags could get the related status.
395 */
SPI_GetStatusFlags(SPI_Type * base)396 static inline uint32_t SPI_GetStatusFlags(SPI_Type *base)
397 {
398 assert(NULL != base);
399 return base->STAT;
400 }
401
402 /*!
403 * @brief Clear the status flag.
404 *
405 * @param base SPI base pointer
406 * @param mask SPI Status, use status flag to AND @ref _spi_status_flags could get the related status.
407 */
SPI_ClearStatusFlags(SPI_Type * base,uint32_t mask)408 static inline void SPI_ClearStatusFlags(SPI_Type *base, uint32_t mask)
409 {
410 assert(NULL != base);
411 base->STAT |= mask;
412 }
413 /*! @} */
414
415 /*!
416 * @name Interrupts
417 * @{
418 */
419
420 /*!
421 * @brief Enables the interrupt for the SPI.
422 *
423 * @param base SPI base pointer
424 * @param irqs SPI interrupt source. The parameter can be any combination of the following values:
425 * @arg kSPI_RxReadyInterruptEnable
426 * @arg kSPI_TxReadyInterruptEnable
427 */
SPI_EnableInterrupts(SPI_Type * base,uint32_t irqs)428 static inline void SPI_EnableInterrupts(SPI_Type *base, uint32_t irqs)
429 {
430 assert(NULL != base);
431 base->INTENSET = irqs;
432 }
433
434 /*!
435 * @brief Disables the interrupt for the SPI.
436 *
437 * @param base SPI base pointer
438 * @param irqs SPI interrupt source. The parameter can be any combination of the following values:
439 * @arg kSPI_RxReadyInterruptEnable
440 * @arg kSPI_TxReadyInterruptEnable
441 */
SPI_DisableInterrupts(SPI_Type * base,uint32_t irqs)442 static inline void SPI_DisableInterrupts(SPI_Type *base, uint32_t irqs)
443 {
444 assert(NULL != base);
445 base->INTENCLR = irqs;
446 }
447 /*! @} */
448
449 /*!
450 * @name Bus Operations
451 * @{
452 */
453
454 /*!
455 * @brief Returns whether the SPI module is in master mode.
456 *
457 * @param base SPI peripheral address.
458 * @return Returns true if the module is in master mode or false if the module is in slave mode.
459 */
SPI_IsMaster(SPI_Type * base)460 static inline bool SPI_IsMaster(SPI_Type *base)
461 {
462 return (bool)(((base->CFG) & SPI_CFG_MASTER_MASK) >> SPI_CFG_MASTER_SHIFT);
463 }
464 /*!
465 * @brief Sets the baud rate for SPI transfer. This is only used in master.
466 *
467 * @param base SPI base pointer
468 * @param baudrate_Bps baud rate needed in Hz.
469 * @param srcClock_Hz SPI source clock frequency in Hz.
470 */
471 status_t SPI_MasterSetBaudRate(SPI_Type *base, uint32_t baudrate_Bps, uint32_t srcClock_Hz);
472
473 /*!
474 * @brief Writes a data into the SPI data register directly.
475 *
476 * @param base SPI base pointer
477 * @param data needs to be write.
478 */
SPI_WriteData(SPI_Type * base,uint16_t data)479 static inline void SPI_WriteData(SPI_Type *base, uint16_t data)
480 {
481 base->TXDAT = ((uint32_t)data & 0x0000FFFFU);
482 }
483
484 /*!
485 * @brief Writes a data into the SPI TXCTL register directly.
486 *
487 * @param base SPI base pointer
488 * @param configFlags control command needs to be written.
489 */
SPI_WriteConfigFlags(SPI_Type * base,uint32_t configFlags)490 static inline void SPI_WriteConfigFlags(SPI_Type *base, uint32_t configFlags)
491 {
492 base->TXCTL = (base->TXCTL & ~(SPI_TXCTL_EOT_MASK | SPI_TXCTL_EOF_MASK | SPI_TXCTL_RXIGNORE_MASK)) |
493 (configFlags & (SPI_TXCTL_EOT_MASK | SPI_TXCTL_EOF_MASK | SPI_TXCTL_RXIGNORE_MASK));
494 }
495
496 /*!
497 * @brief Writes a data control info and data into the SPI TX register directly.
498 *
499 * @param base SPI base pointer
500 * @param data value needs to be written.
501 * @param configFlags control command needs to be written.
502 */
503 void SPI_WriteDataWithConfigFlags(SPI_Type *base, uint16_t data, uint32_t configFlags);
504
505 /*!
506 * @brief Gets a data from the SPI data register.
507 *
508 * @param base SPI base pointer
509 * @return Data in the register.
510 */
SPI_ReadData(SPI_Type * base)511 static inline uint32_t SPI_ReadData(SPI_Type *base)
512 {
513 return (base->RXDAT & 0x0000FFFFU);
514 }
515
516 /*!
517 * @brief Set delay time for transfer.
518 * the delay uint is SPI clock time, maximum value is 0xF.
519 * @param base SPI base pointer
520 * @param config configuration for delay option @ref spi_delay_config_t.
521 */
522 void SPI_SetTransferDelay(SPI_Type *base, const spi_delay_config_t *config);
523
524 /*!
525 * @brief Set up the dummy data. This API can change the default data to be transferred
526 * when users set the tx buffer to NULL.
527 *
528 * @param base SPI peripheral address.
529 * @param dummyData Data to be transferred when tx buffer is NULL.
530 */
531 void SPI_SetDummyData(SPI_Type *base, uint16_t dummyData);
532
533 /*!
534 * @brief Transfers a block of data using a polling method.
535 *
536 * @param base SPI base pointer
537 * @param xfer pointer to spi_xfer_config_t structure
538 * @retval kStatus_Success Successfully start a transfer.
539 * @retval kStatus_InvalidArgument Input argument is invalid.
540 * @retval kStatus_SPI_Timeout The transfer timed out and was aborted.
541 */
542 status_t SPI_MasterTransferBlocking(SPI_Type *base, spi_transfer_t *xfer);
543 /*! @} */
544
545 #if defined(FSL_SDK_ENABLE_SPI_DRIVER_TRANSACTIONAL_APIS) && (FSL_SDK_ENABLE_SPI_DRIVER_TRANSACTIONAL_APIS)
546 /*!
547 * @name Transactional
548 * @{
549 */
550
551 /*!
552 * @brief Initializes the SPI master handle.
553 *
554 * This function initializes the SPI master handle which can be used for other SPI master transactional APIs. Usually,
555 * for a specified SPI instance, call this API once to get the initialized handle.
556 *
557 * @param base SPI peripheral base address.
558 * @param handle SPI handle pointer.
559 * @param callback Callback function.
560 * @param userData User data.
561 */
562 status_t SPI_MasterTransferCreateHandle(SPI_Type *base,
563 spi_master_handle_t *handle,
564 spi_master_callback_t callback,
565 void *userData);
566
567 /*!
568 * @brief Performs a non-blocking SPI interrupt transfer.
569 *
570 * @param base SPI peripheral base address.
571 * @param handle pointer to spi_master_handle_t structure which stores the transfer state
572 * @param xfer pointer to spi_xfer_config_t structure
573 * @retval kStatus_Success Successfully start a transfer.
574 * @retval kStatus_InvalidArgument Input argument is invalid.
575 * @retval kStatus_SPI_Busy SPI is not idle, is running another transfer.
576 */
577 status_t SPI_MasterTransferNonBlocking(SPI_Type *base, spi_master_handle_t *handle, spi_transfer_t *xfer);
578
579 /*!
580 * @brief Gets the master transfer count.
581 *
582 * This function gets the master transfer count.
583 *
584 * @param base SPI peripheral base address.
585 * @param handle Pointer to the spi_master_handle_t structure which stores the transfer state.
586 * @param count The number of bytes transferred by using the non-blocking transaction.
587 * @return status of status_t.
588 */
589 status_t SPI_MasterTransferGetCount(SPI_Type *base, spi_master_handle_t *handle, size_t *count);
590
591 /*!
592 * @brief SPI master aborts a transfer using an interrupt.
593 *
594 * This function aborts a transfer using an interrupt.
595 *
596 * @param base SPI peripheral base address.
597 * @param handle Pointer to the spi_master_handle_t structure which stores the transfer state.
598 */
599 void SPI_MasterTransferAbort(SPI_Type *base, spi_master_handle_t *handle);
600
601 /*!
602 * @brief Interrupts the handler for the SPI.
603 *
604 * @param base SPI peripheral base address.
605 * @param handle pointer to spi_master_handle_t structure which stores the transfer state.
606 */
607 void SPI_MasterTransferHandleIRQ(SPI_Type *base, spi_master_handle_t *handle);
608
609 /*!
610 * @brief Initializes the SPI slave handle.
611 *
612 * This function initializes the SPI slave handle which can be used for other SPI slave transactional APIs. Usually,
613 * for a specified SPI instance, call this API once to get the initialized handle.
614 *
615 * @param base SPI peripheral base address.
616 * @param handle SPI handle pointer.
617 * @param callback Callback function.
618 * @param userData User data.
619 */
620 status_t SPI_SlaveTransferCreateHandle(SPI_Type *base,
621 spi_slave_handle_t *handle,
622 spi_slave_callback_t callback,
623 void *userData);
624
625 /*!
626 * @brief Performs a non-blocking SPI slave interrupt transfer.
627 *
628 * @note The API returns immediately after the transfer initialization is finished.
629 *
630 * @param base SPI peripheral base address.
631 * @param handle pointer to spi_master_handle_t structure which stores the transfer state
632 * @param xfer pointer to spi_xfer_config_t structure
633 * @retval kStatus_Success Successfully start a transfer.
634 * @retval kStatus_InvalidArgument Input argument is invalid.
635 * @retval kStatus_SPI_Busy SPI is not idle, is running another transfer.
636 */
637 status_t SPI_SlaveTransferNonBlocking(SPI_Type *base, spi_slave_handle_t *handle, spi_transfer_t *xfer);
638
639 /*!
640 * @brief Gets the slave transfer count.
641 *
642 * This function gets the slave transfer count.
643 *
644 * @param base SPI peripheral base address.
645 * @param handle Pointer to the spi_master_handle_t structure which stores the transfer state.
646 * @param count The number of bytes transferred by using the non-blocking transaction.
647 * @return status of status_t.
648 */
SPI_SlaveTransferGetCount(SPI_Type * base,spi_slave_handle_t * handle,size_t * count)649 static inline status_t SPI_SlaveTransferGetCount(SPI_Type *base, spi_slave_handle_t *handle, size_t *count)
650 {
651 return SPI_MasterTransferGetCount(base, (spi_master_handle_t *)handle, count);
652 }
653
654 /*!
655 * @brief SPI slave aborts a transfer using an interrupt.
656 *
657 * This function aborts a transfer using an interrupt.
658 *
659 * @param base SPI peripheral base address.
660 * @param handle Pointer to the spi_slave_handle_t structure which stores the transfer state.
661 */
SPI_SlaveTransferAbort(SPI_Type * base,spi_slave_handle_t * handle)662 static inline void SPI_SlaveTransferAbort(SPI_Type *base, spi_slave_handle_t *handle)
663 {
664 SPI_MasterTransferAbort(base, (spi_master_handle_t *)handle);
665 }
666
667 /*!
668 * @brief Interrupts a handler for the SPI slave.
669 *
670 * @param base SPI peripheral base address.
671 * @param handle pointer to spi_slave_handle_t structure which stores the transfer state
672 */
673 void SPI_SlaveTransferHandleIRQ(SPI_Type *base, spi_slave_handle_t *handle);
674 /*! @} */
675 #endif /* FSL_SDK_ENABLE_SPI_DRIVER_TRANSACTIONAL_APIS */
676
677 #if defined(__cplusplus)
678 }
679 #endif
680
681 /*! @} */
682
683 #endif /* FSL_SPI_H_*/
684