2424 lines
80 KiB
C
2424 lines
80 KiB
C
/*
|
|
* Copyright (c) 2020, Texas Instruments Incorporated
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
*
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
*
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* * Neither the name of Texas Instruments Incorporated nor the names of
|
|
* its contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
/*!****************************************************************************
|
|
* @file dl_spi.h
|
|
* @brief SPI Driver Library
|
|
* @defgroup SPI Serial Peripheral Interface (SPI)
|
|
*
|
|
* @anchor ti_dl_dl_spi_Overview
|
|
* # Overview
|
|
*
|
|
* The Serial Peripheral Interface Driver Library allows full configuration of
|
|
* the MSPM0 SPI module.
|
|
* The serial peripheral interface (SPI) module provides a standardized
|
|
* serial interface to transfer data between MSPM0 devices and other external
|
|
* devices with SPI interface.
|
|
*
|
|
* <hr>
|
|
******************************************************************************
|
|
*/
|
|
/** @addtogroup SPI
|
|
* @{
|
|
*/
|
|
#ifndef ti_dl_dl_spi__include
|
|
#define ti_dl_dl_spi__include
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
#include <ti/devices/msp/msp.h>
|
|
#include <ti/driverlib/dl_common.h>
|
|
|
|
#ifdef __MSPM0_HAS_SPI__
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* clang-format off */
|
|
|
|
/** @addtogroup DL_SPI_CD_MODE
|
|
* @{
|
|
*/
|
|
/*!
|
|
* @brief Data mode
|
|
*/
|
|
#define DL_SPI_CD_MODE_DATA (SPI_CTL1_CDMODE_DATA >> SPI_CTL1_CDMODE_OFS)
|
|
|
|
/*!
|
|
* @brief Command mode
|
|
*/
|
|
#define DL_SPI_CD_MODE_COMMAND (SPI_CTL1_CDMODE_COMMAND >> SPI_CTL1_CDMODE_OFS)
|
|
|
|
|
|
/** @}*/
|
|
|
|
/** @addtogroup DL_SPI_INTERRUPT
|
|
* @{
|
|
*/
|
|
|
|
/*!
|
|
* @brief DMA done 1 event for transmit interrupt
|
|
*/
|
|
#define DL_SPI_INTERRUPT_DMA_DONE_TX (SPI_CPU_INT_IMASK_DMA_DONE_TX_SET)
|
|
|
|
/*!
|
|
* @brief DMA done 1 event for receive interrupt
|
|
*/
|
|
#define DL_SPI_INTERRUPT_DMA_DONE_RX (SPI_CPU_INT_IMASK_DMA_DONE_RX_SET)
|
|
/*!
|
|
* @brief SPI has finished transfers and changed into idle mode interrupt
|
|
*/
|
|
#define DL_SPI_INTERRUPT_IDLE (SPI_CPU_INT_IMASK_IDLE_SET)
|
|
|
|
/*!
|
|
* @brief Transmit FIFO empty interrupt
|
|
*/
|
|
#define DL_SPI_INTERRUPT_TX_EMPTY (SPI_CPU_INT_IMASK_TXEMPTY_SET)
|
|
|
|
/*!
|
|
* @brief Transmit FIFO interrupt
|
|
*/
|
|
#define DL_SPI_INTERRUPT_TX (SPI_CPU_INT_IMASK_TX_SET)
|
|
|
|
/*!
|
|
* @brief Receive FIFO interrupt
|
|
*/
|
|
#define DL_SPI_INTERRUPT_RX (SPI_CPU_INT_IMASK_RX_SET)
|
|
|
|
/*!
|
|
* @brief Receive timeout interrupt
|
|
*/
|
|
#define DL_SPI_INTERRUPT_RX_TIMEOUT (SPI_CPU_INT_IMASK_RTOUT_SET)
|
|
|
|
/*!
|
|
* @brief Receive FIFO full interrupt
|
|
*/
|
|
#define DL_SPI_INTERRUPT_RX_FULL (SPI_CPU_INT_IMASK_RXFULL_SET)
|
|
|
|
/*!
|
|
* @brief Transmit FIFO underflow interrupt
|
|
*/
|
|
#define DL_SPI_INTERRUPT_TX_UNDERFLOW (SPI_CPU_INT_IMASK_TXFIFO_UNF_SET)
|
|
|
|
/*!
|
|
* @brief Parity error
|
|
*/
|
|
#define DL_SPI_INTERRUPT_PARITY_ERROR (SPI_CPU_INT_IMASK_PER_SET)
|
|
|
|
/*!
|
|
* @brief Receive FIFO overflow interrupt
|
|
*/
|
|
#define DL_SPI_INTERRUPT_RX_OVERFLOW (SPI_CPU_INT_IMASK_RXFIFO_OVF_SET)
|
|
|
|
/** @}*/
|
|
|
|
/*! @enum DL_SPI_DMA_IIDX_RX */
|
|
typedef enum {
|
|
/*! SPI interrupt index for enabling SPI receive as DMA trigger */
|
|
DL_SPI_DMA_IIDX_RX_TRIGGER = SPI_DMA_TRIG_RX_IIDX_STAT_RX_EVT,
|
|
/*! SPI interrupt index for enabling SPI receive timeout as DMA trigger */
|
|
DL_SPI_DMA_IIDX_RX_TIMEOUT_TRIGGER = SPI_DMA_TRIG_RX_IIDX_STAT_RTOUT_EVT
|
|
} DL_SPI_DMA_IIDX_RX;
|
|
|
|
/*! @enum DL_SPI_DMA_IIDX_TX */
|
|
typedef enum {
|
|
/*! SPI interrupt index for enabling SPI transmit as DMA trigger */
|
|
DL_SPI_DMA_IIDX_TX_TRIGGER = SPI_DMA_TRIG_TX_IIDX_STAT_TX_EVT
|
|
} DL_SPI_DMA_IIDX_TX;
|
|
|
|
/** @addtogroup DL_SPI_DMA_INTERRUPT_RX
|
|
* @{
|
|
*/
|
|
/*!
|
|
* @brief SPI interrupt for enabling SPI receive as DMA trigger
|
|
*/
|
|
#define DL_SPI_DMA_INTERRUPT_RX (SPI_DMA_TRIG_RX_IMASK_RX_SET)
|
|
|
|
/*!
|
|
* @brief SPI interrupt for enabling SPI receive timeout as DMA trigger
|
|
*/
|
|
#define DL_SPI_DMA_INTERRUPT_RX_TIMEOUT (SPI_DMA_TRIG_RX_IMASK_RTOUT_SET)
|
|
|
|
/** @}*/
|
|
|
|
/*!
|
|
* @brief SPI interrupt for enabling SPI transmit as DMA trigger
|
|
*/
|
|
#define DL_SPI_DMA_INTERRUPT_TX (SPI_DMA_TRIG_TX_IMASK_TX_SET)
|
|
|
|
/* clang-format on */
|
|
|
|
/*! @enum DL_SPI_PARITY */
|
|
typedef enum {
|
|
/*! Use even parity, enable transmit and receive parity */
|
|
DL_SPI_PARITY_EVEN =
|
|
(SPI_CTL1_PES_ENABLE | SPI_CTL1_PREN_ENABLE | SPI_CTL1_PTEN_ENABLE),
|
|
/*! Use odd parity, enable transmit and receive parity */
|
|
DL_SPI_PARITY_ODD =
|
|
(SPI_CTL1_PES_DISABLE | SPI_CTL1_PREN_ENABLE | SPI_CTL1_PTEN_ENABLE),
|
|
/*! Disable receive and transmit parity */
|
|
DL_SPI_PARITY_NONE = (SPI_CTL1_PREN_DISABLE | SPI_CTL1_PTEN_DISABLE)
|
|
} DL_SPI_PARITY;
|
|
|
|
/*! @enum DL_SPI_FRAME_FORMAT */
|
|
typedef enum {
|
|
/*! Motorola 3 Wire with Polarity 0, Phase 0 */
|
|
DL_SPI_FRAME_FORMAT_MOTO3_POL0_PHA0 =
|
|
(SPI_CTL0_SPO_LOW | SPI_CTL0_SPH_FIRST | SPI_CTL0_FRF_MOTOROLA_3WIRE),
|
|
/*! Motorola 3 Wire with Polarity 0, Phase 1 */
|
|
DL_SPI_FRAME_FORMAT_MOTO3_POL0_PHA1 =
|
|
(SPI_CTL0_SPO_LOW | SPI_CTL0_SPH_SECOND | SPI_CTL0_FRF_MOTOROLA_3WIRE),
|
|
/*! Motorola 3 Wire with Polarity 1, Phase 0 */
|
|
DL_SPI_FRAME_FORMAT_MOTO3_POL1_PHA0 =
|
|
(SPI_CTL0_SPO_HIGH | SPI_CTL0_SPH_FIRST | SPI_CTL0_FRF_MOTOROLA_3WIRE),
|
|
/*! Motorola 3 Wire with Polarity 1, Phase 1 */
|
|
DL_SPI_FRAME_FORMAT_MOTO3_POL1_PHA1 =
|
|
(SPI_CTL0_SPO_HIGH | SPI_CTL0_SPH_SECOND |
|
|
SPI_CTL0_FRF_MOTOROLA_3WIRE),
|
|
/*! Motorola 4 Wire with Polarity 0, Phase 0 */
|
|
DL_SPI_FRAME_FORMAT_MOTO4_POL0_PHA0 =
|
|
(SPI_CTL0_SPO_LOW | SPI_CTL0_SPH_FIRST | SPI_CTL0_FRF_MOTOROLA_4WIRE),
|
|
/*! Motorola 4 Wire with Polarity 0, Phase 1 */
|
|
DL_SPI_FRAME_FORMAT_MOTO4_POL0_PHA1 =
|
|
(SPI_CTL0_SPO_LOW | SPI_CTL0_SPH_SECOND | SPI_CTL0_FRF_MOTOROLA_4WIRE),
|
|
/*! Motorola 4 Wire with Polarity 1, Phase 0 */
|
|
DL_SPI_FRAME_FORMAT_MOTO4_POL1_PHA0 =
|
|
(SPI_CTL0_SPO_HIGH | SPI_CTL0_SPH_FIRST | SPI_CTL0_FRF_MOTOROLA_4WIRE),
|
|
/*! Motorola 4 Wire with Polarity 1, Phase 1 */
|
|
DL_SPI_FRAME_FORMAT_MOTO4_POL1_PHA1 =
|
|
(SPI_CTL0_SPO_HIGH | SPI_CTL0_SPH_SECOND |
|
|
SPI_CTL0_FRF_MOTOROLA_4WIRE),
|
|
/*! TI Sync Frame Format */
|
|
DL_SPI_FRAME_FORMAT_TI_SYNC = (SPI_CTL0_FRF_TI_SYNC),
|
|
} DL_SPI_FRAME_FORMAT;
|
|
|
|
/*! @enum DL_SPI_MODE */
|
|
typedef enum {
|
|
/*! Controller mode */
|
|
DL_SPI_MODE_CONTROLLER = (SPI_CTL1_CP_ENABLE),
|
|
/*! Peripheral mode */
|
|
DL_SPI_MODE_PERIPHERAL = (SPI_CTL1_CP_DISABLE)
|
|
} DL_SPI_MODE;
|
|
|
|
/*! @enum DL_SPI_BIT_ORDER */
|
|
typedef enum {
|
|
/*! MSB First */
|
|
DL_SPI_BIT_ORDER_MSB_FIRST = (SPI_CTL1_MSB_ENABLE),
|
|
/*! LSB First */
|
|
DL_SPI_BIT_ORDER_LSB_FIRST = (SPI_CTL1_MSB_DISABLE)
|
|
} DL_SPI_BIT_ORDER;
|
|
|
|
/*! @enum DL_SPI_DATA_SIZE */
|
|
typedef enum {
|
|
/*! Data size 4 bits */
|
|
DL_SPI_DATA_SIZE_4 = (SPI_CTL0_DSS_DSS_4),
|
|
/*! Data size 5 bits */
|
|
DL_SPI_DATA_SIZE_5 = (SPI_CTL0_DSS_DSS_5),
|
|
/*! Data size 6 bits */
|
|
DL_SPI_DATA_SIZE_6 = (SPI_CTL0_DSS_DSS_6),
|
|
/*! Data size 7 bits */
|
|
DL_SPI_DATA_SIZE_7 = (SPI_CTL0_DSS_DSS_7),
|
|
/*! Data size 8 bits */
|
|
DL_SPI_DATA_SIZE_8 = (SPI_CTL0_DSS_DSS_8),
|
|
/*! Data size 9 bits */
|
|
DL_SPI_DATA_SIZE_9 = (SPI_CTL0_DSS_DSS_9),
|
|
/*! Data size 10 bits */
|
|
DL_SPI_DATA_SIZE_10 = (SPI_CTL0_DSS_DSS_10),
|
|
/*! Data size 11 bits */
|
|
DL_SPI_DATA_SIZE_11 = (SPI_CTL0_DSS_DSS_11),
|
|
/*! Data size 12 bits */
|
|
DL_SPI_DATA_SIZE_12 = (SPI_CTL0_DSS_DSS_12),
|
|
/*! Data size 13 bits */
|
|
DL_SPI_DATA_SIZE_13 = (SPI_CTL0_DSS_DSS_13),
|
|
/*! Data size 14 bits */
|
|
DL_SPI_DATA_SIZE_14 = (SPI_CTL0_DSS_DSS_14),
|
|
/*! Data size 15 bits */
|
|
DL_SPI_DATA_SIZE_15 = (SPI_CTL0_DSS_DSS_15),
|
|
/*! Data size 16 bits */
|
|
DL_SPI_DATA_SIZE_16 = (SPI_CTL0_DSS_DSS_16),
|
|
} DL_SPI_DATA_SIZE;
|
|
|
|
/*! @enum DL_SPI_CHIP_SELECT */
|
|
typedef enum {
|
|
/*! Chip Select 0 */
|
|
DL_SPI_CHIP_SELECT_0 = (SPI_CTL0_CSSEL_CSSEL_0),
|
|
/*! Chip Select 1 */
|
|
DL_SPI_CHIP_SELECT_1 = (SPI_CTL0_CSSEL_CSSEL_1),
|
|
/*! Chip Select 2 */
|
|
DL_SPI_CHIP_SELECT_2 = (SPI_CTL0_CSSEL_CSSEL_2),
|
|
/*! Chip Select 3 */
|
|
DL_SPI_CHIP_SELECT_3 = (SPI_CTL0_CSSEL_CSSEL_3),
|
|
/*! No chip select */
|
|
DL_SPI_CHIP_SELECT_NONE = (0)
|
|
} DL_SPI_CHIP_SELECT;
|
|
|
|
/*! @enum DL_SPI_TX_FIFO_LEVEL */
|
|
typedef enum {
|
|
/*! Interrupt triggers when TX FIFO <= 3/4 empty */
|
|
DL_SPI_TX_FIFO_LEVEL_3_4_EMPTY = SPI_IFLS_TXIFLSEL_LVL_3_4,
|
|
/*! Interrupt triggers when TX FIFO <= 1/2 empty (default) */
|
|
DL_SPI_TX_FIFO_LEVEL_1_2_EMPTY = SPI_IFLS_TXIFLSEL_LVL_1_2,
|
|
/*! Interrupt triggers when TX FIFO <= 1/4 empty */
|
|
DL_SPI_TX_FIFO_LEVEL_1_4_EMPTY = SPI_IFLS_TXIFLSEL_LVL_1_4,
|
|
/*! Interrupt triggers when TX FIFO is empty */
|
|
DL_SPI_TX_FIFO_LEVEL_EMPTY = SPI_IFLS_TXIFLSEL_LVL_EMPTY,
|
|
/*! Interrupt triggers when TX FIFO has >= 1 frame free. Should be used with DMA */
|
|
DL_SPI_TX_FIFO_LEVEL_ONE_FRAME = SPI_IFLS_TXIFLSEL_LEVEL_1
|
|
} DL_SPI_TX_FIFO_LEVEL;
|
|
|
|
/*! @enum DL_SPI_RX_FIFO_LEVEL */
|
|
typedef enum {
|
|
/*! Interrupt triggers when RX FIFO contains >= 1 frame. Should be used with DMA */
|
|
DL_SPI_RX_FIFO_LEVEL_ONE_FRAME = SPI_IFLS_RXIFLSEL_LEVEL_1,
|
|
/*! Interrupt triggers when RX FIFO is full */
|
|
DL_SPI_RX_FIFO_LEVEL_FULL = SPI_IFLS_RXIFLSEL_LVL_FULL,
|
|
/*! Interrupt triggers when RX FIFO >= 3/4 full */
|
|
DL_SPI_RX_FIFO_LEVEL_3_4_FULL = SPI_IFLS_RXIFLSEL_LVL_3_4,
|
|
/*! Interrupt triggers when RX FIFO >= 1/2 full (default) */
|
|
DL_SPI_RX_FIFO_LEVEL_1_2_FULL = SPI_IFLS_RXIFLSEL_LVL_1_2,
|
|
/*! Interrupt triggers when RX FIFO >= 1/4 full */
|
|
DL_SPI_RX_FIFO_LEVEL_1_4_FULL = SPI_IFLS_RXIFLSEL_LVL_1_4,
|
|
} DL_SPI_RX_FIFO_LEVEL;
|
|
|
|
/*! @enum DL_SPI_IIDX */
|
|
typedef enum {
|
|
|
|
/*! SPI interrupt index for DMA Done 1 event for transmit */
|
|
DL_SPI_IIDX_DMA_DONE_TX = SPI_CPU_INT_IIDX_STAT_DMA_DONE_TX_EVT,
|
|
/*! SPI interrupt index for DMA Done 1 event for receive */
|
|
DL_SPI_IIDX_DMA_DONE_RX = SPI_CPU_INT_IIDX_STAT_DMA_DONE_RX_EVT,
|
|
/*! SPI interrupt index for SPI to signal it has finished transfers and
|
|
* changed into idle mode */
|
|
|
|
DL_SPI_IIDX_IDLE = SPI_CPU_INT_IIDX_STAT_IDLE_EVT,
|
|
/*! SPI interrupt index for transmit FIFO empty */
|
|
DL_SPI_IIDX_TX_EMPTY = SPI_CPU_INT_IIDX_STAT_TX_EMPTY,
|
|
/*! SPI interrupt index for transmit FIFO */
|
|
DL_SPI_IIDX_TX = SPI_CPU_INT_IIDX_STAT_TX_EVT,
|
|
/*! SPI interrupt index for receive FIFO */
|
|
DL_SPI_IIDX_RX = SPI_CPU_INT_IIDX_STAT_RX_EVT,
|
|
/*! SPI interrupt index for receive timeout */
|
|
DL_SPI_IIDX_RX_TIMEOUT = SPI_CPU_INT_IIDX_STAT_RTOUT_EVT,
|
|
|
|
/*! SPI interrupt index for receive FIFO full */
|
|
DL_SPI_IIDX_RX_FULL = SPI_CPU_INT_IIDX_STAT_RXFULL_EVT,
|
|
/*! SPI interrupt index for transmit FIFO underflow */
|
|
DL_SPI_IIDX_TX_UNDERFLOW = SPI_CPU_INT_IIDX_STAT_TXFIFO_UNF_EVT,
|
|
|
|
/*! SPI interrupt index for parity error */
|
|
DL_SPI_IIDX_PARITY_ERROR = SPI_CPU_INT_IIDX_STAT_PER_EVT,
|
|
/*! SPI interrupt index for receive FIFO overflow */
|
|
DL_SPI_IIDX_RX_OVERFLOW = SPI_CPU_INT_IIDX_STAT_RXFIFO_OFV_EVT
|
|
} DL_SPI_IIDX;
|
|
|
|
/*! @enum DL_SPI_CLOCK_DIVIDE_RATIO */
|
|
typedef enum {
|
|
/*! SPI source clock divide ratio set to 1 */
|
|
DL_SPI_CLOCK_DIVIDE_RATIO_1 = SPI_CLKDIV_RATIO_DIV_BY_1,
|
|
/*! SPI source clock divide ratio set to 2 */
|
|
DL_SPI_CLOCK_DIVIDE_RATIO_2 = SPI_CLKDIV_RATIO_DIV_BY_2,
|
|
/*! SPI source clock divide ratio set to 3 */
|
|
DL_SPI_CLOCK_DIVIDE_RATIO_3 = SPI_CLKDIV_RATIO_DIV_BY_3,
|
|
/*! SPI source clock divide ratio set to 4 */
|
|
DL_SPI_CLOCK_DIVIDE_RATIO_4 = SPI_CLKDIV_RATIO_DIV_BY_4,
|
|
/*! SPI source clock divide ratio set to 5 */
|
|
DL_SPI_CLOCK_DIVIDE_RATIO_5 = SPI_CLKDIV_RATIO_DIV_BY_5,
|
|
/*! SPI source clock divide ratio set to 6 */
|
|
DL_SPI_CLOCK_DIVIDE_RATIO_6 = SPI_CLKDIV_RATIO_DIV_BY_6,
|
|
/*! SPI source clock divide ratio set to 7 */
|
|
DL_SPI_CLOCK_DIVIDE_RATIO_7 = SPI_CLKDIV_RATIO_DIV_BY_7,
|
|
/*! SPI source clock divide ratio set to 8 */
|
|
DL_SPI_CLOCK_DIVIDE_RATIO_8 = SPI_CLKDIV_RATIO_DIV_BY_8
|
|
} DL_SPI_CLOCK_DIVIDE_RATIO;
|
|
|
|
/*! @enum DL_SPI_CLOCK */
|
|
typedef enum {
|
|
/*! Selects BUSCLK as the clock source */
|
|
DL_SPI_CLOCK_BUSCLK = SPI_CLKSEL_SYSCLK_SEL_ENABLE,
|
|
/*! Selects MFCLK as the clock source */
|
|
DL_SPI_CLOCK_MFCLK = SPI_CLKSEL_MFCLK_SEL_ENABLE,
|
|
/*! Selects LFCLK as the clock source */
|
|
DL_SPI_CLOCK_LFCLK = SPI_CLKSEL_LFCLK_SEL_ENABLE
|
|
} DL_SPI_CLOCK;
|
|
|
|
/*!
|
|
* @brief Configuration struct for @ref DL_SPI_init.
|
|
*/
|
|
typedef struct {
|
|
/*! The controller/peripheral mode configuration. One of @ref DL_SPI_MODE */
|
|
DL_SPI_MODE mode;
|
|
|
|
/*!
|
|
* The frame format to use for data transfer. One of @ref
|
|
* DL_SPI_FRAME_FORMAT
|
|
*/
|
|
DL_SPI_FRAME_FORMAT frameFormat;
|
|
|
|
/*!
|
|
* The parity configuration to use for data transfer. One of @ref
|
|
* DL_SPI_PARITY.
|
|
*/
|
|
DL_SPI_PARITY parity;
|
|
|
|
/*! The size of the data transfer. One of @ref DL_SPI_DATA_SIZE */
|
|
DL_SPI_DATA_SIZE dataSize;
|
|
|
|
/*! The order of bits during data transfer. One of @ref DL_SPI_BIT_ORDER */
|
|
DL_SPI_BIT_ORDER bitOrder;
|
|
|
|
/*! The pin to use for chip select. Used in Controller or Peripheral modes
|
|
* with Motorola 4-Wire or TI Sync frame formats. One of
|
|
* @ref DL_SPI_CHIP_SELECT.
|
|
*/
|
|
DL_SPI_CHIP_SELECT chipSelectPin;
|
|
|
|
} DL_SPI_Config;
|
|
|
|
/*!
|
|
* @brief Configuration struct for @ref DL_SPI_setClockConfig.
|
|
*/
|
|
typedef struct {
|
|
/*! Selects SPI module clock source @ref DL_SPI_CLOCK */
|
|
DL_SPI_CLOCK clockSel;
|
|
|
|
/*! Selects the divide ratio. One of @ref DL_SPI_CLOCK_DIVIDE_RATIO */
|
|
DL_SPI_CLOCK_DIVIDE_RATIO divideRatio;
|
|
|
|
} DL_SPI_ClockConfig;
|
|
|
|
/**
|
|
* @brief Configuration structure to backup SPI peripheral state before going
|
|
* to STOP/STANDBY mode. Used by @ref DL_SPI_saveConfiguration and
|
|
* @ref DL_SPI_restoreConfiguration
|
|
*/
|
|
typedef struct {
|
|
/*! Combination of basic SPI control configurations that are
|
|
* compressed to a single word as they are stored in the SPI
|
|
* registers See @ref DL_SPI_init for how the peripheral control word 0
|
|
* is created. */
|
|
uint32_t controlWord0;
|
|
|
|
/*! Combination of basic SPI control configurations that are
|
|
* compressed to a single word as they are stored in the SPI
|
|
* registers. See @ref DL_SPI_init for how the peripheral control word 1
|
|
* is created. */
|
|
uint32_t controlWord1;
|
|
|
|
/*! Combination of serial clock divider and delayed sampling settings
|
|
* compressed to a single word as they are stored in the SPI registers. */
|
|
uint32_t clockControl;
|
|
|
|
/*! SPI module clock source. One of @ref DL_SPI_CLOCK */
|
|
uint32_t clockSel;
|
|
|
|
/*! SPI clock divider. One of @ref DL_SPI_CLOCK_DIVIDE_RATIO */
|
|
uint32_t divideRatio;
|
|
|
|
/*! Combination of SPI interrupt FIFO level select configurations that are
|
|
* compressed to a single word as they are stored in the SPI
|
|
* registers. */
|
|
uint32_t interruptFifoLevelSelectWord;
|
|
|
|
/*! SPI interrupt status for EVENT0.
|
|
* Bitwise OR of @ref DL_SPI_INTERRUPT */
|
|
uint32_t interruptMask0;
|
|
|
|
/*! SPI interrupt status for EVENT1.
|
|
* Bitwise OR of @ref DL_SPI_DMA_INTERRUPT_RX */
|
|
uint32_t interruptMask1;
|
|
|
|
/*! SPI interrupt status for EVENT2.
|
|
* Bitwise OR of @ref DL_SPI_DMA_INTERRUPT_TX */
|
|
uint32_t interruptMask2;
|
|
|
|
/*! Boolean flag indicating whether or not a valid configuration structure
|
|
* exists. Should not be modified by the user. */
|
|
bool backupRdy;
|
|
} DL_SPI_backupConfig;
|
|
|
|
/**
|
|
* @brief Initialize the SPI peripheral
|
|
*
|
|
* Initializes all the common configurable options for the SPI peripheral. Any
|
|
* other custom configuration can be done after calling this API. The SPI is
|
|
* not enabled in this API.
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
* @param[in] config Configuration for SPI peripheral
|
|
*/
|
|
void DL_SPI_init(SPI_Regs *spi, const DL_SPI_Config *config);
|
|
|
|
/**
|
|
* @brief Enables the Peripheral Write Enable (PWREN) register for the SPI
|
|
*
|
|
* Before any peripheral registers can be configured by software, the
|
|
* peripheral itself must be enabled by writing the ENABLE bit together with
|
|
* the appropriate KEY value to the peripheral's PWREN register.
|
|
*
|
|
* @note For power savings, please refer to @ref DL_SPI_enable
|
|
*
|
|
* @param spi Pointer to the register overlay for the peripheral
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_enablePower(SPI_Regs *spi)
|
|
{
|
|
spi->GPRCM.PWREN = (SPI_PWREN_KEY_UNLOCK_W | SPI_PWREN_ENABLE_ENABLE);
|
|
}
|
|
|
|
/**
|
|
* @brief Disables the Peripheral Write Enable (PWREN) register for the SPI
|
|
*
|
|
* When the PWREN.ENABLE bit is cleared, the peripheral's registers are not
|
|
* accessible for read/write operations.
|
|
*
|
|
* @note This API does not provide large power savings. For power savings,
|
|
* please refer to @ref DL_SPI_enable
|
|
*
|
|
* @param spi Pointer to the register overlay for the peripheral
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_disablePower(SPI_Regs *spi)
|
|
{
|
|
spi->GPRCM.PWREN = (SPI_PWREN_KEY_UNLOCK_W | SPI_PWREN_ENABLE_DISABLE);
|
|
}
|
|
|
|
/**
|
|
* @brief Returns if the Peripheral Write Enable (PWREN) register for the SPI
|
|
* is enabled
|
|
*
|
|
* Before any peripheral registers can be configured by software, the
|
|
* peripheral itself must be enabled by writing the ENABLE bit together with
|
|
* the appropriate KEY value to the peripheral's PWREN register.
|
|
*
|
|
* When the PWREN.ENABLE bit is cleared, the peripheral's registers are not
|
|
* accessible for read/write operations.
|
|
*
|
|
* @param spi Pointer to the register overlay for the peripheral
|
|
*
|
|
* @return true if peripheral register access is enabled
|
|
* @return false if peripheral register access is disabled
|
|
*/
|
|
__STATIC_INLINE bool DL_SPI_isPowerEnabled(const SPI_Regs *spi)
|
|
{
|
|
return (
|
|
(spi->GPRCM.PWREN & SPI_PWREN_ENABLE_MASK) == SPI_PWREN_ENABLE_ENABLE);
|
|
}
|
|
|
|
/**
|
|
* @brief Resets spi peripheral
|
|
*
|
|
* @param spi Pointer to the register overlay for the peripheral
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_reset(SPI_Regs *spi)
|
|
{
|
|
spi->GPRCM.RSTCTL =
|
|
(SPI_RSTCTL_KEY_UNLOCK_W | SPI_RSTCTL_RESETSTKYCLR_CLR |
|
|
SPI_RSTCTL_RESETASSERT_ASSERT);
|
|
}
|
|
|
|
/**
|
|
* @brief Returns if spi peripheral was reset
|
|
*
|
|
* @param spi Pointer to the register overlay for the peripheral
|
|
*
|
|
* @return true if peripheral was reset
|
|
* @return false if peripheral wasn't reset
|
|
*
|
|
*/
|
|
__STATIC_INLINE bool DL_SPI_isReset(const SPI_Regs *spi)
|
|
{
|
|
return ((spi->GPRCM.STAT & SPI_GPRCM_STAT_RESETSTKY_MASK) ==
|
|
SPI_GPRCM_STAT_RESETSTKY_RESET);
|
|
}
|
|
|
|
/**
|
|
* @brief Enable the SPI peripheral
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_enable(SPI_Regs *spi)
|
|
{
|
|
spi->CTL1 |= SPI_CTL1_ENABLE_ENABLE;
|
|
}
|
|
|
|
/**
|
|
* @brief Checks if the SPI peripheral is enabled
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
*
|
|
* @return Returns the enabled status of the SPI
|
|
*
|
|
* @retval true The SPI peripheral is enabled
|
|
* @retval false The SPI peripheral is disabled
|
|
*/
|
|
__STATIC_INLINE bool DL_SPI_isEnabled(const SPI_Regs *spi)
|
|
{
|
|
return ((spi->CTL1 & SPI_CTL1_ENABLE_MASK) == SPI_CTL1_ENABLE_ENABLE);
|
|
}
|
|
|
|
/**
|
|
* @brief Disable the SPI peripheral
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_disable(SPI_Regs *spi)
|
|
{
|
|
spi->CTL1 &= ~(SPI_CTL1_ENABLE_MASK);
|
|
}
|
|
|
|
/**
|
|
* @brief Configure SPI source clock
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the
|
|
* peripheral
|
|
* @param[in] config Pointer to the clock configuration struct
|
|
* @ref DL_SPI_ClockConfig.
|
|
*/
|
|
void DL_SPI_setClockConfig(SPI_Regs *spi, const DL_SPI_ClockConfig *config);
|
|
|
|
/**
|
|
* @brief Get SPI source clock configuration
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the
|
|
* peripheral
|
|
* @param[in] config Pointer to the clock configuration struct
|
|
* @ref DL_SPI_ClockConfig.
|
|
*/
|
|
void DL_SPI_getClockConfig(const SPI_Regs *spi, DL_SPI_ClockConfig *config);
|
|
|
|
/**
|
|
* @brief Checks if the SPI is busy transmitting
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
*
|
|
* @return Returns the busy status of the SPI
|
|
*
|
|
* @retval true The SPI is transmitting
|
|
* @retval false The SPI is idle
|
|
*/
|
|
__STATIC_INLINE bool DL_SPI_isBusy(const SPI_Regs *spi)
|
|
{
|
|
return ((spi->STAT & SPI_STAT_BUSY_MASK) == SPI_STAT_BUSY_ACTIVE);
|
|
}
|
|
|
|
/**
|
|
* @brief Checks if the TX FIFO is empty
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
*
|
|
* @return Returns the empty status of the TX FIFO
|
|
*
|
|
* @retval true The TX FIFO is empty
|
|
* @retval false The TX FIFO is not empty
|
|
*/
|
|
__STATIC_INLINE bool DL_SPI_isTXFIFOEmpty(const SPI_Regs *spi)
|
|
{
|
|
return ((spi->STAT & SPI_STAT_TFE_MASK) == SPI_STAT_TFE_EMPTY);
|
|
}
|
|
|
|
/**
|
|
* @brief Checks if the TX FIFO is full
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
*
|
|
* @return Returns the full status of the TX FIFO
|
|
*
|
|
* @retval true The TX FIFO is full
|
|
* @retval false The TX FIFO is not full
|
|
*/
|
|
__STATIC_INLINE bool DL_SPI_isTXFIFOFull(const SPI_Regs *spi)
|
|
{
|
|
return ((spi->STAT & SPI_STAT_TNF_MASK) == SPI_STAT_TNF_FULL);
|
|
}
|
|
|
|
/**
|
|
* @brief Checks if the RX FIFO is empty
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
*
|
|
* @return Returns the empty status of the RX FIFO
|
|
*
|
|
* @retval true The RX FIFO is empty
|
|
* @retval false The RX FIFO is not empty
|
|
*/
|
|
__STATIC_INLINE bool DL_SPI_isRXFIFOEmpty(const SPI_Regs *spi)
|
|
{
|
|
return ((spi->STAT & SPI_STAT_RFE_MASK) == SPI_STAT_RFE_EMPTY);
|
|
}
|
|
|
|
/**
|
|
* @brief Checks if the RX FIFO is full
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
*
|
|
* @return Returns the full status of the RX FIFO
|
|
*
|
|
* @retval true The RX FIFO is full
|
|
* @retval false The RX FIFO is not full
|
|
*/
|
|
__STATIC_INLINE bool DL_SPI_isRXFIFOFull(const SPI_Regs *spi)
|
|
{
|
|
return ((spi->STAT & SPI_STAT_RNF_MASK) == SPI_STAT_RNF_FULL);
|
|
}
|
|
|
|
/**
|
|
* @brief Sets the parity configuration used for transactions
|
|
*
|
|
* This API sets the configuration for both receive parity and transmit parity.
|
|
* This includes which bit is used, and whether even or odd parity is set.
|
|
*
|
|
* To individually enable or dsiable the receive or transmit parity, refer to
|
|
* the APIs listed below.
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
* @param[in] parity Parity configuration to use. One of @ref DL_SPI_PARITY.
|
|
*
|
|
* @sa DL_SPI_init
|
|
* @sa DL_SPI_enableReceiveParity
|
|
* @sa DL_SPI_disableReceiveParity
|
|
* @sa DL_SPI_enableTransmitParity
|
|
* @sa DL_SPI_disableTransmitParity
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_setParity(SPI_Regs *spi, DL_SPI_PARITY parity)
|
|
{
|
|
DL_Common_updateReg(&spi->CTL1, (uint32_t) parity,
|
|
(SPI_CTL1_PREN_MASK | SPI_CTL1_PTEN_MASK | SPI_CTL1_PES_MASK));
|
|
}
|
|
|
|
/**
|
|
* @brief Get the current receive and transmit parity configuration
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
*
|
|
* @return The current parity configuration being used
|
|
*
|
|
* @retval One of @ref DL_SPI_PARITY
|
|
*/
|
|
__STATIC_INLINE DL_SPI_PARITY DL_SPI_getParity(const SPI_Regs *spi)
|
|
{
|
|
uint32_t parity = spi->CTL1 & (SPI_CTL1_PES_MASK | SPI_CTL1_PREN_MASK |
|
|
SPI_CTL1_PTEN_MASK);
|
|
|
|
return (DL_SPI_PARITY)(parity);
|
|
}
|
|
|
|
/**
|
|
* @brief Enables receive parity
|
|
*
|
|
* This API only enables receive parity, it does not configure the parity mode
|
|
* used.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*
|
|
* @sa DL_SPI_setParity
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_enableReceiveParity(SPI_Regs *spi)
|
|
{
|
|
spi->CTL1 |= SPI_CTL1_PREN_ENABLE;
|
|
}
|
|
|
|
/**
|
|
* @brief Disables receive parity
|
|
*
|
|
* This API only disable receive parity, it does not configure the parity mode
|
|
* used.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*
|
|
* @sa DL_SPI_setParity
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_disableReceiveParity(SPI_Regs *spi)
|
|
{
|
|
spi->CTL1 &= ~(SPI_CTL1_PREN_MASK);
|
|
}
|
|
|
|
/**
|
|
* @brief Checks if receive parity is enabled
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*
|
|
* @return If receive parity is enabled
|
|
*
|
|
* @retval true Receive parity is enabled
|
|
* @retval false Receive parity is disabled
|
|
*/
|
|
__STATIC_INLINE bool DL_SPI_isReceiveParityEnabled(const SPI_Regs *spi)
|
|
{
|
|
return ((spi->CTL1 & SPI_CTL1_PREN_MASK) == SPI_CTL1_PREN_ENABLE);
|
|
}
|
|
|
|
/**
|
|
* @brief Enables transmit parity
|
|
*
|
|
* This API only enables transmit parity, it does not configure the parity mode
|
|
* used.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*
|
|
* @sa DL_SPI_setParity
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_enableTransmitParity(SPI_Regs *spi)
|
|
{
|
|
spi->CTL1 |= SPI_CTL1_PTEN_ENABLE;
|
|
}
|
|
|
|
/**
|
|
* @brief Disables transmit parity
|
|
*
|
|
* This API only disables transmit parity, it does not configure the parity
|
|
* mode used.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*
|
|
* @sa DL_SPI_setParity
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_disableTransmitParity(SPI_Regs *spi)
|
|
{
|
|
spi->CTL1 &= ~(SPI_CTL1_PTEN_MASK);
|
|
}
|
|
|
|
/**
|
|
* @brief Checks if transmit parity is enabled
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*
|
|
* @return If transmit parity is enabled
|
|
*
|
|
* @retval true Transmit parity is enabled
|
|
* @retval false Transmit parity is disabled
|
|
*/
|
|
__STATIC_INLINE bool DL_SPI_isTransmitParityEnabled(const SPI_Regs *spi)
|
|
{
|
|
return ((spi->CTL1 & SPI_CTL1_PTEN_MASK) == SPI_CTL1_PTEN_ENABLE);
|
|
}
|
|
|
|
/**
|
|
* @brief Set the frame format to use
|
|
*
|
|
* Configures the frame format to use for transactions. If you are using chip
|
|
* select you must use one of the Motorola 4 wire frame formats.
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
* @param[in] frameFormat Frame format to use. One of @ref
|
|
* DL_SPI_FRAME_FORMAT.
|
|
*
|
|
* @sa DL_SPI_init
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_setFrameFormat(
|
|
SPI_Regs *spi, DL_SPI_FRAME_FORMAT frameFormat)
|
|
{
|
|
DL_Common_updateReg(&spi->CTL0, (uint32_t) frameFormat,
|
|
(SPI_CTL0_FRF_MASK | SPI_CTL0_SPO_MASK | SPI_CTL0_SPH_MASK));
|
|
}
|
|
|
|
/**
|
|
* @brief Get the frame format configuration
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
*
|
|
* @return The current frame format being used
|
|
*
|
|
* @retval One of @ref DL_SPI_FRAME_FORMAT
|
|
*/
|
|
__STATIC_INLINE DL_SPI_FRAME_FORMAT DL_SPI_getFrameFormat(const SPI_Regs *spi)
|
|
{
|
|
uint32_t frameFormat = spi->CTL0 & (SPI_CTL0_FRF_MASK | SPI_CTL0_SPO_MASK |
|
|
SPI_CTL0_SPH_MASK);
|
|
|
|
return (DL_SPI_FRAME_FORMAT)(frameFormat);
|
|
}
|
|
|
|
/**
|
|
* @brief Set the size for transfers
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
* @param[in] dataSize Number of bits used in a transfer.
|
|
* One of @ref DL_SPI_DATA_SIZE
|
|
*
|
|
* @sa DL_SPI_init
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_setDataSize(
|
|
SPI_Regs *spi, DL_SPI_DATA_SIZE dataSize)
|
|
{
|
|
DL_Common_updateReg(&spi->CTL0, (uint32_t) dataSize, SPI_CTL0_DSS_MASK);
|
|
}
|
|
|
|
/**
|
|
* @brief Get the configured size for transfers
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
*
|
|
* @return The currently configured size for transfers
|
|
*
|
|
* @retval One of @ref DL_SPI_DATA_SIZE
|
|
*/
|
|
__STATIC_INLINE DL_SPI_DATA_SIZE DL_SPI_getDataSize(const SPI_Regs *spi)
|
|
{
|
|
uint32_t dataSize = spi->CTL0 & SPI_CTL0_DSS_MASK;
|
|
|
|
return (DL_SPI_DATA_SIZE)(dataSize);
|
|
}
|
|
|
|
/**
|
|
* @brief Set whether the device should be in controller/peripheral mode
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
* @param[in] mode Mode to configure the SPI into. One of @ref DL_SPI_MODE.
|
|
*
|
|
* @sa DL_SPI_init
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_setMode(SPI_Regs *spi, DL_SPI_MODE mode)
|
|
{
|
|
DL_Common_updateReg(&spi->CTL1, (uint32_t) mode, SPI_CTL1_CP_MASK);
|
|
}
|
|
|
|
/**
|
|
* @brief Get the current mode for the SPI (controller/peripheral)
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
*
|
|
* @return The currently configured mode for the SPI (controller/peripheral)
|
|
*
|
|
* @retval One of @ref DL_SPI_MODE.
|
|
*/
|
|
__STATIC_INLINE DL_SPI_MODE DL_SPI_getMode(const SPI_Regs *spi)
|
|
{
|
|
uint32_t mode = spi->CTL1 & SPI_CTL1_CP_MASK;
|
|
|
|
return (DL_SPI_MODE)(mode);
|
|
}
|
|
|
|
/**
|
|
* @brief Set the bit order used for transfers
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
* @param[in] bitOrder Order for bits to be sent out during transfer. One of
|
|
* @ref DL_SPI_BIT_ORDER.
|
|
*
|
|
* @sa DL_SPI_init
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_setBitOrder(
|
|
SPI_Regs *spi, DL_SPI_BIT_ORDER bitOrder)
|
|
{
|
|
DL_Common_updateReg(&spi->CTL1, (uint32_t) bitOrder, SPI_CTL1_MSB_MASK);
|
|
}
|
|
|
|
/**
|
|
* @brief Get the current bit order used for transfers
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
*
|
|
* @return The currently configured bit order
|
|
*
|
|
* @retval One of @ref DL_SPI_BIT_ORDER.
|
|
*/
|
|
__STATIC_INLINE DL_SPI_BIT_ORDER DL_SPI_getBitOrder(const SPI_Regs *spi)
|
|
{
|
|
uint32_t bitOrder = spi->CTL1 & SPI_CTL1_MSB_MASK;
|
|
|
|
return (DL_SPI_BIT_ORDER)(bitOrder);
|
|
}
|
|
|
|
/**
|
|
* @brief Enables loopback mode
|
|
*
|
|
* Enables the loopback mode. When enabled, the output of the transmit serial
|
|
* shifter is connected to the input of the receive serial shifter internally.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_enableLoopbackMode(SPI_Regs *spi)
|
|
{
|
|
spi->CTL1 |= SPI_CTL1_LBM_ENABLE;
|
|
}
|
|
|
|
/**
|
|
* @brief Disables loopback mode
|
|
*
|
|
* Disables the loopback mode. When disabled, the transmit serial shifter and
|
|
* receive serial shifter are not connected internally.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_disableLoopbackMode(SPI_Regs *spi)
|
|
{
|
|
spi->CTL1 &= ~(SPI_CTL1_LBM_MASK);
|
|
}
|
|
|
|
/**
|
|
* @brief Checks if the loopback mode is enabled
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*
|
|
* @return The status of the loopback mode
|
|
*
|
|
* @retval true if loopback mode is enabled
|
|
* @retval false if loopback mode is disabled
|
|
*/
|
|
__STATIC_INLINE bool DL_SPI_isLoopbackModeEnabled(const SPI_Regs *spi)
|
|
{
|
|
return ((spi->CTL1 & SPI_CTL1_LBM_MASK) == SPI_CTL1_LBM_ENABLE);
|
|
}
|
|
|
|
/**
|
|
* @brief Set counter for repeated transmit
|
|
*
|
|
* Repeated transmit allows you to send the same data multiple times. This is
|
|
* essentially the same as writing the data into the transmit buffer
|
|
* repeatedly.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
* @param[in] numRepeats number of times to repeat the transfer. Should be a
|
|
* value between 0-255.
|
|
* @arg 0 disables the repeated transfer
|
|
* @arg 1-255 repeats that many times. So will be sent
|
|
* numRepeats + 1 times in total.
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_setRepeatTransmit(
|
|
SPI_Regs *spi, uint32_t numRepeats)
|
|
{
|
|
DL_Common_updateReg(&spi->CTL1, numRepeats << SPI_CTL1_REPEATTX_OFS,
|
|
SPI_CTL1_REPEATTX_MASK);
|
|
}
|
|
|
|
/**
|
|
* @brief Get counter for repeated transmit
|
|
*
|
|
* Repeated transmit allows you to send the same data multiple times. This is
|
|
* essentially the same as writing the data into the transmit buffer
|
|
* repeatedly.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*
|
|
* @return Number of repeats used for transfer
|
|
*
|
|
* @retval 0 Repeated transfer is disabled
|
|
* @retval 1-255 Repeat that many times.
|
|
*/
|
|
__STATIC_INLINE uint32_t DL_SPI_getRepeatTransmit(const SPI_Regs *spi)
|
|
{
|
|
return ((spi->CTL1 & SPI_CTL1_REPEATTX_MASK) >> SPI_CTL1_REPEATTX_OFS);
|
|
}
|
|
|
|
/**
|
|
* @brief Enables data alignment on chip select for peripherals
|
|
*
|
|
* When enabled, the receieve bit counter is cleared automatically when the
|
|
* chip select gets set inactive. This helps the peripheral synchronize again to
|
|
* the controller in case of a disturbance or glitch on the clock line or during
|
|
* initialization.
|
|
*
|
|
* This is only relevant when in peripheral mode.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_enablePeripheralAlignDataOnChipSelect(
|
|
SPI_Regs *spi)
|
|
{
|
|
spi->CTL0 |= SPI_CTL0_CSCLR_ENABLE;
|
|
}
|
|
|
|
/**
|
|
* @brief Disables data alignment on chip select for peripherals
|
|
*
|
|
* When disable, the receieve bit counter is not cleared automatically when
|
|
* the chip select gets set inactive.
|
|
*
|
|
* This is only relevant when in peripheral mode.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_disablePeripheralAlignDataOnChipSelect(
|
|
SPI_Regs *spi)
|
|
{
|
|
spi->CTL0 &= ~(SPI_CTL0_CSCLR_MASK);
|
|
}
|
|
|
|
/**
|
|
* @brief Checks if data alignment on chip select for peripherals is enabled
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*
|
|
* @return The status of data alignment on chip select
|
|
*
|
|
* @retval true Data alignment on chip select is enabled
|
|
* @retval false Data alignment on chip select is disabled
|
|
*/
|
|
__STATIC_INLINE bool DL_SPI_isPeripheralAlignDataOnChipSelectEnabled(
|
|
const SPI_Regs *spi)
|
|
{
|
|
return ((spi->CTL0 & SPI_CTL0_CSCLR_MASK) == SPI_CTL0_CSCLR_ENABLE);
|
|
}
|
|
|
|
/**
|
|
* @brief Enables packing feature
|
|
*
|
|
* When enabled, two entries of the RX FIFO are returned as a 32-bit value.
|
|
* When reading the TX FIFO, if the last write to that field was a 32-bit
|
|
* write, those 32-bits will be returned.
|
|
* When writing to the TX FIFO, a 32-bit write will be written as one FIFO
|
|
* entry.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_enablePacking(SPI_Regs *spi)
|
|
{
|
|
spi->CTL0 |= SPI_CTL0_PACKEN_ENABLED;
|
|
}
|
|
|
|
/**
|
|
* @brief Disables packing feature
|
|
*
|
|
* When disabled, 1 entry of the RX FIFO is returned as a 16-bit value.
|
|
* When reading the TX FIFO, if the last write to that field was a 16-bit
|
|
* write, those 16-bits wil be returned.
|
|
* When writing to the TX FIFO, a 32-bit write will be written as two FIFO
|
|
* entries.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_disablePacking(SPI_Regs *spi)
|
|
{
|
|
spi->CTL0 &= ~(SPI_CTL0_PACKEN_MASK);
|
|
}
|
|
|
|
/**
|
|
* @brief Checks if packing feature is enabled
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*
|
|
* @return If packing is enabled
|
|
*
|
|
* @retval true Packing is enabled
|
|
* @retval false Packing is disabled
|
|
*/
|
|
__STATIC_INLINE bool DL_SPI_isPackingEnabled(const SPI_Regs *spi)
|
|
{
|
|
return ((spi->CTL0 & SPI_CTL0_PACKEN_MASK) == SPI_CTL0_PACKEN_ENABLED);
|
|
}
|
|
|
|
/**
|
|
* @brief Set chip select used for controller or peripheral mode
|
|
*
|
|
* Choose which chip select should be used for data transfer. User must ensure
|
|
* one of the 4-wire frame formats were selected using @ref DL_SPI_init or
|
|
* @ref DL_SPI_setFrameFormat.
|
|
*
|
|
* This API is for both controller and peripheral modes, and the chip select
|
|
* can be changed in the application by calling this API.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
* @param[in] chipSelect the chip select pin to use. One of @ref
|
|
* DL_SPI_CHIP_SELECT.
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_setChipSelect(
|
|
SPI_Regs *spi, DL_SPI_CHIP_SELECT chipSelect)
|
|
{
|
|
DL_Common_updateReg(
|
|
&spi->CTL0, (uint32_t) chipSelect, SPI_CTL0_CSSEL_MASK);
|
|
}
|
|
|
|
/**
|
|
* @brief Get chip select used for controller or peripheral mode
|
|
*
|
|
* This API is for both controller and peripheral modes.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*
|
|
* @return The current chip selected used for data transfer
|
|
*
|
|
* @retval One of @ref DL_SPI_CHIP_SELECT.
|
|
*/
|
|
__STATIC_INLINE DL_SPI_CHIP_SELECT DL_SPI_getChipSelect(const SPI_Regs *spi)
|
|
{
|
|
uint32_t chipSelect = spi->CTL0 & SPI_CTL0_CSSEL_MASK;
|
|
|
|
return (DL_SPI_CHIP_SELECT)(chipSelect);
|
|
}
|
|
|
|
/**
|
|
* @brief Set peripheral receive timeout
|
|
*
|
|
* Sets the number of clock cycles before a receive timeout occurs.
|
|
*
|
|
* This is only relevant when in peripheral mode.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
* @param[in] timeout Number of clock cycles before a receive timeout
|
|
* occurs. Must be between 0-63.
|
|
* @arg 0 Disables receive timeout
|
|
* @arg 1-63 Number of clock cycles before timeout
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_setPeripheralReceiveTimeout(
|
|
SPI_Regs *spi, uint32_t timeout)
|
|
{
|
|
DL_Common_updateReg(&spi->CTL1, timeout << SPI_CTL1_RXTIMEOUT_OFS,
|
|
SPI_CTL1_RXTIMEOUT_MASK);
|
|
}
|
|
|
|
/**
|
|
* @brief Get peripheral receive timeout
|
|
*
|
|
* This is only relevant when in peripheral mode.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*
|
|
* @return The current amount of cycles used for a peripheral timeout
|
|
*
|
|
* @retval 0 indicating that receive timeout is disabled
|
|
* @retval 1-63 number of clock cycles before a receive timeout occurs
|
|
*/
|
|
__STATIC_INLINE uint32_t DL_SPI_getPeripheralReceiveTimeout(
|
|
const SPI_Regs *spi)
|
|
{
|
|
return ((spi->CTL1 & SPI_CTL1_RXTIMEOUT_MASK) >> SPI_CTL1_RXTIMEOUT_OFS);
|
|
}
|
|
|
|
/**
|
|
* @brief Configure the command/data mode
|
|
*
|
|
* Command/data mode allows the hardware to control the C/D pin to indicate
|
|
* whether the data being transferred is a command or just data. The C/D pin
|
|
* is low for commands and high for data.
|
|
*
|
|
* You can use this API to manually set the C/D pin by passing in @ref
|
|
* DL_SPI_CD_MODE_DATA or @ref DL_SPI_CD_MODE_COMMAND. You can also have the
|
|
* C/D pin switch automatically by passing in how many bytes are part of the
|
|
* command transfer. The C/D pin will stay low until that many bytes are sent
|
|
* out and then automatically switch to high.
|
|
*
|
|
* This is only relevant when in controller mode.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
* @param[in] config configuration for command/data mode. One of:
|
|
* @arg DL_SPI_CD_MODE_DATA
|
|
* @arg DL_SPI_CD_MODE_COMMAND
|
|
* @arg A value between 1-14 to indicate how many bytes
|
|
* should be sent as command
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_setControllerCommandDataModeConfig(
|
|
SPI_Regs *spi, uint32_t config)
|
|
{
|
|
DL_Common_updateReg(
|
|
&spi->CTL1, config << SPI_CTL1_CDMODE_OFS, SPI_CTL1_CDMODE_MASK);
|
|
}
|
|
|
|
/**
|
|
* @brief Get the command/data mode configuration
|
|
*
|
|
* Returns the current configuration for command/data mode. When using the
|
|
* automatic C/D pin the value read back will be the number of command bytes
|
|
* remaining to be sent.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*
|
|
* @return The current configuration for command/data mode
|
|
*
|
|
* @retval DL_SPI_CD_MODE_DATA if in manual data mode
|
|
* @retval DL_SPI_CD_MODE_COMMAND if in manual command mode
|
|
* @retval 1-14 indicating how many command bytes still need to be sent
|
|
*/
|
|
__STATIC_INLINE uint32_t DL_SPI_getControllerCommandDataModeConfig(
|
|
const SPI_Regs *spi)
|
|
{
|
|
return ((spi->CTL1 & SPI_CTL1_CDMODE_MASK) >> SPI_CTL1_CDMODE_OFS);
|
|
}
|
|
|
|
/**
|
|
* @brief Enables command/data mode
|
|
*
|
|
* When command/data mode is enabled, the C/D pin is used to differentiate
|
|
* between command and data during the transaction.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*
|
|
* @sa DL_SPI_setControllerCommandDataModeConfig
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_enableControllerCommandDataMode(SPI_Regs *spi)
|
|
{
|
|
spi->CTL1 |= SPI_CTL1_CDENABLE_ENABLE;
|
|
}
|
|
|
|
/**
|
|
* @brief Disables command/data mode
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_disableControllerCommandDataMode(SPI_Regs *spi)
|
|
{
|
|
spi->CTL1 &= ~(SPI_CTL1_CDENABLE_MASK);
|
|
}
|
|
|
|
/**
|
|
* @brief Checks if command/data mode is enabled
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*
|
|
* @return The status of command/data mode
|
|
*
|
|
* @retval true Command/data mode is enabled
|
|
* @retval false Command/data mode is disabled
|
|
*/
|
|
__STATIC_INLINE bool DL_SPI_isControllerCommandDataModeEnabled(
|
|
const SPI_Regs *spi)
|
|
{
|
|
return ((spi->CTL1 & SPI_CTL1_CDENABLE_MASK) == SPI_CTL1_CDENABLE_ENABLE);
|
|
}
|
|
|
|
/**
|
|
* @brief Enables peripheral data output
|
|
*
|
|
* When peripheral data output is enabled, the peripheral can drive the POCI output pin.
|
|
* This will cause problems if all peripherals have their RXD lines tied together
|
|
* and the controller is trying to broadcast a message to all peripherals while
|
|
* ensuring only one peripheral drives data onto its serial output line.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_enablePeripheralDataOutput(SPI_Regs *spi)
|
|
{
|
|
spi->CTL1 &= ~(SPI_CTL1_POD_MASK);
|
|
}
|
|
|
|
/**
|
|
* @brief Disables peripheral data output
|
|
*
|
|
* When peripheral data output is disabled, the peripheral cannot drive the POCI output
|
|
* pin. This allows multiple peripherals that have their RXD lines tied together to
|
|
* receive a broadcasted message from a controller.
|
|
*
|
|
* This is only relevant when in peripheral mode.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_disablePeripheralDataOutput(SPI_Regs *spi)
|
|
{
|
|
spi->CTL1 |= SPI_CTL1_POD_ENABLE;
|
|
}
|
|
|
|
/**
|
|
* @brief Checks if peripheral data output is enabled
|
|
*
|
|
* This is only relevant when in peripheral mode.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*
|
|
* @return If peripheral data output is enabled
|
|
*
|
|
* @retval true if peripheral data output is enabled
|
|
* @retval false if peripheral data output is disabled
|
|
*/
|
|
__STATIC_INLINE bool DL_SPI_isPeripheralDataOutputEnabled(const SPI_Regs *spi)
|
|
{
|
|
return ((spi->CTL1 & SPI_CTL1_POD_MASK) == SPI_CTL1_POD_DISABLE);
|
|
}
|
|
|
|
/**
|
|
* @brief Set the delay sampling
|
|
*
|
|
* In controller mode only, the data on the input pin will be delayed sampled
|
|
* by the defined SPI clock cycles. The delay can be adjusted in steps of SPI
|
|
* input clock steps. The maximum allowed delay should not exceed the length
|
|
* of one data frame
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
* @param[in] delay The number of SPI clock cycles to delay sampling on
|
|
* input pin. Value between 0-15.
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_setDelayedSampling(SPI_Regs *spi, uint32_t delay)
|
|
{
|
|
DL_Common_updateReg(&spi->CLKCTL, delay << SPI_CLKCTL_DSAMPLE_OFS,
|
|
SPI_CLKCTL_DSAMPLE_MASK);
|
|
}
|
|
|
|
/**
|
|
* @brief Get the delay sampling
|
|
*
|
|
* In controller mode only, the data on the input pin will be delayed sampled
|
|
* by the defined SPI clock cycles. The delay can be adjusted in steps of SPI
|
|
* input clock steps. The maximum allowed delay should not exceed the length
|
|
* of one data frame
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
*
|
|
* @return The amount of delay sampling on the input pin in SPI
|
|
* clock cycles.
|
|
*
|
|
* @retval 0 - 15. The amount of delay sampling in SPI clock cycles.
|
|
*/
|
|
__STATIC_INLINE uint32_t DL_SPI_getDelayedSampling(const SPI_Regs *spi)
|
|
{
|
|
return (spi->CLKCTL & SPI_CLKCTL_DSAMPLE_MASK >> SPI_CLKCTL_DSAMPLE_OFS);
|
|
}
|
|
|
|
/**
|
|
* @brief Set the RX and TX FIFO interrupt threshold level
|
|
*
|
|
* Select the threshold for the receive and transmit FIFO interrupts. The
|
|
* interrupts are generated based on a transition through a level rather
|
|
* than being based on the level. That is, the interrupts are generated when
|
|
* the fill level progresses through the trigger level.
|
|
*
|
|
* For example, if the trigger level is set to the half-way mark, the interrupt
|
|
* is triggered when the FIFO becomes half empty/full.
|
|
*
|
|
* Out of reset, the FIFOs are triggered to interrupt at half-way mark.
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
* @param[in] rxThreshold One of @ref DL_SPI_RX_FIFO_LEVEL
|
|
* @param[in] txThreshold One of @ref DL_SPI_TX_FIFO_LEVEL
|
|
*
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_setFIFOThreshold(SPI_Regs *spi,
|
|
DL_SPI_RX_FIFO_LEVEL rxThreshold, DL_SPI_TX_FIFO_LEVEL txThreshold)
|
|
{
|
|
DL_Common_updateReg(&spi->IFLS,
|
|
(uint32_t) rxThreshold | (uint32_t) txThreshold,
|
|
SPI_IFLS_RXIFLSEL_MASK | SPI_IFLS_TXIFLSEL_MASK);
|
|
}
|
|
|
|
/**
|
|
* @brief Get the TX FIFO interrupt threshold level
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
*
|
|
* @return The TX FIFO interrupt threshold level
|
|
*
|
|
* @retval One of @ref DL_SPI_TX_FIFO_LEVEL
|
|
*/
|
|
__STATIC_INLINE DL_SPI_TX_FIFO_LEVEL DL_SPI_getTXFIFOThreshold(
|
|
const SPI_Regs *spi)
|
|
{
|
|
uint32_t txThreshold = spi->IFLS & SPI_IFLS_TXIFLSEL_MASK;
|
|
|
|
return (DL_SPI_TX_FIFO_LEVEL)(txThreshold);
|
|
}
|
|
|
|
/**
|
|
* @brief Get the RX FIFO interrupt threshold level
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
*
|
|
* @return The RX FIFO interrupt threshold level
|
|
*
|
|
* @retval One of @ref DL_SPI_RX_FIFO_LEVEL
|
|
*/
|
|
__STATIC_INLINE DL_SPI_RX_FIFO_LEVEL DL_SPI_getRXFIFOThreshold(
|
|
const SPI_Regs *spi)
|
|
{
|
|
uint32_t rxThreshold = spi->IFLS & SPI_IFLS_RXIFLSEL_MASK;
|
|
|
|
return (DL_SPI_RX_FIFO_LEVEL)(rxThreshold);
|
|
}
|
|
|
|
/**
|
|
* @brief Set the SPI bit rate serial clock divider (SCR)
|
|
*
|
|
* The SPI includes a programmable bit rate clock divider and prescaler to
|
|
* generate the serial output clock. The bit rates are supported up to
|
|
* FUNCCLK/2. The functional clock selection depends on the specific device,
|
|
* please refer to the device datasheet and PMU/Clock section.
|
|
*
|
|
* The SPI output bit rate is calculated with the following formula:
|
|
* SPI bit rate = (SPI functional clock) / ((1 + SCR)*2)
|
|
* Given this formula, the SCR can be calculated:
|
|
* SCR = (SPI functional clock) / ((2 * SPI bit rate) - 1)
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
* @param[in] SCR The SPI serial clock divider. Value between 0-1023.
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_setBitRateSerialClockDivider(
|
|
SPI_Regs *spi, uint32_t SCR)
|
|
{
|
|
DL_Common_updateReg(&spi->CLKCTL, SCR, SPI_CLKCTL_SCR_MASK);
|
|
}
|
|
|
|
/**
|
|
* @brief Get the SPI bit rate serial clock divider (SCR)
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
*
|
|
* @return The current bit rate serial clock divider
|
|
*
|
|
* @retval The SPI SCR. Value from 0-1023
|
|
*/
|
|
__STATIC_INLINE uint32_t DL_SPI_getBitRateSerialClockDivider(
|
|
const SPI_Regs *spi)
|
|
{
|
|
return (spi->CLKCTL & SPI_CLKCTL_SCR_MASK);
|
|
}
|
|
|
|
/**
|
|
* @brief Writes 8-bit data into the TX FIFO for transmit
|
|
*
|
|
* Puts the data into the TX FIFO without checking its status. Use if already
|
|
* sure the TX FIFO has space for the write. See related APIs for additional
|
|
* transmit options.
|
|
*
|
|
* Can be used for any data transfers that are less than or equal to 8 bits.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
* @param[in] data data to send
|
|
*
|
|
* @sa DL_SPI_transmitDataBlocking8
|
|
* @sa DL_SPI_transmitDataCheck8
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_transmitData8(SPI_Regs *spi, uint8_t data)
|
|
{
|
|
spi->TXDATA = data;
|
|
}
|
|
|
|
/**
|
|
* @brief Writes 16-bit data into the TX FIFO for transmit
|
|
*
|
|
* Puts the data into the TX FIFO without checking its status. Use if already
|
|
* sure the TX FIFO has space for the write. See related APIs for additional
|
|
* transmit options.
|
|
*
|
|
* Can be used for any data transfers that are less than or equal to 16 bits.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
* @param[in] data data to send
|
|
*
|
|
* @sa DL_SPI_transmitDataBlocking16
|
|
* @sa DL_SPI_transmitDataCheck16
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_transmitData16(SPI_Regs *spi, uint16_t data)
|
|
{
|
|
spi->TXDATA = data;
|
|
}
|
|
|
|
/**
|
|
* @brief Writes 32-bit data into the TX FIFO for transmit
|
|
*
|
|
* Puts the data into the TX FIFO without checking its status. Use if already
|
|
* sure the TX FIFO has space for the write. See related APIs for additional
|
|
* transmit options.
|
|
*
|
|
* Can be used for any data transfers that are less than or equal to 32 bits.
|
|
*
|
|
* NOTE: If packing is enabled by calling @ref DL_SPI_enablePacking prior to
|
|
* calling this API, then a 32-bit write will be written as one FIFO entry. If
|
|
* packing is disabled, then a 32-bit write will be written as two FIFO
|
|
* entries.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
* @param[in] data data to send
|
|
*
|
|
* @sa DL_SPI_enablePacking
|
|
* @sa DL_SPI_transmitDataBlocking32
|
|
* @sa DL_SPI_transmitDataCheck32
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_transmitData32(SPI_Regs *spi, uint32_t data)
|
|
{
|
|
spi->TXDATA = data;
|
|
}
|
|
|
|
/**
|
|
* @brief Reads 8-bit data from the RX FIFO
|
|
*
|
|
* Reads the data from the RX FIFO without checking its status. Use if
|
|
* already sure the RX FIFO has data available. See related APIs for
|
|
* additional receive options.
|
|
*
|
|
* Can be used for any data transfers that are less than or equal to 8 bits.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*
|
|
* @return The data in the RX FIFO
|
|
*
|
|
* @sa DL_SPI_receiveDataBlocking8
|
|
* @sa DL_SPI_receiveDataCheck8
|
|
*/
|
|
__STATIC_INLINE uint8_t DL_SPI_receiveData8(const SPI_Regs *spi)
|
|
{
|
|
return ((uint8_t)(spi->RXDATA));
|
|
}
|
|
|
|
/**
|
|
* @brief Reads 16-bit data from the RX FIFO
|
|
*
|
|
* Reads the data from the RX FIFO without checking its status. Use if
|
|
* already sure the RX FIFO has data available. See related APIs for
|
|
* additional receive options.
|
|
*
|
|
* Can be used for any data transfers that are less than or equal to 16 bits.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*
|
|
* @return The data in the RX FIFO
|
|
*
|
|
* @sa DL_SPI_receiveDataBlocking16
|
|
* @sa DL_SPI_receiveDataCheck16
|
|
*/
|
|
__STATIC_INLINE uint16_t DL_SPI_receiveData16(const SPI_Regs *spi)
|
|
{
|
|
return ((uint16_t)(spi->RXDATA));
|
|
}
|
|
|
|
/**
|
|
* @brief Reads 32-bit data from the RX FIFO
|
|
*
|
|
* Reads the data from the RX FIFO without checking its status. Use if
|
|
* already sure the RX FIFO has data available. See related APIs for
|
|
* additional receive options.
|
|
*
|
|
* Can be used for any data transfers that are less than or equal to 32 bits.
|
|
*
|
|
* NOTE: Requires that packing has been enabled by calling
|
|
* @ref DL_SPI_enablePacking prior to calling this API. When packing is
|
|
* enabled, two entries of the RX FIFO are returned as a 32-bit value.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*
|
|
* @return The data in the RX FIFO
|
|
*
|
|
* @pre DL_SPI_enablePacking
|
|
*
|
|
* @sa DL_SPI_receiveDataBlocking32
|
|
* @sa DL_SPI_receiveDataCheck32
|
|
*/
|
|
__STATIC_INLINE uint32_t DL_SPI_receiveData32(const SPI_Regs *spi)
|
|
{
|
|
return spi->RXDATA;
|
|
}
|
|
|
|
/**
|
|
* @brief Enable SPI interrupts
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the
|
|
* peripheral
|
|
* @param[in] interruptMask Bit mask of interrupts to enable. Bitwise OR of
|
|
* @ref DL_SPI_INTERRUPT.
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_enableInterrupt(
|
|
SPI_Regs *spi, uint32_t interruptMask)
|
|
{
|
|
spi->CPU_INT.IMASK |= interruptMask;
|
|
}
|
|
|
|
/**
|
|
* @brief Disable SPI interrupts
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the
|
|
* peripheral
|
|
* @param[in] interruptMask Bit mask of interrupts to disable. Bitwise OR of
|
|
* @ref DL_SPI_INTERRUPT.
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_disableInterrupt(
|
|
SPI_Regs *spi, uint32_t interruptMask)
|
|
{
|
|
spi->CPU_INT.IMASK &= ~(interruptMask);
|
|
}
|
|
|
|
/**
|
|
* @brief Check which SPI interrupts are enabled
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the
|
|
* peripheral
|
|
* @param[in] interruptMask Bit mask of interrupts to check. Bitwise OR of
|
|
* @ref DL_SPI_INTERRUPT.
|
|
*
|
|
* @return Which of the requested SPI interrupts are enabled
|
|
*
|
|
* @retval Bitwise OR of @ref DL_SPI_INTERRUPT values
|
|
*/
|
|
__STATIC_INLINE uint32_t DL_SPI_getEnabledInterrupts(
|
|
const SPI_Regs *spi, uint32_t interruptMask)
|
|
{
|
|
return (spi->CPU_INT.IMASK & interruptMask);
|
|
}
|
|
|
|
/**
|
|
* @brief Check interrupt flag of enabled SPI interrupts
|
|
*
|
|
* Checks if any of the SPI interrupts that were previously enabled are
|
|
* pending.
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the
|
|
* peripheral
|
|
* @param[in] interruptMask Bit mask of interrupts to check. Bitwise OR of
|
|
* @ref DL_SPI_INTERRUPT.
|
|
*
|
|
* @return Which of the requested SPI interrupts are pending
|
|
*
|
|
* @retval Bitwise OR of @ref DL_SPI_INTERRUPT values
|
|
*
|
|
* @sa DL_SPI_enableInterrupt
|
|
*/
|
|
__STATIC_INLINE uint32_t DL_SPI_getEnabledInterruptStatus(
|
|
const SPI_Regs *spi, uint32_t interruptMask)
|
|
{
|
|
return (spi->CPU_INT.MIS & interruptMask);
|
|
}
|
|
|
|
/**
|
|
* @brief Check interrupt flag of any SPI interrupt
|
|
*
|
|
* Checks if any of the SPI interrupts are pending. Interrupts do not have to
|
|
* be previously enabled.
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the
|
|
* peripheral
|
|
* @param[in] interruptMask Bit mask of interrupts to check. Bitwise OR of
|
|
* @ref DL_SPI_INTERRUPT.
|
|
*
|
|
* @return Which of the requested SPI interrupts are pending
|
|
*
|
|
* @retval Bitwise OR of @ref DL_SPI_INTERRUPT values
|
|
*/
|
|
__STATIC_INLINE uint32_t DL_SPI_getRawInterruptStatus(
|
|
const SPI_Regs *spi, uint32_t interruptMask)
|
|
{
|
|
return (spi->CPU_INT.RIS & interruptMask);
|
|
}
|
|
|
|
/**
|
|
* @brief Get highest priority pending SPI interrupt
|
|
*
|
|
* Checks if any of the SPI interrupts are pending. Interrupts do not have to
|
|
* be previously enabled.
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the
|
|
* peripheral
|
|
*
|
|
* @return The highest priority pending SPI interrupt. One of @ref
|
|
* DL_SPI_IIDX
|
|
*/
|
|
__STATIC_INLINE DL_SPI_IIDX DL_SPI_getPendingInterrupt(const SPI_Regs *spi)
|
|
{
|
|
return ((DL_SPI_IIDX) spi->CPU_INT.IIDX);
|
|
}
|
|
|
|
/**
|
|
* @brief Clear pending SPI interrupts
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the
|
|
* peripheral
|
|
* @param[in] interruptMask Bit mask of interrupts to clear. Bitwise OR of
|
|
* @ref DL_SPI_INTERRUPT.
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_clearInterruptStatus(
|
|
SPI_Regs *spi, uint32_t interruptMask)
|
|
{
|
|
spi->CPU_INT.ICLR = interruptMask;
|
|
}
|
|
|
|
/**
|
|
* @brief Blocks to ensure transmit is ready before sending data
|
|
*
|
|
* Puts the data into the TX FIFO after blocking to ensure the TX FIFO is not
|
|
* full. Will wait indefinitely until there is space in the TX FIFO. See
|
|
* related APIs for additional transmit options.
|
|
*
|
|
* Can be used for any data transfers that are less than or equal to 8 bits.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
* @param[in] data data to send
|
|
*
|
|
* @sa DL_SPI_transmitData8
|
|
* @sa DL_SPI_transmitDataCheck8
|
|
*/
|
|
void DL_SPI_transmitDataBlocking8(SPI_Regs *spi, uint8_t data);
|
|
|
|
/**
|
|
* @brief Blocks to ensure transmit is ready before sending data
|
|
*
|
|
* Puts the data into the TX FIFO after blocking to ensure the TX FIFO is not
|
|
* full. Will wait indefinitely until there is space in the TX FIFO. See related
|
|
* APIs for additional transmit options.
|
|
*
|
|
* Can be used for any data transfers that are less than or equal to 16 bits.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
* @param[in] data data to send
|
|
*
|
|
* @sa DL_SPI_transmitData16
|
|
* @sa DL_SPI_transmitDataCheck16
|
|
*/
|
|
void DL_SPI_transmitDataBlocking16(SPI_Regs *spi, uint16_t data);
|
|
|
|
/**
|
|
* @brief Blocks to ensure transmit is ready before sending data
|
|
*
|
|
* Puts the data into the TX FIFO after blocking to ensure the TX FIFO is not
|
|
* full. Will wait indefinitely until there is space in the TX FIFO. See related
|
|
* APIs for additional transmit options.
|
|
*
|
|
* Can be used for any data transfers that are less than or equal to 32 bits.
|
|
*
|
|
* NOTE: If packing is enabled by calling @ref DL_SPI_enablePacking prior to
|
|
* calling this API, then a 32-bit write will be written as one FIFO entry. If
|
|
* packing is disabled, then a 32-bit write will be written as two FIFO
|
|
* entries.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
* @param[in] data data to send
|
|
*
|
|
* @sa DL_SPI_enablePacking
|
|
* @sa DL_SPI_transmitData32
|
|
* @sa DL_SPI_transmitDataCheck32
|
|
*/
|
|
void DL_SPI_transmitDataBlocking32(SPI_Regs *spi, uint32_t data);
|
|
|
|
/**
|
|
* @brief Blocks to ensure receive is ready before reading data
|
|
*
|
|
* Reads the data from the RX FIFO after blocking to ensure the RX FIFO is not
|
|
* empty. Will wait indefinitely until there is data in the RX FIFO. See
|
|
* related APIs for additional receive options.
|
|
*
|
|
* Can be used for any data transfers that are less than or equal to 8 bits.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*
|
|
* @return The data in the RX FIFO
|
|
*
|
|
* @sa DL_SPI_transmitData8
|
|
* @sa DL_SPI_transmitDataCheck8
|
|
*/
|
|
uint8_t DL_SPI_receiveDataBlocking8(const SPI_Regs *spi);
|
|
|
|
/**
|
|
* @brief Blocks to ensure receive is ready before reading data
|
|
*
|
|
* Reads the data from the RX FIFO after blocking to ensure the RX FIFO is not
|
|
* empty. Will wait indefinitely until there is data in the RX FIFO. See
|
|
* related APIs for additional receive options.
|
|
*
|
|
* Can be used for any data transfers that are less than or equal to 16 bits.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*
|
|
* @return The data in the RX FIFO
|
|
*
|
|
* @sa DL_SPI_transmitData16
|
|
* @sa DL_SPI_transmitDataCheck16
|
|
*/
|
|
uint16_t DL_SPI_receiveDataBlocking16(const SPI_Regs *spi);
|
|
|
|
/**
|
|
* @brief Blocks to ensure receive is ready before reading data
|
|
*
|
|
* Reads the data from the RX FIFO after blocking to ensure the RX FIFO is not
|
|
* empty. Will wait indefinitely until there is data in the RX FIFO. See
|
|
* related APIs for additional receive options.
|
|
*
|
|
* Can be used for any data transfers that are less than or equal to 32 bits.
|
|
*
|
|
* NOTE: Requires that packing has been enabled by calling
|
|
* @ref DL_SPI_enablePacking prior to calling this API. When packing is
|
|
* enabled, two entries of the RX FIFO are returned as a 32-bit value.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
*
|
|
* @return The data in the RX FIFO
|
|
*
|
|
* @pre DL_SPI_enablePacking
|
|
*
|
|
* @sa DL_SPI_transmitData32
|
|
* @sa DL_SPI_transmitDataCheck32
|
|
*/
|
|
uint32_t DL_SPI_receiveDataBlocking32(const SPI_Regs *spi);
|
|
|
|
/**
|
|
* @brief Checks the TX FIFO before trying to transmit data
|
|
*
|
|
* Checks if the TX FIFO is already full before trying to add new data to the
|
|
* FIFO. Exits immediately if full rather than trying to block. See related
|
|
* APIs for additional transmit options.
|
|
*
|
|
* Can be used for any data transfers that are less than or equal to 8 bits.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
* @param[in] data data to send
|
|
*
|
|
* @return If the transmit occurred
|
|
*
|
|
* @retval true if data was added to the TX FIFO
|
|
* @retval false if the TX FIFO was full and data was not added
|
|
*
|
|
* @sa DL_SPI_transmitData8
|
|
* @sa DL_SPI_transmitDataBlocking8
|
|
*/
|
|
bool DL_SPI_transmitDataCheck8(SPI_Regs *spi, uint8_t data);
|
|
|
|
/**
|
|
* @brief Checks the TX FIFO before trying to transmit data
|
|
*
|
|
* Checks if the TX FIFO is already full before trying to add new data to the
|
|
* FIFO. Exits immediately if full rather than trying to block. See related
|
|
* APIs for additional transmit options.
|
|
*
|
|
* Can be used for any data transfers that are less than or equal to 16 bits.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
* @param[in] data data to send
|
|
*
|
|
* @return If the transmit occurred
|
|
*
|
|
* @retval true if data was added to the TX FIFO
|
|
* @retval false if the TX FIFO was full and data was not added
|
|
*
|
|
* @sa DL_SPI_transmitData16
|
|
* @sa DL_SPI_transmitDataBlocking16
|
|
*/
|
|
bool DL_SPI_transmitDataCheck16(SPI_Regs *spi, uint16_t data);
|
|
|
|
/**
|
|
* @brief Checks the TX FIFO before trying to transmit data
|
|
*
|
|
* Checks if the TX FIFO is already full before trying to add new data to the
|
|
* FIFO. Exits immediately if full rather than trying to block. See related
|
|
* APIs for additional transmit options.
|
|
*
|
|
* Can be used for any data transfers that are less than or equal to 32 bits.
|
|
*
|
|
* NOTE: If packing is enabled by calling @ref DL_SPI_enablePacking prior to
|
|
* calling this API, then a 32-bit write will be written as one FIFO entry. If
|
|
* packing is disabled, then a 32-bit write will be written as two FIFO
|
|
* entries.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
* @param[in] data data to send
|
|
*
|
|
* @return If the transmit occurred
|
|
*
|
|
* @retval true if data was added to the TX FIFO
|
|
* @retval false if the TX FIFO was full and data was not added
|
|
*
|
|
* @sa DL_SPI_enablePacking
|
|
* @sa DL_SPI_transmitData32
|
|
* @sa DL_SPI_transmitDataBlocking32
|
|
*/
|
|
bool DL_SPI_transmitDataCheck32(SPI_Regs *spi, uint32_t data);
|
|
|
|
/**
|
|
* @brief Checks the RX FIFO before trying to transmit data
|
|
*
|
|
* Checks if the RX FIFO is already empty before trying to read new data from
|
|
* the FIFO. Exits immediately if empty rather than trying to block. See
|
|
* related APIs for additional receive options.
|
|
*
|
|
* Can be used for any data transfers that are less than or equal to 8 bits.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
* @param[in] buffer a buffer to write the received data into
|
|
*
|
|
* @return If the receive occurred
|
|
*
|
|
* @retval true if data was read from the RX FIFO
|
|
* @retval false if the RX FIFO was empty and data was not read
|
|
*
|
|
* @sa DL_SPI_receiveData8
|
|
* @sa DL_SPI_receiveDataBlocking8
|
|
*/
|
|
bool DL_SPI_receiveDataCheck8(const SPI_Regs *spi, uint8_t *buffer);
|
|
|
|
/**
|
|
* @brief Checks the RX FIFO before trying to transmit data
|
|
*
|
|
* Checks if the RX FIFO is already empty before trying to read new data from
|
|
* the FIFO. Exits immediately if empty rather than trying to block. See
|
|
* related APIs for additional receive options.
|
|
*
|
|
* Can be used for any data transfers that are less than or equal to 16 bits.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
* @param[in] buffer a buffer to write the received data into
|
|
*
|
|
* @return If the receive occurred
|
|
*
|
|
* @retval true if data was read from the RX FIFO
|
|
* @retval false if the RX FIFO was empty and data was not read
|
|
*
|
|
* @sa DL_SPI_receiveData16
|
|
* @sa DL_SPI_receiveDataBlocking16
|
|
*/
|
|
bool DL_SPI_receiveDataCheck16(const SPI_Regs *spi, uint16_t *buffer);
|
|
|
|
/**
|
|
* @brief Checks the RX FIFO before trying to transmit data
|
|
*
|
|
* Checks if the RX FIFO is already empty before trying to read new data from
|
|
* the FIFO. Exits immediately if empty rather than trying to block. See
|
|
* related APIs for additional receive options.
|
|
*
|
|
* Can be used for any data transfers that are less than or equal to 32 bits.
|
|
*
|
|
* NOTE: Requires that packing has been enabled by calling
|
|
* @ref DL_SPI_enablePacking prior to calling this API. When packing is
|
|
* enabled, two entries of the RX FIFO are returned as a 32-bit value.
|
|
*
|
|
* @param[in] spi pointer to the register overlay for the peripheral
|
|
* @param[in] buffer a buffer to write the received data into
|
|
*
|
|
* @return If the receive occurred
|
|
*
|
|
* @retval true if data was read from the RX FIFO
|
|
* @retval false if the RX FIFO was empty and data was not read
|
|
*
|
|
* @pre DL_SPI_enablePacking
|
|
*
|
|
* @sa DL_SPI_receiveData32
|
|
* @sa DL_SPI_receiveDataBlocking32
|
|
*/
|
|
bool DL_SPI_receiveDataCheck32(const SPI_Regs *spi, uint32_t *buffer);
|
|
|
|
/**
|
|
* @brief Read all available data out of the RX FIFO using 8 bit access
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
* @param[out] buffer Buffer to write received data into
|
|
* @param[in] maxCount Max number of bytes to read from the RX FIFO
|
|
*
|
|
* @return Number of bytes read from the RX FIFO
|
|
*/
|
|
uint32_t DL_SPI_drainRXFIFO8(
|
|
const SPI_Regs *spi, uint8_t *buffer, uint32_t maxCount);
|
|
|
|
/**
|
|
* @brief Read all available data out of the RX FIFO using 16 bit access
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
* @param[out] buffer Buffer to write received data into
|
|
* @param[in] maxCount Max number of halfwords to read from the RX FIFO
|
|
*
|
|
* @return Number of halfwords read from the RX FIFO
|
|
*/
|
|
uint32_t DL_SPI_drainRXFIFO16(
|
|
const SPI_Regs *spi, uint16_t *buffer, uint32_t maxCount);
|
|
|
|
/**
|
|
* @brief Read all available data out of the RX FIFO using 32 bit access
|
|
*
|
|
* NOTE: Requires that packing has been enabled by calling
|
|
* @ref DL_SPI_enablePacking prior to calling this API. When packing is
|
|
* enabled, two entries of the RX FIFO are returned as a 32-bit value.
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
* @param[out] buffer Buffer to write received data into
|
|
* @param[in] maxCount Max number of words to read from the RX FIFO
|
|
*
|
|
* @return Number of words read from the RX FIFO
|
|
*
|
|
* @pre DL_SPI_enablePacking
|
|
*
|
|
*/
|
|
uint32_t DL_SPI_drainRXFIFO32(
|
|
const SPI_Regs *spi, uint32_t *buffer, uint32_t maxCount);
|
|
|
|
/**
|
|
* @brief Fill the TX FIFO using 8 bit access
|
|
*
|
|
* Continuously write data into the TX FIFO until it is filled up or count has
|
|
* been reached.
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
* @param[in] buffer Buffer of data to write to the TX FIFO
|
|
* @param[in] count Max number of bytes to write to the TX FIFO
|
|
*
|
|
* @return Number of bytes written to the TX FIFO
|
|
*/
|
|
uint32_t DL_SPI_fillTXFIFO8(
|
|
SPI_Regs *spi, const uint8_t *buffer, uint32_t count);
|
|
|
|
/**
|
|
* @brief Fill the TX FIFO using 16 bit access
|
|
*
|
|
* Continuously write data into the TX FIFO until it is filled up or count has
|
|
* been reached.
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
* @param[in] buffer Buffer of data to write to the TX FIFO
|
|
* @param[in] count Max number of halfwords to write to the TX FIFO
|
|
*
|
|
* @return Number of halfwords written to the TX FIFO
|
|
*/
|
|
uint32_t DL_SPI_fillTXFIFO16(
|
|
SPI_Regs *spi, const uint16_t *buffer, uint32_t count);
|
|
|
|
/**
|
|
* @brief Fill the TX FIFO using 32 bit access
|
|
*
|
|
* Continuously write data into the TX FIFO until it is filled up or count has
|
|
* been reached.
|
|
*
|
|
* NOTE: If packing is enabled by calling @ref DL_SPI_enablePacking prior to
|
|
* calling this API, then a 32-bit write will be written as one FIFO entry. If
|
|
* packing is disabled, then a 32-bit write will be written as two FIFO
|
|
* entries.
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
* @param[in] buffer Buffer of data to write to the TX FIFO
|
|
* @param[in] count Max number of words to write to the TX FIFO
|
|
*
|
|
* @return Number of words written to the TX FIFO
|
|
*
|
|
* @sa DL_SPI_enablePacking
|
|
*/
|
|
uint32_t DL_SPI_fillTXFIFO32(
|
|
SPI_Regs *spi, const uint32_t *buffer, uint32_t count);
|
|
|
|
/**
|
|
* @brief Enable SPI interrupt for triggering the DMA receive event
|
|
*
|
|
* Enables the SPI interrupt to be used as the condition to generate an
|
|
* event to directly trigger the DMA. This API configures the DMA_TRIG_RX
|
|
* register, which is the event publisher used for triggering the DMA to do
|
|
* a receive data transfer.
|
|
*
|
|
* @note Only one interrupt source should be enabled at a time.
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the
|
|
* peripheral
|
|
* @param[in] interrupt Interrupt to enable as the trigger condition for
|
|
* the DMA. One of @ref DL_SPI_DMA_INTERRUPT_RX.
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_enableDMAReceiveEvent(
|
|
SPI_Regs *spi, uint32_t interrupt)
|
|
{
|
|
spi->DMA_TRIG_RX.IMASK = interrupt;
|
|
}
|
|
|
|
/**
|
|
* @brief Enable SPI interrupt for triggering the DMA transmit event
|
|
*
|
|
* Enables the SPI interrupt to be used as the condition to generate an
|
|
* event to directly trigger the DMA. This API configures the DMA_TRIG_TX
|
|
* register, which is the event publisher used for triggering the DMA to do
|
|
* a transmit data transfer.
|
|
*
|
|
* @note DMA_TRIG_TX only has one transmit interrupt source
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the
|
|
* peripheral
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_enableDMATransmitEvent(SPI_Regs *spi)
|
|
{
|
|
spi->DMA_TRIG_TX.IMASK = SPI_DMA_TRIG_TX_IMASK_TX_SET;
|
|
}
|
|
|
|
/**
|
|
* @brief Disables SPI interrupt from triggering the DMA receive event
|
|
*
|
|
* Disables the SPI interrupt as the condition to generate an event to
|
|
* directly trigger the DMA. This API configures the DMA_TRIG_RX
|
|
* register, which is the event publisher used for triggering the DMA to do
|
|
* a receive data transfer.
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the
|
|
* peripheral
|
|
* @param[in] interrupt Interrupt to disable as the trigger condition for
|
|
* the DMA. One of @ref DL_SPI_DMA_INTERRUPT_RX.
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_disableDMAReceiveEvent(
|
|
SPI_Regs *spi, uint32_t interrupt)
|
|
{
|
|
spi->DMA_TRIG_RX.IMASK &= ~(interrupt);
|
|
}
|
|
|
|
/**
|
|
* @brief Disables SPI interrupt from triggering the DMA transmit event
|
|
*
|
|
* Disables the SPI interrupt as the condition to generate an event to
|
|
* directly trigger the DMA. This API configures the DMA_TRIG_TX
|
|
* register, which is the event publisher used for triggering the DMA to do
|
|
* a transmit data transfer.
|
|
*
|
|
* @note DMA_TRIG_TX only has one transmit interrupt source
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the
|
|
* peripheral
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_disableDMATransmitEvent(SPI_Regs *spi)
|
|
{
|
|
spi->DMA_TRIG_TX.IMASK = SPI_DMA_TRIG_TX_IMASK_TX_CLR;
|
|
}
|
|
|
|
/**
|
|
* @brief Check which SPI interrupt for DMA receive events is enabled
|
|
*
|
|
* This API checks the DMA_TRIG_RX register, which is the event publisher used
|
|
* for triggering the DMA to do a receive data transfer.
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the
|
|
* peripheral
|
|
* @param[in] interruptMask Bit mask of interrupts to check. Bitwise OR of
|
|
* @ref DL_SPI_DMA_INTERRUPT_RX.
|
|
*
|
|
* @note Only one interrupt source should be enabled at a time.
|
|
*
|
|
* @return Which of the requested SPI interrupts is enabled
|
|
*
|
|
* @retval One of @ref DL_SPI_DMA_INTERRUPT_RX
|
|
*/
|
|
__STATIC_INLINE uint32_t DL_SPI_getEnabledDMAReceiveEvent(
|
|
const SPI_Regs *spi, uint32_t interruptMask)
|
|
{
|
|
return (spi->DMA_TRIG_RX.IMASK & interruptMask);
|
|
}
|
|
|
|
/**
|
|
* @brief Check if SPI interrupt for DMA transmit event is enabled
|
|
*
|
|
* This API checks the DMA_TRIG_TX register, which is the event publisher used
|
|
* for triggering the DMA to do a transmit data transfer.
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the
|
|
* peripheral
|
|
*
|
|
* @return The requested SPI interrupt status
|
|
*
|
|
* @retval DL_SPI_DMA_INTERRUPT_TX if enabled, 0 if not enabled
|
|
*/
|
|
__STATIC_INLINE uint32_t DL_SPI_getEnabledDMATransmitEvent(const SPI_Regs *spi)
|
|
{
|
|
return (spi->DMA_TRIG_TX.IMASK & SPI_DMA_TRIG_TX_IMASK_TX_MASK);
|
|
}
|
|
|
|
/**
|
|
* @brief Check interrupt flag of enabled SPI interrupt for DMA receive event
|
|
*
|
|
* Checks if any of the SPI interrupts for the DMA receive event that were
|
|
* previously enabled are pending.
|
|
* This API checks the DMA_TRIG_RX register, which is the event publisher used
|
|
* for triggering the DMA to do a receive data transfer.
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the
|
|
* peripheral
|
|
* @param[in] interruptMask Bit mask of interrupts to check. Bitwise OR of
|
|
* @ref DL_SPI_DMA_INTERRUPT_RX.
|
|
*
|
|
* @note Only one interrupt source should be enabled at a time.
|
|
*
|
|
* @return The requested SPI interrupt status
|
|
*
|
|
* @retval One of @ref DL_SPI_DMA_INTERRUPT_RX
|
|
*
|
|
* @sa DL_SPI_enableDMAReceiveEvent
|
|
*/
|
|
__STATIC_INLINE uint32_t DL_SPI_getEnabledDMAReceiveEventStatus(
|
|
const SPI_Regs *spi, uint32_t interruptMask)
|
|
{
|
|
return (spi->DMA_TRIG_RX.MIS & interruptMask);
|
|
}
|
|
|
|
/**
|
|
* @brief Check interrupt flag of enabled SPI interrupt for DMA transmit event
|
|
*
|
|
* Checks if the SPI interrupt for the DMA transmit event that was
|
|
* previously enabled is pending.
|
|
* This API checks the DMA_TRIG_TX register, which is the event publisher used
|
|
* for triggering the DMA to do a transmit data transfer.
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the
|
|
* peripheral
|
|
*
|
|
* @return The requested SPI interrupt status
|
|
*
|
|
* @retval DL_SPI_DMA_INTERRUPT_TX if enabled, 0 if not enabled
|
|
*
|
|
* @sa DL_SPI_enableDMATransmitEvent
|
|
*/
|
|
__STATIC_INLINE uint32_t DL_SPI_getEnabledDMATransmitEventStatus(
|
|
const SPI_Regs *spi)
|
|
{
|
|
return (spi->DMA_TRIG_TX.MIS & SPI_DMA_TRIG_TX_MIS_TX_MASK);
|
|
}
|
|
|
|
/**
|
|
* @brief Check interrupt flag of any SPI interrupt for DMA receive event
|
|
*
|
|
* Checks if any of the SPI interrupts for DMA receive event are pending.
|
|
* Interrupts do not have to be previously enabled.
|
|
* This API checks the DMA_TRIG_RX register, which is the event publisher used
|
|
* for triggering the DMA to do a receive data transfer.
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the
|
|
* peripheral
|
|
* @param[in] interruptMask Bit mask of interrupts to check. Bitwise OR of
|
|
* @ref DL_SPI_DMA_INTERRUPT_RX.
|
|
*
|
|
* @return Which of the requested SPI interrupts are pending
|
|
*
|
|
* @retval Bitwise OR of @ref DL_SPI_DMA_INTERRUPT_RX values
|
|
*/
|
|
__STATIC_INLINE uint32_t DL_SPI_getRawDMAReceiveEventStatus(
|
|
const SPI_Regs *spi, uint32_t interruptMask)
|
|
{
|
|
return (spi->DMA_TRIG_RX.RIS & interruptMask);
|
|
}
|
|
|
|
/**
|
|
* @brief Check interrupt flag of any SPI interrupt for DMA transmit event
|
|
*
|
|
* Checks if any of the SPI interrupts for DMA transmit event are pending.
|
|
* Interrupts do not have to be previously enabled.
|
|
* This API checks the DMA_TRIG_TX register, which is the event publisher used
|
|
* for triggering the DMA to do a transmit data transfer.
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the
|
|
* peripheral
|
|
*
|
|
* @return The requested SPI interrupt status
|
|
*
|
|
* @retval DL_SPI_DMA_INTERRUPT_TX if enabled, 0 if not enabled
|
|
*/
|
|
__STATIC_INLINE uint32_t DL_SPI_getRawDMATransmitEventStatus(
|
|
const SPI_Regs *spi)
|
|
{
|
|
return (spi->DMA_TRIG_TX.RIS & SPI_DMA_TRIG_TX_RIS_TX_MASK);
|
|
}
|
|
|
|
/**
|
|
* @brief Get highest priority pending SPI interrupt for DMA receive event
|
|
*
|
|
* Checks if any of the SPI interrupts for DMA receive event are pending.
|
|
* Interrupts do not have to be previously enabled.
|
|
* This API checks the DMA_TRIG_RX register, which is the event publisher used
|
|
* for triggering the DMA to do a receive data transfer.
|
|
*
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the
|
|
* peripheral
|
|
*
|
|
* @return The highest priority pending SPI interrupt
|
|
*
|
|
* @retval One of @ref DL_SPI_DMA_IIDX_RX
|
|
*/
|
|
__STATIC_INLINE DL_SPI_DMA_IIDX_RX DL_SPI_getPendingDMAReceiveEvent(
|
|
const SPI_Regs *spi)
|
|
{
|
|
return (DL_SPI_DMA_IIDX_RX)(spi->DMA_TRIG_RX.IIDX);
|
|
}
|
|
|
|
/**
|
|
* @brief Get highest priority pending SPI interrupt for DMA transmit event
|
|
*
|
|
* Checks if the SPI interrupt for DMA transmit event is pending.
|
|
* Interrupts do not have to be previously enabled.
|
|
* This API checks the DMA_TRIG_TX register, which is the event publisher used
|
|
* for triggering the DMA to do a transmit data transfer.
|
|
*
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the
|
|
* peripheral
|
|
*
|
|
* @return The highest priority pending SPI interrupt
|
|
*
|
|
* @retval DL_SPI_DMA_IIDX_TX if pending, 0 if not pending
|
|
*/
|
|
__STATIC_INLINE DL_SPI_DMA_IIDX_TX DL_SPI_getPendingDMATransmitEvent(
|
|
const SPI_Regs *spi)
|
|
{
|
|
return (DL_SPI_DMA_IIDX_TX)(spi->DMA_TRIG_TX.IIDX);
|
|
}
|
|
|
|
/**
|
|
* @brief Clear pending SPI interrupts for DMA receive event
|
|
*
|
|
* This API checks the DMA_TRIG_RX register, which is the event publisher used
|
|
* for triggering the DMA to do a receive data transfer.
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the
|
|
* peripheral
|
|
* @param[in] interruptMask Bit mask of interrupts to clear. Bitwise OR of
|
|
* @ref DL_SPI_DMA_INTERRUPT_RX.
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_clearDMAReceiveEventStatus(
|
|
SPI_Regs *spi, uint32_t interruptMask)
|
|
{
|
|
spi->DMA_TRIG_RX.ICLR = interruptMask;
|
|
}
|
|
|
|
/**
|
|
* @brief Clear pending SPI interrupt for DMA transmit event
|
|
*
|
|
* This API checks the DMA_TRIG_TX register, which is the event publisher used
|
|
* for triggering the DMA to do a transmit data transfer.
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the
|
|
* peripheral
|
|
* @note DMA_TRIG_TX only has one transmit interrupt source
|
|
*/
|
|
__STATIC_INLINE void DL_SPI_clearDMATransmitEventStatus(SPI_Regs *spi)
|
|
{
|
|
spi->DMA_TRIG_TX.ICLR = SPI_DMA_TRIG_TX_ICLR_TX_CLR;
|
|
}
|
|
|
|
/**
|
|
* @brief Save SPI configuration before entering a power loss state.
|
|
*
|
|
* Some MSPM0G peripherals residing in PD1 domain do not retain register
|
|
* contents when entering STOP or STANDBY modes. Please refer to the datasheet
|
|
* for the full list of peripheral instances that exhibit this behavior.
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
*
|
|
* @param[in] ptr Configuration backup setup structure. See
|
|
* @ref DL_SPI_backupConfig.
|
|
*
|
|
* @retval FALSE if a configuration already exists in ptr (will not be
|
|
* overwritten). TRUE if a configuration was successfully saved
|
|
*
|
|
* @sa DL_SPI_restoreConfiguration
|
|
*/
|
|
bool DL_SPI_saveConfiguration(const SPI_Regs *spi, DL_SPI_backupConfig *ptr);
|
|
|
|
/**
|
|
* @brief Restore SPI configuration after leaving a power loss state.
|
|
*
|
|
* Some MSPM0G peripherals residing in PD1 domain do not retain register
|
|
* contents when entering STOP or STANDBY modes. Please refer to the datasheet
|
|
* for the full list of peripheral instances that exhibit this behavior.
|
|
*
|
|
* @param[in] spi Pointer to the register overlay for the peripheral
|
|
*
|
|
* @param[in] ptr Configuration backup setup structure. See
|
|
* @ref DL_SPI_backupConfig.
|
|
*
|
|
* @retval FALSE if a configuration does not exist in ptr (will not be
|
|
* loaded). TRUE if a configuration successfully loaded
|
|
*
|
|
* @sa DL_SPI_saveConfiguration
|
|
*/
|
|
bool DL_SPI_restoreConfiguration(SPI_Regs *spi, DL_SPI_backupConfig *ptr);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __MSPM0_HAS_SPI__ */
|
|
|
|
#endif /* ti_dl_dl_spi__include */
|
|
/** @}*/
|