Kinetis Bootloader  2.0.0
Common bootloader for Kinetis devices
fsl_spi.h
1 /*
2  * Copyright (c) 2015, Freescale Semiconductor, Inc.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without modification,
6  * are permitted provided that the following conditions are met:
7  *
8  * o Redistributions of source code must retain the above copyright notice, this list
9  * of conditions and the following disclaimer.
10  *
11  * o Redistributions in binary form must reproduce the above copyright notice, this
12  * list of conditions and the following disclaimer in the documentation and/or
13  * other materials provided with the distribution.
14  *
15  * o Neither the name of Freescale Semiconductor, Inc. nor the names of its
16  * contributors may be used tom endorse or promote products derived from this
17  * software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
23  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 #ifndef _FSL_SPI_H_
31 #define _FSL_SPI_H_
32 
33 #include "fsl_common.h"
34 
40 /*******************************************************************************
41  * Definitions
42  ******************************************************************************/
44 #define FSL_SPI_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))
47 #define SPI_DUMMYDATA (0xFFU)
48 
51 {
52  kStatus_SPI_Busy = MAKE_STATUS(kStatusGroup_SPI, 0),
53  kStatus_SPI_Idle = MAKE_STATUS(kStatusGroup_SPI, 1),
55 };
56 
58 typedef enum _spi_clock_polarity
59 {
63 
65 typedef enum _spi_clock_phase
66 {
72 
74 typedef enum _spi_shift_direction
75 {
76  kSPI_MsbFirst = 0x0U,
79 
81 typedef enum _spi_ss_output_mode
82 {
87 
89 typedef enum _spi_pin_mode
90 {
97 
99 typedef enum _spi_data_bitcount_mode
100 {
101  kSPI_8BitMode = 0x0U,
104 
107 {
111 #if defined(FSL_FEATURE_SPI_HAS_FIFO) && FSL_FEATURE_SPI_HAS_FIFO
114 #endif /* FSL_FEATURE_SPI_HAS_FIFO */
115 };
116 
119 {
120  kSPI_RxBufferFullFlag = SPI_S_SPRF_MASK,
121  kSPI_MatchFlag = SPI_S_SPMF_MASK,
122  kSPI_TxBufferEmptyFlag = SPI_S_SPTEF_MASK,
123  kSPI_ModeFaultFlag = SPI_S_MODF_MASK,
124 #if defined(FSL_FEATURE_SPI_HAS_FIFO) && FSL_FEATURE_SPI_HAS_FIFO
125  kSPI_RxFifoNearFullFlag = SPI_S_RNFULLF_MASK,
126  kSPI_TxFifoNearEmptyFlag = SPI_S_TNEAREF_MASK,
127  kSPI_RxFifoFullFlag = SPI_S_TXFULLF_MASK,
128  kSPI_TxFifoEmptyFlag = SPI_S_RFIFOEF_MASK,
129  kSPI_TxFifoError = SPI_CI_TXFERR_MASK << 8U,
130  kSPI_RxFifoError = SPI_CI_RXFERR_MASK << 8U,
131  kSPI_TxOverflow = SPI_CI_TXFOF_MASK << 8U,
132  kSPI_RxOverflow = SPI_CI_RXFOF_MASK << 8U
133 #endif /* FSL_FEATURE_SPI_HAS_FIFO */
134 };
135 
136 #if defined(FSL_FEATURE_SPI_HAS_FIFO) && FSL_FEATURE_SPI_HAS_FIFO
137 
138 typedef enum _spi_w1c_interrupt
139 {
140  kSPI_RxFifoFullClearInterrupt = SPI_CI_SPRFCI_MASK,
141  kSPI_TxFifoEmptyClearInterrupt = SPI_CI_SPTEFCI_MASK,
142  kSPI_RxNearFullClearInterrupt = SPI_CI_RNFULLFCI_MASK,
143  kSPI_TxNearEmptyClearInterrupt = SPI_CI_TNEAREFCI_MASK
145 
147 typedef enum _spi_txfifo_watermark
148 {
152 
154 typedef enum _spi_rxfifo_watermark
155 {
159 #endif /* FSL_FEATURE_SPI_HAS_FIFO */
160 
161 #if defined(FSL_FEATURE_SPI_HAS_DMA_SUPPORT) && FSL_FEATURE_SPI_HAS_DMA_SUPPORT
162 
164 {
165  kSPI_TxDmaEnable = SPI_C2_TXDMAE_MASK,
166  kSPI_RxDmaEnable = SPI_C2_RXDMAE_MASK,
167  kSPI_DmaAllEnable = (SPI_C2_TXDMAE_MASK | SPI_C2_RXDMAE_MASK)
168 };
169 #endif /* FSL_FEATURE_SPI_HAS_DMA_SUPPORT */
170 
172 typedef struct _spi_master_config
173 {
179 #if defined(FSL_FEATURE_SPI_16BIT_TRANSFERS) && FSL_FEATURE_SPI_16BIT_TRANSFERS
181 #endif /* FSL_FEATURE_SPI_16BIT_TRANSFERS */
182 #if defined(FSL_FEATURE_SPI_HAS_FIFO) && FSL_FEATURE_SPI_HAS_FIFO
186 #endif /* FSL_FEATURE_SPI_HAS_FIFO */
189  uint32_t baudRate_Bps;
191 
193 typedef struct _spi_slave_config
194 {
195  bool enableSlave;
200 #if defined(FSL_FEATURE_SPI_16BIT_TRANSFERS) && FSL_FEATURE_SPI_16BIT_TRANSFERS
202 #endif /* FSL_FEATURE_SPI_16BIT_TRANSFERS */
203 #if defined(FSL_FEATURE_SPI_HAS_FIFO) && FSL_FEATURE_SPI_HAS_FIFO
207 #endif /* FSL_FEATURE_SPI_HAS_FIFO */
209 
211 typedef struct _spi_transfer
212 {
213  uint8_t *txData;
214  uint8_t *rxData;
215  size_t dataSize;
216  uint32_t flags;
218 
219 typedef struct _spi_master_handle spi_master_handle_t;
220 
222 typedef spi_master_handle_t spi_slave_handle_t;
223 
225 typedef void (*spi_master_callback_t)(SPI_Type *base, spi_master_handle_t *handle, status_t status, void *userData);
226 
228 typedef void (*spi_slave_callback_t)(SPI_Type *base, spi_slave_handle_t *handle, status_t status, void *userData);
229 
232 {
233  uint8_t *volatile txData;
234  uint8_t *volatile rxData;
235  volatile size_t txRemainingBytes;
236  volatile size_t rxRemainingBytes;
237  volatile uint32_t state;
238  size_t transferSize;
239  uint8_t bytePerFrame;
240  uint8_t watermark;
242  void *userData;
243 };
244 
245 #if defined(__cplusplus)
246 extern "C" {
247 #endif
248 /*******************************************************************************
249  * APIs
250  ******************************************************************************/
272 
291 void SPI_MasterInit(SPI_Type *base, const spi_master_config_t *config, uint32_t srcClock_Hz);
292 
307 
328 void SPI_SlaveInit(SPI_Type *base, const spi_slave_config_t *config);
329 
338 void SPI_Deinit(SPI_Type *base);
339 
346 static inline void SPI_Enable(I2C_Type *base, bool enable)
347 {
348  if (enable)
349  {
350  base->C1 |= SPI_C1_SPE_MASK;
351  }
352  else
353  {
354  base->C1 &= ~SPI_C1_SPE_MASK;
355  }
356 }
357 
371 uint32_t SPI_GetStatusFlags(SPI_Type *base);
372 
373 #if defined(FSL_FEATURE_SPI_HAS_FIFO) && FSL_FEATURE_SPI_HAS_FIFO
374 
385 static inline void SPI_ClearInterrupt(SPI_Type *base, uint32_t mask)
386 {
387  base->CI |= mask;
388 }
389 #endif /* FSL_FEATURE_SPI_HAS_FIFO */
390 
409 void SPI_EnableInterrupts(SPI_Type *base, uint32_t mask);
410 
422 void SPI_DisableInterrupts(SPI_Type *base, uint32_t mask);
423 
431 #if defined(FSL_FEATURE_SPI_HAS_DMA_SUPPORT) && FSL_FEATURE_SPI_HAS_DMA_SUPPORT
432 
439 static inline void SPI_EnableDMA(SPI_Type *base, uint32_t mask, bool enable)
440 {
441  if (enable)
442  {
443  base->C2 |= mask;
444  }
445  else
446  {
447  base->C2 &= ~mask;
448  }
449 }
450 #endif /* FSL_FEATURE_SPI_HAS_DMA_SUPPORT */
451 
460 static inline uint32_t SPI_GetDataRegisterAddress(SPI_Type *base)
461 {
462 #if defined(FSL_FEATURE_SPI_16BIT_TRANSFERS) && FSL_FEATURE_SPI_16BIT_TRANSFERS
463  return (uint32_t)(&(base->DL));
464 #else
465  return (uint32_t)(&(base->D));
466 #endif /* FSL_FEATURE_SPI_16BIT_TRANSFERS */
467 }
468 
483 void SPI_MasterSetBaudRate(SPI_Type *base, uint32_t baudRate_Bps, uint32_t srcClock_Hz);
484 
495 static inline void SPI_SetMatchData(SPI_Type *base, uint32_t matchData)
496 {
497 #if defined(FSL_FEATURE_SPI_16BIT_TRANSFERS) && FSL_FEATURE_SPI_16BIT_TRANSFERS
498  base->ML = matchData & 0xFFU;
499  base->MH = (matchData >> 8U) & 0xFFU;
500 #else
501  base->M = matchData;
502 #endif /* FSL_FEATURE_SPI_16BIT_TRANSFERS */
503 }
504 
505 #if defined(FSL_FEATURE_SPI_HAS_FIFO) && FSL_FEATURE_SPI_HAS_FIFO
506 
512 void SPI_EnableFIFO(SPI_Type *base, bool enable);
513 #endif
514 
524 void SPI_WriteBlocking(SPI_Type *base, uint8_t *buffer, size_t size);
525 
532 void SPI_WriteData(SPI_Type *base, uint16_t data);
533 
540 uint16_t SPI_ReadData(SPI_Type *base);
541 
560 void SPI_MasterTransferCreateHandle(SPI_Type *base,
561  spi_master_handle_t *handle,
562  spi_master_callback_t callback,
563  void *userData);
564 
573 status_t SPI_MasterTransferBlocking(SPI_Type *base, spi_transfer_t *xfer);
574 
588 status_t SPI_MasterTransferNonBlocking(SPI_Type *base, spi_master_handle_t *handle, spi_transfer_t *xfer);
589 
599 status_t SPI_MasterTransferGetCount(SPI_Type *base, spi_master_handle_t *handle, size_t *count);
600 
607 void SPI_MasterTransferAbort(SPI_Type *base, spi_master_handle_t *handle);
608 
615 void SPI_MasterTransferHandleIRQ(SPI_Type *base, spi_master_handle_t *handle);
616 
628 static inline void SPI_SlaveTransferCreateHandle(SPI_Type *base,
629  spi_slave_handle_t *handle,
630  spi_slave_callback_t callback,
631  void *userData)
632 {
633  SPI_MasterTransferCreateHandle(base, handle, callback, userData);
634 }
635 
653 static inline status_t SPI_SlaveTransferNonBlocking(SPI_Type *base, spi_slave_handle_t *handle, spi_transfer_t *xfer)
654 {
655  return SPI_MasterTransferNonBlocking(base, handle, xfer);
656 }
657 
667 static inline status_t SPI_SlaveTransferGetCount(SPI_Type *base, spi_slave_handle_t *handle, size_t *count)
668 {
669  return SPI_MasterTransferGetCount(base, handle, count);
670 }
671 
678 static inline void SPI_SlaveTransferAbort(SPI_Type *base, spi_slave_handle_t *handle)
679 {
680  SPI_MasterTransferAbort(base, handle);
681 }
682 
689 static inline void SPI_SlaveTransferHandleIRQ(SPI_Type *base, spi_slave_handle_t *handle)
690 {
691  SPI_MasterTransferHandleIRQ(base, handle);
692 }
693 
696 #if defined(__cplusplus)
697 }
698 #endif
699 
702 #endif /* _FSL_SPI_H_*/
bool enableSlave
Definition: fsl_spi.h:195
_spi_interrupt_enable
SPI interrupt sources.
Definition: fsl_spi.h:106
bool enableMaster
Definition: fsl_spi.h:174
void SPI_WriteBlocking(SPI_Type *base, uint8_t *buffer, size_t size)
Sends a buffer of data bytes in blocking way.
Definition: fsl_spi.c:536
static status_t SPI_SlaveTransferGetCount(SPI_Type *base, spi_slave_handle_t *handle, size_t *count)
Get the bytes of SPI Interrupt transferred.
Definition: fsl_spi.h:667
uint16_t SPI_ReadData(SPI_Type *base)
Get a data from SPI data register.
Definition: fsl_spi.c:584
spi_txfifo_watermark_t txWatermark
Definition: fsl_spi.h:184
_spi_flags
SPI status flags.
Definition: fsl_spi.h:118
Definition: fsl_spi.h:129
void SPI_WriteData(SPI_Type *base, uint16_t data)
Write a data into SPI data register.
Definition: fsl_spi.c:574
spi_txfifo_watermark_t
SPI TX FIFO watermark settings.
Definition: fsl_spi.h:147
spi_clock_phase_t
SPI clock phase configuration.
Definition: fsl_spi.h:65
void SPI_MasterTransferCreateHandle(SPI_Type *base, spi_master_handle_t *handle, spi_master_callback_t callback, void *userData)
Initialize the SPI master handle.
Definition: fsl_spi.c:658
Definition: fsl_spi.h:150
spi_master_handle_t spi_slave_handle_t
Slave handle is the same with master handle.
Definition: fsl_spi.h:222
_spi_dma_enable_t
SPI dma source.
Definition: fsl_spi.h:163
Definition: fsl_spi.h:113
Definition: fsl_spi.h:54
void SPI_Deinit(SPI_Type *base)
De-initialize SPI.
Definition: fsl_spi.c:381
Definition: fsl_spi.h:125
status_t SPI_MasterTransferNonBlocking(SPI_Type *base, spi_master_handle_t *handle, spi_transfer_t *xfer)
Performs a non-blocking SPI interrupt transfer.
Definition: fsl_spi.c:707
Definition: fsl_spi.h:149
Definition: fsl_spi.h:143
Definition: fsl_spi.h:121
SPI transfer structure.
Definition: fsl_spi.h:211
Definition: fsl_spi.h:67
uint8_t *volatile rxData
Definition: fsl_spi.h:234
Definition: fsl_spi.h:61
Definition: fsl_spi.h:102
Definition: fsl_spi.h:167
uint8_t bytePerFrame
Definition: fsl_spi.h:239
Definition: fsl_spi.h:101
void SPI_DisableInterrupts(SPI_Type *base, uint32_t mask)
Disable interrupt for SPI.
Definition: fsl_spi.c:445
spi_clock_phase_t phase
Definition: fsl_spi.h:177
uint8_t watermark
Definition: fsl_spi.h:240
uint8_t * txData
Definition: fsl_spi.h:213
void SPI_MasterInit(SPI_Type *base, const spi_master_config_t *config, uint32_t srcClock_Hz)
Initialize SPI with master configuration.
Definition: fsl_spi.c:287
spi_w1c_interrupt_t
SPI FIFO write-1-to-clear interrupt flags.
Definition: fsl_spi.h:138
static void SPI_SlaveTransferHandleIRQ(SPI_Type *base, spi_slave_handle_t *handle)
Interrupt handler for SPI slave.
Definition: fsl_spi.h:689
Definition: fsl_spi.h:126
Definition: fsl_spi.h:131
spi_master_callback_t callback
Definition: fsl_spi.h:241
Definition: fsl_spi.h:127
Definition: fsl_common.h:79
bool enableFifoInterruptClear
Definition: fsl_spi.h:183
SPI slave user configure structure.
Definition: fsl_spi.h:193
Definition: fsl_spi.h:110
uint32_t flags
Definition: fsl_spi.h:216
spi_clock_polarity_t
SPI clock polarity configuration.
Definition: fsl_spi.h:58
Definition: fsl_spi.h:52
Definition: fsl_spi.h:157
static void SPI_ClearInterrupt(SPI_Type *base, uint32_t mask)
Clear the interrupt if enable INCTLR.
Definition: fsl_spi.h:385
void SPI_SlaveGetDefaultConfig(spi_slave_config_t *config)
Set the SPI slave configuration structure to default values.
Definition: fsl_spi.c:328
Definition: fsl_spi.h:142
SPI transfer handle structure.
Definition: fsl_spi.h:231
Definition: fsl_spi.h:76
volatile size_t txRemainingBytes
Definition: fsl_spi.h:235
Definition: fsl_spi.h:53
spi_clock_polarity_t polarity
Definition: fsl_spi.h:176
volatile uint32_t state
Definition: fsl_spi.h:237
spi_ss_output_mode_t outputMode
Definition: fsl_spi.h:187
Definition: fsl_spi.h:83
Definition: fsl_spi.h:166
bool enableStopInWaitMode
Definition: fsl_spi.h:175
static status_t SPI_SlaveTransferNonBlocking(SPI_Type *base, spi_slave_handle_t *handle, spi_transfer_t *xfer)
Performs a non-blocking SPI slave interrupt transfer.
Definition: fsl_spi.h:653
void(* spi_slave_callback_t)(SPI_Type *base, spi_slave_handle_t *handle, status_t status, void *userData)
SPI master callback for finished transmit.
Definition: fsl_spi.h:228
void(* spi_master_callback_t)(SPI_Type *base, spi_master_handle_t *handle, status_t status, void *userData)
SPI master callback for finished transmit.
Definition: fsl_spi.h:225
Definition: fsl_spi.h:132
spi_rxfifo_watermark_t rxWatermark
Definition: fsl_spi.h:185
Definition: fsl_spi.h:92
spi_shift_direction_t
SPI data shifter direction options.
Definition: fsl_spi.h:74
spi_ss_output_mode_t
SPI slave select output mode options.
Definition: fsl_spi.h:81
static void SPI_EnableDMA(SPI_Type *base, uint32_t mask, bool enable)
Enable dma source for SPI.
Definition: fsl_spi.h:439
void SPI_EnableInterrupts(SPI_Type *base, uint32_t mask)
Enable interrupt for SPI.
Definition: fsl_spi.c:406
Definition: fsl_spi.h:156
static void SPI_SlaveTransferAbort(SPI_Type *base, spi_slave_handle_t *handle)
Abort a SPI slave transfer using interrupt.
Definition: fsl_spi.h:678
Definition: fsl_spi.h:85
Definition: fsl_spi.h:128
Definition: fsl_spi.h:120
Definition: fsl_spi.h:69
Definition: fsl_spi.h:122
volatile size_t rxRemainingBytes
Definition: fsl_spi.h:236
static void SPI_SetMatchData(SPI_Type *base, uint32_t matchData)
Set match data for SPI.
Definition: fsl_spi.h:495
status_t SPI_MasterTransferBlocking(SPI_Type *base, spi_transfer_t *xfer)
Transfer a block of data in polling way.
Definition: fsl_spi.c:596
Definition: fsl_spi.h:94
uint32_t SPI_GetStatusFlags(SPI_Type *base)
Get the status flag.
Definition: fsl_spi.c:390
void SPI_MasterGetDefaultConfig(spi_master_config_t *config)
Set the SPI master configuration structure to default values.
Definition: fsl_spi.c:265
Definition: fsl_spi.h:112
static void SPI_Enable(I2C_Type *base, bool enable)
Enable or disables the SPI.
Definition: fsl_spi.h:346
uint8_t *volatile txData
Definition: fsl_spi.h:233
spi_shift_direction_t direction
Definition: fsl_spi.h:178
size_t dataSize
Definition: fsl_spi.h:215
Definition: fsl_spi.h:109
uint32_t baudRate_Bps
Definition: fsl_spi.h:189
Definition: fsl_spi.h:130
status_t SPI_MasterTransferGetCount(SPI_Type *base, spi_master_handle_t *handle, size_t *count)
Get the bytes of SPI Interrupt transferred.
Definition: fsl_spi.c:758
static uint32_t SPI_GetDataRegisterAddress(SPI_Type *base)
Get SPI tx/rx data register address.
Definition: fsl_spi.h:460
void SPI_SlaveInit(SPI_Type *base, const spi_slave_config_t *config)
Initialize SPI with slave configuration.
Definition: fsl_spi.c:346
SPI master user configure structure.
Definition: fsl_spi.h:172
spi_data_bitcount_mode_t
SPI data length mode options.
Definition: fsl_spi.h:99
spi_data_bitcount_mode_t dataMode
Definition: fsl_spi.h:180
_spi_status
Return status for the SPI driver.
Definition: fsl_spi.h:50
void SPI_EnableFIFO(SPI_Type *base, bool enable)
Enable or Disable FIFO if there is FIFO.
Definition: fsl_spi.c:558
static void SPI_SlaveTransferCreateHandle(SPI_Type *base, spi_slave_handle_t *handle, spi_slave_callback_t callback, void *userData)
Initialize the SPI slave handle.
Definition: fsl_spi.h:628
spi_pin_mode_t
SPI pin mode options.
Definition: fsl_spi.h:89
spi_pin_mode_t pinMode
Definition: fsl_spi.h:188
uint8_t * rxData
Definition: fsl_spi.h:214
void SPI_MasterTransferHandleIRQ(SPI_Type *base, spi_master_handle_t *handle)
Interrupt handler for SPI.
Definition: fsl_spi.c:810
void * userData
Definition: fsl_spi.h:242
Definition: fsl_spi.h:84
Definition: fsl_spi.h:60
Definition: fsl_spi.h:77
int32_t status_t
Type used for all status and error return values.
Definition: fsl_common.h:121
Definition: fsl_spi.h:108
size_t transferSize
Definition: fsl_spi.h:238
Definition: fsl_spi.h:141
Definition: fsl_spi.h:123
spi_rxfifo_watermark_t
SPI RX FIFO watermark settings.
Definition: fsl_spi.h:154
Definition: fsl_spi.h:91
void SPI_MasterSetBaudRate(SPI_Type *base, uint32_t baudRate_Bps, uint32_t srcClock_Hz)
Set Baud rate for SPI transfer, this only used in master.
Definition: fsl_spi.c:483
Definition: fsl_spi.h:140
Definition: fsl_spi.h:165
void SPI_MasterTransferAbort(SPI_Type *base, spi_master_handle_t *handle)
Abort a SPI transfer using interrupt.
Definition: fsl_spi.c:784