Skip to content

Commit 7ed5b81

Browse files
committed
MCUXpresso: Update Kinetis SPI SDK drivers
Added dummy data setup API to allow users to configure the dummy data to be transferred. Signed-off-by: Mahesh Mahadevan <[email protected]>
1 parent de598ec commit 7ed5b81

File tree

8 files changed

+1233
-573
lines changed

8 files changed

+1233
-573
lines changed

targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_KL27Z/drivers/fsl_spi.c

Lines changed: 463 additions & 131 deletions
Large diffs are not rendered by default.

targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_KL27Z/drivers/fsl_spi.h

Lines changed: 70 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,9 @@
11
/*
22
* Copyright (c) 2015, Freescale Semiconductor, Inc.
3+
* Copyright 2016-2017 NXP
34
* All rights reserved.
45
*
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
297
*/
308
#ifndef _FSL_SPI_H_
319
#define _FSL_SPI_H_
@@ -37,28 +15,30 @@
3715
* @{
3816
*/
3917

40-
4118
/*******************************************************************************
4219
* Definitions
4320
******************************************************************************/
4421

4522
/*! @name Driver version */
4623
/*@{*/
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))
4926
/*@}*/
5027

5128
#ifndef SPI_DUMMYDATA
5229
/*! @brief SPI dummy transfer data, the data is sent while txBuff is NULL. */
5330
#define SPI_DUMMYDATA (0xFFU)
5431
#endif
5532

33+
/*! @brief Global variable for dummy data value setting. */
34+
extern volatile uint8_t g_spiDummyData[];
35+
5636
/*! @brief Return status for the SPI driver.*/
5737
enum _spi_status
5838
{
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 */
6242
};
6343

6444
/*! @brief SPI clock polarity configuration.*/
@@ -87,16 +67,16 @@ typedef enum _spi_shift_direction
8767
/*! @brief SPI slave select output mode options.*/
8868
typedef enum _spi_ss_output_mode
8969
{
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. */
9373
} spi_ss_output_mode_t;
9474

9575
/*! @brief SPI pin mode options.*/
9676
typedef enum _spi_pin_mode
9777
{
9878
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;
10080
* Slave: MISO pin is input. */
10181
kSPI_PinModeOutput = 0x3U /*!< Bidirectional mode. Master: MOSI pin is output;
10282
* Slave: MISO pin is output. */
@@ -113,64 +93,64 @@ typedef enum _spi_data_bitcount_mode
11393
enum _spi_interrupt_enable
11494
{
11595
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 */
11898
#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 */
120100
kSPI_TxFifoNearEmptyInterruptEnable = 0x10U, /*!< Transmit FIFO nearly empty interrupt */
121101
#endif /* FSL_FEATURE_SPI_HAS_FIFO */
122102
};
123103

124104
/*! @brief SPI status flags.*/
125105
enum _spi_flags
126106
{
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 */
129109
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 */
131111
#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 */
141121
};
142122

143123
#if defined(FSL_FEATURE_SPI_HAS_FIFO) && FSL_FEATURE_SPI_HAS_FIFO
144124
/*! @brief SPI FIFO write-1-to-clear interrupt flags.*/
145125
typedef enum _spi_w1c_interrupt
146126
{
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 */
151131
} spi_w1c_interrupt_t;
152132

153133
/*! @brief SPI TX FIFO watermark settings.*/
154134
typedef enum _spi_txfifo_watermark
155135
{
156136
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 */
158138
} spi_txfifo_watermark_t;
159139

160140
/*! @brief SPI RX FIFO watermark settings.*/
161141
typedef enum _spi_rxfifo_watermark
162142
{
163143
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 */
165145
} spi_rxfifo_watermark_t;
166146
#endif /* FSL_FEATURE_SPI_HAS_FIFO */
167147

168148
#if defined(FSL_FEATURE_SPI_HAS_DMA_SUPPORT) && FSL_FEATURE_SPI_HAS_DMA_SUPPORT
169149
/*! @brief SPI DMA source*/
170150
enum _spi_dma_enable_t
171151
{
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 */
174154
kSPI_DmaAllEnable = (SPI_C2_TXDMAE_MASK | SPI_C2_RXDMAE_MASK) /*!< All DMA request source*/
175155
};
176156
#endif /* FSL_FEATURE_SPI_HAS_DMA_SUPPORT */
@@ -210,6 +190,7 @@ typedef struct _spi_slave_config
210190
spi_txfifo_watermark_t txWatermark; /*!< Tx watermark settings */
211191
spi_rxfifo_watermark_t rxWatermark; /*!< Rx watermark settings */
212192
#endif /* FSL_FEATURE_SPI_HAS_FIFO */
193+
spi_pin_mode_t pinMode; /*!< SPI pin mode select */
213194
} spi_slave_config_t;
214195

215196
/*! @brief SPI transfer structure */
@@ -478,6 +459,27 @@ static inline uint32_t SPI_GetDataRegisterAddress(SPI_Type *base)
478459
* @{
479460
*/
480461

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+
481483
/*!
482484
* @brief Sets the baud rate for SPI transfer. This is only used in master.
483485
*
@@ -544,6 +546,13 @@ void SPI_WriteData(SPI_Type *base, uint16_t data);
544546
*/
545547
uint16_t SPI_ReadData(SPI_Type *base);
546548

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);
547556
/*! @} */
548557

549558
/*!
@@ -582,11 +591,7 @@ status_t SPI_MasterTransferBlocking(SPI_Type *base, spi_transfer_t *xfer);
582591
*
583592
* @note The API immediately returns after transfer initialization is finished.
584593
* 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.
590595
*
591596
* @param base SPI peripheral base address.
592597
* @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);
636641
* @param userData User data.
637642
*/
638643
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,
641646
void *userData);
642647

643648
/*!
644649
* @brief Performs a non-blocking SPI slave interrupt transfer.
645650
*
646651
* @note The API returns immediately after the transfer initialization is finished.
647652
* 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.
653654
*
654655
* @param base SPI peripheral base address.
655656
* @param handle pointer to spi_master_handle_t structure which stores the transfer state

0 commit comments

Comments
 (0)