1
1
/*
2
2
* Copyright (c) 2015, Freescale Semiconductor, Inc.
3
+ * Copyright 2016-2017 NXP
3
4
* All rights reserved.
4
5
*
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.
6
+ * SPDX-License-Identifier: BSD-3-Clause
29
7
*/
30
8
#ifndef _FSL_SPI_H_
31
9
#define _FSL_SPI_H_
37
15
* @{
38
16
*/
39
17
40
-
41
18
/*******************************************************************************
42
19
* Definitions
43
20
******************************************************************************/
44
21
45
22
/*! @name Driver version */
46
23
/*@{*/
47
- /*! @brief SPI driver version 2.0.1 . */
48
- #define FSL_SPI_DRIVER_VERSION (MAKE_VERSION(2, 0, 1 ))
24
+ /*! @brief SPI driver version 2.0.4 . */
25
+ #define FSL_SPI_DRIVER_VERSION (MAKE_VERSION(2, 0, 4 ))
49
26
/*@}*/
50
27
51
28
#ifndef SPI_DUMMYDATA
52
29
/*! @brief SPI dummy transfer data, the data is sent while txBuff is NULL. */
53
30
#define SPI_DUMMYDATA (0xFFU)
54
31
#endif
55
32
33
+ /*! @brief Global variable for dummy data value setting. */
34
+ extern volatile uint8_t g_spiDummyData [];
35
+
56
36
/*! @brief Return status for the SPI driver.*/
57
37
enum _spi_status
58
38
{
59
- kStatus_SPI_Busy = MAKE_STATUS (kStatusGroup_SPI , 0 ), /*!< SPI bus is busy */
60
- kStatus_SPI_Idle = MAKE_STATUS (kStatusGroup_SPI , 1 ), /*!< SPI is idle */
61
- kStatus_SPI_Error = MAKE_STATUS (kStatusGroup_SPI , 2 ) /*!< SPI error */
39
+ kStatus_SPI_Busy = MAKE_STATUS (kStatusGroup_SPI , 0 ), /*!< SPI bus is busy */
40
+ kStatus_SPI_Idle = MAKE_STATUS (kStatusGroup_SPI , 1 ), /*!< SPI is idle */
41
+ kStatus_SPI_Error = MAKE_STATUS (kStatusGroup_SPI , 2 ) /*!< SPI error */
62
42
};
63
43
64
44
/*! @brief SPI clock polarity configuration.*/
@@ -87,16 +67,16 @@ typedef enum _spi_shift_direction
87
67
/*! @brief SPI slave select output mode options.*/
88
68
typedef enum _spi_ss_output_mode
89
69
{
90
- kSPI_SlaveSelectAsGpio = 0x0U , /*!< Slave select pin configured as GPIO. */
91
- kSPI_SlaveSelectFaultInput = 0x2U , /*!< Slave select pin configured for fault detection. */
92
- kSPI_SlaveSelectAutomaticOutput = 0x3U /*!< Slave select pin configured for automatic SPI output. */
70
+ kSPI_SlaveSelectAsGpio = 0x0U , /*!< Slave select pin configured as GPIO. */
71
+ kSPI_SlaveSelectFaultInput = 0x2U , /*!< Slave select pin configured for fault detection. */
72
+ kSPI_SlaveSelectAutomaticOutput = 0x3U /*!< Slave select pin configured for automatic SPI output. */
93
73
} spi_ss_output_mode_t ;
94
74
95
75
/*! @brief SPI pin mode options.*/
96
76
typedef enum _spi_pin_mode
97
77
{
98
78
kSPI_PinModeNormal = 0x0U , /*!< Pins operate in normal, single-direction mode.*/
99
- kSPI_PinModeInput = 0x1U , /*!< Bidirectional mode. Master: MOSI pin is input;
79
+ kSPI_PinModeInput = 0x1U , /*!< Bidirectional mode. Master: MOSI pin is input;
100
80
* Slave: MISO pin is input. */
101
81
kSPI_PinModeOutput = 0x3U /*!< Bidirectional mode. Master: MOSI pin is output;
102
82
* Slave: MISO pin is output. */
@@ -113,64 +93,64 @@ typedef enum _spi_data_bitcount_mode
113
93
enum _spi_interrupt_enable
114
94
{
115
95
kSPI_RxFullAndModfInterruptEnable = 0x1U , /*!< Receive buffer full (SPRF) and mode fault (MODF) interrupt */
116
- kSPI_TxEmptyInterruptEnable = 0x2U , /*!< Transmit buffer empty interrupt */
117
- kSPI_MatchInterruptEnable = 0x4U , /*!< Match interrupt */
96
+ kSPI_TxEmptyInterruptEnable = 0x2U , /*!< Transmit buffer empty interrupt */
97
+ kSPI_MatchInterruptEnable = 0x4U , /*!< Match interrupt */
118
98
#if defined(FSL_FEATURE_SPI_HAS_FIFO ) && FSL_FEATURE_SPI_HAS_FIFO
119
- kSPI_RxFifoNearFullInterruptEnable = 0x8U , /*!< Receive FIFO nearly full interrupt */
99
+ kSPI_RxFifoNearFullInterruptEnable = 0x8U , /*!< Receive FIFO nearly full interrupt */
120
100
kSPI_TxFifoNearEmptyInterruptEnable = 0x10U , /*!< Transmit FIFO nearly empty interrupt */
121
101
#endif /* FSL_FEATURE_SPI_HAS_FIFO */
122
102
};
123
103
124
104
/*! @brief SPI status flags.*/
125
105
enum _spi_flags
126
106
{
127
- kSPI_RxBufferFullFlag = SPI_S_SPRF_MASK , /*!< Read buffer full flag */
128
- kSPI_MatchFlag = SPI_S_SPMF_MASK , /*!< Match flag */
107
+ kSPI_RxBufferFullFlag = SPI_S_SPRF_MASK , /*!< Read buffer full flag */
108
+ kSPI_MatchFlag = SPI_S_SPMF_MASK , /*!< Match flag */
129
109
kSPI_TxBufferEmptyFlag = SPI_S_SPTEF_MASK , /*!< Transmit buffer empty flag */
130
- kSPI_ModeFaultFlag = SPI_S_MODF_MASK , /*!< Mode fault flag */
110
+ kSPI_ModeFaultFlag = SPI_S_MODF_MASK , /*!< Mode fault flag */
131
111
#if defined(FSL_FEATURE_SPI_HAS_FIFO ) && FSL_FEATURE_SPI_HAS_FIFO
132
- kSPI_RxFifoNearFullFlag = SPI_S_RNFULLF_MASK , /*!< Rx FIFO near full */
133
- kSPI_TxFifoNearEmptyFlag = SPI_S_TNEAREF_MASK , /*!< Tx FIFO near empty */
134
- kSPI_TxFifoFullFlag = SPI_S_TXFULLF_MASK , /*!< Tx FIFO full */
135
- kSPI_RxFifoEmptyFlag = SPI_S_RFIFOEF_MASK , /*!< Rx FIFO empty */
136
- kSPI_TxFifoError = SPI_CI_TXFERR_MASK << 8U , /*!< Tx FIFO error */
137
- kSPI_RxFifoError = SPI_CI_RXFERR_MASK << 8U , /*!< Rx FIFO error */
138
- kSPI_TxOverflow = SPI_CI_TXFOF_MASK << 8U , /*!< Tx FIFO Overflow */
139
- kSPI_RxOverflow = SPI_CI_RXFOF_MASK << 8U /*!< Rx FIFO Overflow */
140
- #endif /* FSL_FEATURE_SPI_HAS_FIFO */
112
+ kSPI_RxFifoNearFullFlag = SPI_S_RNFULLF_MASK , /*!< Rx FIFO near full */
113
+ kSPI_TxFifoNearEmptyFlag = SPI_S_TNEAREF_MASK , /*!< Tx FIFO near empty */
114
+ kSPI_TxFifoFullFlag = SPI_S_TXFULLF_MASK , /*!< Tx FIFO full */
115
+ kSPI_RxFifoEmptyFlag = SPI_S_RFIFOEF_MASK , /*!< Rx FIFO empty */
116
+ kSPI_TxFifoError = SPI_CI_TXFERR_MASK << 8U , /*!< Tx FIFO error */
117
+ kSPI_RxFifoError = SPI_CI_RXFERR_MASK << 8U , /*!< Rx FIFO error */
118
+ kSPI_TxOverflow = SPI_CI_TXFOF_MASK << 8U , /*!< Tx FIFO Overflow */
119
+ kSPI_RxOverflow = SPI_CI_RXFOF_MASK << 8U /*!< Rx FIFO Overflow */
120
+ #endif /* FSL_FEATURE_SPI_HAS_FIFO */
141
121
};
142
122
143
123
#if defined(FSL_FEATURE_SPI_HAS_FIFO ) && FSL_FEATURE_SPI_HAS_FIFO
144
124
/*! @brief SPI FIFO write-1-to-clear interrupt flags.*/
145
125
typedef enum _spi_w1c_interrupt
146
126
{
147
- kSPI_RxFifoFullClearInterrupt = SPI_CI_SPRFCI_MASK , /*!< Receive FIFO full interrupt */
148
- kSPI_TxFifoEmptyClearInterrupt = SPI_CI_SPTEFCI_MASK , /*!< Transmit FIFO empty interrupt */
149
- kSPI_RxNearFullClearInterrupt = SPI_CI_RNFULLFCI_MASK , /*!< Receive FIFO nearly full interrupt */
150
- kSPI_TxNearEmptyClearInterrupt = SPI_CI_TNEAREFCI_MASK /*!< Transmit FIFO nearly empty interrupt */
127
+ kSPI_RxFifoFullClearInterrupt = SPI_CI_SPRFCI_MASK , /*!< Receive FIFO full interrupt */
128
+ kSPI_TxFifoEmptyClearInterrupt = SPI_CI_SPTEFCI_MASK , /*!< Transmit FIFO empty interrupt */
129
+ kSPI_RxNearFullClearInterrupt = SPI_CI_RNFULLFCI_MASK , /*!< Receive FIFO nearly full interrupt */
130
+ kSPI_TxNearEmptyClearInterrupt = SPI_CI_TNEAREFCI_MASK /*!< Transmit FIFO nearly empty interrupt */
151
131
} spi_w1c_interrupt_t ;
152
132
153
133
/*! @brief SPI TX FIFO watermark settings.*/
154
134
typedef enum _spi_txfifo_watermark
155
135
{
156
136
kSPI_TxFifoOneFourthEmpty = 0 , /*!< SPI tx watermark at 1/4 FIFO size */
157
- kSPI_TxFifoOneHalfEmpty = 1 /*!< SPI tx watermark at 1/2 FIFO size */
137
+ kSPI_TxFifoOneHalfEmpty = 1 /*!< SPI tx watermark at 1/2 FIFO size */
158
138
} spi_txfifo_watermark_t ;
159
139
160
140
/*! @brief SPI RX FIFO watermark settings.*/
161
141
typedef enum _spi_rxfifo_watermark
162
142
{
163
143
kSPI_RxFifoThreeFourthsFull = 0 , /*!< SPI rx watermark at 3/4 FIFO size */
164
- kSPI_RxFifoOneHalfFull = 1 /*!< SPI rx watermark at 1/2 FIFO size */
144
+ kSPI_RxFifoOneHalfFull = 1 /*!< SPI rx watermark at 1/2 FIFO size */
165
145
} spi_rxfifo_watermark_t ;
166
146
#endif /* FSL_FEATURE_SPI_HAS_FIFO */
167
147
168
148
#if defined(FSL_FEATURE_SPI_HAS_DMA_SUPPORT ) && FSL_FEATURE_SPI_HAS_DMA_SUPPORT
169
149
/*! @brief SPI DMA source*/
170
150
enum _spi_dma_enable_t
171
151
{
172
- kSPI_TxDmaEnable = SPI_C2_TXDMAE_MASK , /*!< Tx DMA request source */
173
- kSPI_RxDmaEnable = SPI_C2_RXDMAE_MASK , /*!< Rx DMA request source */
152
+ kSPI_TxDmaEnable = SPI_C2_TXDMAE_MASK , /*!< Tx DMA request source */
153
+ kSPI_RxDmaEnable = SPI_C2_RXDMAE_MASK , /*!< Rx DMA request source */
174
154
kSPI_DmaAllEnable = (SPI_C2_TXDMAE_MASK | SPI_C2_RXDMAE_MASK ) /*!< All DMA request source*/
175
155
};
176
156
#endif /* FSL_FEATURE_SPI_HAS_DMA_SUPPORT */
@@ -210,6 +190,7 @@ typedef struct _spi_slave_config
210
190
spi_txfifo_watermark_t txWatermark ; /*!< Tx watermark settings */
211
191
spi_rxfifo_watermark_t rxWatermark ; /*!< Rx watermark settings */
212
192
#endif /* FSL_FEATURE_SPI_HAS_FIFO */
193
+ spi_pin_mode_t pinMode ; /*!< SPI pin mode select */
213
194
} spi_slave_config_t ;
214
195
215
196
/*! @brief SPI transfer structure */
@@ -478,6 +459,27 @@ static inline uint32_t SPI_GetDataRegisterAddress(SPI_Type *base)
478
459
* @{
479
460
*/
480
461
462
+ /*!
463
+ * @brief Get the instance for SPI module.
464
+ *
465
+ * @param base SPI base address
466
+ */
467
+ uint32_t SPI_GetInstance (SPI_Type * base );
468
+
469
+ /*!
470
+ * @brief Sets the pin mode for transfer.
471
+ *
472
+ * @param base SPI base pointer
473
+ * @param pinMode pin mode for transfer AND #_spi_pin_mode could get the related configuration.
474
+ */
475
+ static inline void SPI_SetPinMode (SPI_Type * base , spi_pin_mode_t pinMode )
476
+ {
477
+ /* Clear SPC0 and BIDIROE bit. */
478
+ base -> C2 &= ~(SPI_C2_BIDIROE_MASK | SPI_C2_SPC0_MASK );
479
+ /* Set pin mode for transfer. */
480
+ base -> C2 |= SPI_C2_BIDIROE (pinMode >> 1U ) | SPI_C2_SPC0 (pinMode & 1U );
481
+ }
482
+
481
483
/*!
482
484
* @brief Sets the baud rate for SPI transfer. This is only used in master.
483
485
*
@@ -544,6 +546,13 @@ void SPI_WriteData(SPI_Type *base, uint16_t data);
544
546
*/
545
547
uint16_t SPI_ReadData (SPI_Type * base );
546
548
549
+ /*!
550
+ * @brief Set up the dummy data.
551
+ *
552
+ * @param base SPI peripheral address.
553
+ * @param dummyData Data to be transferred when tx buffer is NULL.
554
+ */
555
+ void SPI_SetDummyData (SPI_Type * base , uint8_t dummyData );
547
556
/*! @} */
548
557
549
558
/*!
@@ -582,11 +591,7 @@ status_t SPI_MasterTransferBlocking(SPI_Type *base, spi_transfer_t *xfer);
582
591
*
583
592
* @note The API immediately returns after transfer initialization is finished.
584
593
* Call SPI_GetStatusIRQ() to get the transfer status.
585
- * @note If using the SPI with FIFO for the interrupt transfer, the transfer size is the integer times of the watermark.
586
- * Otherwise,
587
- * the last data may be lost because it cannot generate an interrupt request. Users can also call the functional API to
588
- * get the last
589
- * received data.
594
+ * @note If SPI transfer data frame size is 16 bits, the transfer size cannot be an odd number.
590
595
*
591
596
* @param base SPI peripheral base address.
592
597
* @param handle pointer to spi_master_handle_t structure which stores the transfer state
@@ -636,20 +641,16 @@ void SPI_MasterTransferHandleIRQ(SPI_Type *base, spi_master_handle_t *handle);
636
641
* @param userData User data.
637
642
*/
638
643
void SPI_SlaveTransferCreateHandle (SPI_Type * base ,
639
- spi_slave_handle_t * handle ,
640
- spi_slave_callback_t callback ,
644
+ spi_slave_handle_t * handle ,
645
+ spi_slave_callback_t callback ,
641
646
void * userData );
642
647
643
648
/*!
644
649
* @brief Performs a non-blocking SPI slave interrupt transfer.
645
650
*
646
651
* @note The API returns immediately after the transfer initialization is finished.
647
652
* Call SPI_GetStatusIRQ() to get the transfer status.
648
- * @note If using the SPI with FIFO for the interrupt transfer, the transfer size is the integer times the watermark.
649
- * Otherwise,
650
- * the last data may be lost because it cannot generate an interrupt request. Call the functional API to get the last
651
- * several
652
- * receive data.
653
+ * @note If SPI transfer data frame size is 16 bits, the transfer size cannot be an odd number.
653
654
*
654
655
* @param base SPI peripheral base address.
655
656
* @param handle pointer to spi_master_handle_t structure which stores the transfer state
0 commit comments