| /* |
| * Copyright (c) 2016, Freescale Semiconductor, Inc. |
| * Copyright 2016-2020 NXP |
| * All rights reserved. |
| * |
| * SPDX-License-Identifier: BSD-3-Clause |
| */ |
| #ifndef _FSL_ECSPI_H_ |
| #define _FSL_ECSPI_H_ |
| |
| #include "fsl_common.h" |
| |
| /*! |
| * @addtogroup ecspi_driver |
| * @{ |
| */ |
| |
| /******************************************************************************* |
| * Definitions |
| ******************************************************************************/ |
| |
| /*! @name Driver version */ |
| /*@{*/ |
| /*! @brief ECSPI driver version 2.1.0. */ |
| #define FSL_ECSPI_DRIVER_VERSION (MAKE_VERSION(2, 1, 0)) |
| /*@}*/ |
| |
| #ifndef ECSPI_DUMMYDATA |
| /*! @brief ECSPI dummy transfer data, the data is sent while txBuff is NULL. */ |
| #define ECSPI_DUMMYDATA (0xFFFFFFFFU) |
| #endif |
| |
| /*! @brief Retry times for waiting flag. */ |
| #ifndef SPI_RETRY_TIMES |
| #define SPI_RETRY_TIMES 0U /* Define to zero means keep waiting until the flag is assert/deassert. */ |
| #endif |
| |
| /*! @brief Return status for the ECSPI driver. */ |
| enum |
| { |
| kStatus_ECSPI_Busy = MAKE_STATUS(kStatusGroup_ECSPI, 0), /*!< ECSPI bus is busy */ |
| kStatus_ECSPI_Idle = MAKE_STATUS(kStatusGroup_ECSPI, 1), /*!< ECSPI is idle */ |
| kStatus_ECSPI_Error = MAKE_STATUS(kStatusGroup_ECSPI, 2), /*!< ECSPI error */ |
| kStatus_ECSPI_HardwareOverFlow = MAKE_STATUS(kStatusGroup_ECSPI, 3), /*!< ECSPI hardware overflow */ |
| kStatus_ECSPI_Timeout = MAKE_STATUS(kStatusGroup_ECSPI, 4), /*!< ECSPI timeout polling status flags. */ |
| }; |
| |
| /*! @brief ECSPI clock polarity configuration. */ |
| typedef enum _ecspi_clock_polarity |
| { |
| kECSPI_PolarityActiveHigh = 0x0U, /*!< Active-high ECSPI polarity high (idles low). */ |
| kECSPI_PolarityActiveLow, /*!< Active-low ECSPI polarity low (idles high). */ |
| } ecspi_clock_polarity_t; |
| |
| /*! @brief ECSPI clock phase configuration. */ |
| typedef enum _ecspi_clock_phase |
| { |
| kECSPI_ClockPhaseFirstEdge = |
| 0x0U, /*!< First edge on SPSCK occurs at the middle of the first cycle of a data transfer. */ |
| kECSPI_ClockPhaseSecondEdge, /*!< First edge on SPSCK occurs at the start of the first cycle of a data transfer. */ |
| } ecspi_clock_phase_t; |
| |
| /*! @brief ECSPI interrupt sources. */ |
| enum |
| { |
| kECSPI_TxfifoEmptyInterruptEnable = ECSPI_INTREG_TEEN_MASK, /*!< Transmit FIFO buffer empty interrupt */ |
| kECSPI_TxFifoDataRequstInterruptEnable = ECSPI_INTREG_TDREN_MASK, /*!< Transmit FIFO data requst interrupt */ |
| kECSPI_TxFifoFullInterruptEnable = ECSPI_INTREG_TFEN_MASK, /*!< Transmit FIFO full interrupt */ |
| kECSPI_RxFifoReadyInterruptEnable = ECSPI_INTREG_RREN_MASK, /*!< Receiver FIFO ready interrupt */ |
| kECSPI_RxFifoDataRequstInterruptEnable = ECSPI_INTREG_RDREN_MASK, /*!< Receiver FIFO data requst interrupt */ |
| kECSPI_RxFifoFullInterruptEnable = ECSPI_INTREG_RFEN_MASK, /*!< Receiver FIFO full interrupt */ |
| kECSPI_RxFifoOverFlowInterruptEnable = ECSPI_INTREG_ROEN_MASK, /*!< Receiver FIFO buffer overflow interrupt */ |
| kECSPI_TransferCompleteInterruptEnable = ECSPI_INTREG_TCEN_MASK, /*!< Transfer complete interrupt */ |
| kECSPI_AllInterruptEnable = (ECSPI_INTREG_TEEN_MASK | ECSPI_INTREG_TDREN_MASK | ECSPI_INTREG_TFEN_MASK | |
| ECSPI_INTREG_RREN_MASK | ECSPI_INTREG_RDREN_MASK | ECSPI_INTREG_RFEN_MASK | |
| ECSPI_INTREG_ROEN_MASK | ECSPI_INTREG_TCEN_MASK), /*!< All interrupt */ |
| }; |
| |
| /*! @brief ECSPI status flags. */ |
| enum |
| { |
| kECSPI_TxfifoEmptyFlag = ECSPI_STATREG_TE_MASK, /*!< Transmit FIFO buffer empty flag */ |
| kECSPI_TxFifoDataRequstFlag = ECSPI_STATREG_TDR_MASK, /*!< Transmit FIFO data requst flag */ |
| kECSPI_TxFifoFullFlag = ECSPI_STATREG_TF_MASK, /*!< Transmit FIFO full flag */ |
| kECSPI_RxFifoReadyFlag = ECSPI_STATREG_RR_MASK, /*!< Receiver FIFO ready flag */ |
| kECSPI_RxFifoDataRequstFlag = ECSPI_STATREG_RDR_MASK, /*!< Receiver FIFO data requst flag */ |
| kECSPI_RxFifoFullFlag = ECSPI_STATREG_RF_MASK, /*!< Receiver FIFO full flag */ |
| kECSPI_RxFifoOverFlowFlag = ECSPI_STATREG_RO_MASK, /*!< Receiver FIFO buffer overflow flag */ |
| kECSPI_TransferCompleteFlag = ECSPI_STATREG_TC_MASK, /*!< Transfer complete flag */ |
| }; |
| /*! @brief ECSPI DMA enable.*/ |
| enum |
| { |
| kECSPI_TxDmaEnable = ECSPI_DMAREG_TEDEN_MASK, /*!< Tx DMA request source */ |
| kECSPI_RxDmaEnable = ECSPI_DMAREG_RXDEN_MASK, /*!< Rx DMA request source */ |
| kECSPI_DmaAllEnable = (ECSPI_DMAREG_TEDEN_MASK | ECSPI_DMAREG_RXDEN_MASK) /*!< All DMA request source*/ |
| }; |
| |
| /*! @brief ECSPI SPI_RDY signal configuration. */ |
| typedef enum _ecspi_data_ready |
| { |
| kECSPI_DataReadyIgnore = 0x0U, /*!< SPI_RDY signal is ignored */ |
| kECSPI_DataReadyFallingEdge, /*!< SPI_RDY signal will be triggerd by the falling edge */ |
| kECSPI_DataReadyLowLevel, /*!< SPI_RDY signal will be triggerd by a low level */ |
| } ecspi_Data_ready_t; |
| |
| /*! @brief ECSPI channel select source. */ |
| typedef enum _ecspi_channel_source |
| { |
| kECSPI_Channel0 = 0x0U, /*!< Channel 0 is selectd */ |
| kECSPI_Channel1, /*!< Channel 1 is selectd */ |
| kECSPI_Channel2, /*!< Channel 2 is selectd */ |
| kECSPI_Channel3, /*!< Channel 3 is selectd */ |
| } ecspi_channel_source_t; |
| |
| /*! @brief ECSPI master or slave mode configuration. */ |
| typedef enum _ecspi_master_slave_mode |
| { |
| kECSPI_Slave = 0U, /*!< ECSPI peripheral operates in slave mode.*/ |
| kECSPI_Master, /*!< ECSPI peripheral operates in master mode.*/ |
| } ecspi_master_slave_mode_t; |
| |
| /*! @brief ECSPI data line inactive state configuration. */ |
| typedef enum _ecspi_data_line_inactive_state_t |
| { |
| kECSPI_DataLineInactiveStateHigh = 0x0U, /*!< The data line inactive state stays high. */ |
| kECSPI_DataLineInactiveStateLow, /*!< The data line inactive state stays low. */ |
| } ecspi_data_line_inactive_state_t; |
| |
| /*! @brief ECSPI clock inactive state configuration. */ |
| typedef enum _ecspi_clock_inactive_state_t |
| { |
| kECSPI_ClockInactiveStateLow = 0x0U, /*!< The SCLK inactive state stays low. */ |
| kECSPI_ClockInactiveStateHigh, /*!< The SCLK inactive state stays high. */ |
| } ecspi_clock_inactive_state_t; |
| |
| /*! @brief ECSPI active state configuration.*/ |
| typedef enum _ecspi_chip_select_active_state_t |
| { |
| kECSPI_ChipSelectActiveStateLow = 0x0U, /*!< The SS signal line active stays low. */ |
| kECSPI_ChipSelectActiveStateHigh, /*!< The SS signal line active stays high. */ |
| } ecspi_chip_select_active_state_t; |
| |
| /*! @brief ECSPI wave form configuration.*/ |
| typedef enum _ecspi_wave_form_t |
| { |
| kECSPI_WaveFormSingle = 0x0U, /*!< The wave form for signal burst */ |
| kECSPI_WaveFormMultiple, /*!< The wave form for multiple burst */ |
| } ecspi_wave_form_t; |
| |
| /*! @brief ECSPI sample period clock configuration.*/ |
| typedef enum _ecspi_sample_period_clock_source |
| { |
| kECSPI_spiClock = 0x0U, /*!< The sample period clock source is SCLK. */ |
| kECSPI_lowFreqClock, /*!< The sample seriod clock source is low_frequency reference clock(32.768 kHz). */ |
| } ecspi_sample_period_clock_source_t; |
| |
| /*! @brief ECSPI user channel configure structure.*/ |
| typedef struct _ecspi_channel_config |
| { |
| ecspi_master_slave_mode_t channelMode; /*!< Channel mode */ |
| ecspi_clock_inactive_state_t clockInactiveState; /*!< Clock line (SCLK) inactive state */ |
| ecspi_data_line_inactive_state_t dataLineInactiveState; /*!< Data line (MOSI&MISO) inactive state */ |
| ecspi_chip_select_active_state_t chipSlectActiveState; /*!< Chip select(SS) line active state */ |
| ecspi_wave_form_t waveForm; /*!< Wave form */ |
| ecspi_clock_polarity_t polarity; /*!< Clock polarity */ |
| ecspi_clock_phase_t phase; /*!< Clock phase */ |
| } ecspi_channel_config_t; |
| |
| /*! @brief ECSPI master configure structure.*/ |
| typedef struct _ecspi_master_config |
| { |
| ecspi_channel_source_t channel; /*!< Channel number */ |
| ecspi_channel_config_t channelConfig; /*!< Channel configuration */ |
| ecspi_sample_period_clock_source_t samplePeriodClock; /*!< Sample period clock source */ |
| |
| uint8_t burstLength; /*!< Burst length */ |
| uint8_t chipSelectDelay; /*!< SS delay time */ |
| uint16_t samplePeriod; /*!< Sample period */ |
| uint8_t txFifoThreshold; /*!< TX Threshold */ |
| uint8_t rxFifoThreshold; /*!< RX Threshold */ |
| uint32_t baudRate_Bps; /*!< ECSPI baud rate for master mode */ |
| bool enableLoopback; /*!< Enable the ECSPI loopback test. */ |
| } ecspi_master_config_t; |
| |
| /*! @brief ECSPI slave configure structure.*/ |
| typedef struct _ecspi_slave_config |
| { |
| ecspi_channel_source_t channel; /*Channel number */ |
| uint8_t burstLength; /*!< Burst length */ |
| uint8_t txFifoThreshold; /*!< TX Threshold */ |
| uint8_t rxFifoThreshold; /*!< RX Threshold */ |
| ecspi_channel_config_t channelConfig; /*!< Channel configuration */ |
| } ecspi_slave_config_t; |
| |
| /*! @brief ECSPI transfer structure */ |
| typedef struct _ecspi_transfer |
| { |
| uint32_t *txData; /*!< Send buffer */ |
| uint32_t *rxData; /*!< Receive buffer */ |
| size_t dataSize; /*!< Transfer bytes */ |
| ecspi_channel_source_t channel; /*!< ECSPI channel select */ |
| } ecspi_transfer_t; |
| |
| typedef struct _ecspi_master_handle ecspi_master_handle_t; |
| /*! @brief Slave handle is the same with master handle */ |
| typedef ecspi_master_handle_t ecspi_slave_handle_t; |
| |
| /*! @brief ECSPI master callback for finished transmit */ |
| typedef void (*ecspi_master_callback_t)(ECSPI_Type *base, |
| ecspi_master_handle_t *handle, |
| status_t status, |
| void *userData); |
| |
| /*! @brief ECSPI slave callback for finished transmit */ |
| typedef void (*ecspi_slave_callback_t)(ECSPI_Type *base, ecspi_slave_handle_t *handle, status_t status, void *userData); |
| |
| /*! @brief ECSPI master handle structure */ |
| struct _ecspi_master_handle |
| { |
| ecspi_channel_source_t channel; /*!< Channel number */ |
| uint32_t *volatile txData; /*!< Transfer buffer */ |
| uint32_t *volatile rxData; /*!< Receive buffer */ |
| volatile size_t txRemainingBytes; /*!< Send data remaining in bytes */ |
| volatile size_t rxRemainingBytes; /*!< Receive data remaining in bytes */ |
| volatile uint32_t state; /*!< ECSPI internal state */ |
| size_t transferSize; /*!< Bytes to be transferred */ |
| ecspi_master_callback_t callback; /*!< ECSPI callback */ |
| void *userData; /*!< Callback parameter */ |
| }; |
| |
| #if defined(__cplusplus) |
| extern "C" { |
| #endif |
| /******************************************************************************* |
| * APIs |
| ******************************************************************************/ |
| /*! |
| * @brief Get the instance for ECSPI module. |
| * |
| * @param base ECSPI base address |
| */ |
| uint32_t ECSPI_GetInstance(ECSPI_Type *base); |
| |
| /*! |
| * @name Initialization and deinitialization |
| * @{ |
| */ |
| |
| /*! |
| * @brief Sets the ECSPI configuration structure to default values. |
| * |
| * The purpose of this API is to get the configuration structure initialized for use in ECSPI_MasterInit(). |
| * User may use the initialized structure unchanged in ECSPI_MasterInit, or modify |
| * some fields of the structure before calling ECSPI_MasterInit. After calling this API, |
| * the master is ready to transfer. |
| * Example: |
| @code |
| ecspi_master_config_t config; |
| ECSPI_MasterGetDefaultConfig(&config); |
| @endcode |
| * |
| * @param config pointer to config structure |
| */ |
| void ECSPI_MasterGetDefaultConfig(ecspi_master_config_t *config); |
| |
| /*! |
| * @brief Initializes the ECSPI with configuration. |
| * |
| * The configuration structure can be filled by user from scratch, or be set with default |
| * values by ECSPI_MasterGetDefaultConfig(). After calling this API, the slave is ready to transfer. |
| * Example |
| @code |
| ecspi_master_config_t config = { |
| .baudRate_Bps = 400000, |
| ... |
| }; |
| ECSPI_MasterInit(ECSPI0, &config); |
| @endcode |
| * |
| * @param base ECSPI base pointer |
| * @param config pointer to master configuration structure |
| * @param srcClock_Hz Source clock frequency. |
| */ |
| void ECSPI_MasterInit(ECSPI_Type *base, const ecspi_master_config_t *config, uint32_t srcClock_Hz); |
| |
| /*! |
| * @brief Sets the ECSPI configuration structure to default values. |
| * |
| * The purpose of this API is to get the configuration structure initialized for use in ECSPI_SlaveInit(). |
| * User may use the initialized structure unchanged in ECSPI_SlaveInit(), or modify |
| * some fields of the structure before calling ECSPI_SlaveInit(). After calling this API, |
| * the master is ready to transfer. |
| * Example: |
| @code |
| ecspi_Slaveconfig_t config; |
| ECSPI_SlaveGetDefaultConfig(&config); |
| @endcode |
| * |
| * @param config pointer to config structure |
| */ |
| void ECSPI_SlaveGetDefaultConfig(ecspi_slave_config_t *config); |
| |
| /*! |
| * @brief Initializes the ECSPI with configuration. |
| * |
| * The configuration structure can be filled by user from scratch, or be set with default |
| * values by ECSPI_SlaveGetDefaultConfig(). After calling this API, the slave is ready to transfer. |
| * Example |
| @code |
| ecspi_Salveconfig_t config = { |
| .baudRate_Bps = 400000, |
| ... |
| }; |
| ECSPI_SlaveInit(ECSPI1, &config); |
| @endcode |
| * |
| * @param base ECSPI base pointer |
| * @param config pointer to master configuration structure |
| */ |
| void ECSPI_SlaveInit(ECSPI_Type *base, const ecspi_slave_config_t *config); |
| |
| /*! |
| * @brief De-initializes the ECSPI. |
| * |
| * Calling this API resets the ECSPI module, gates the ECSPI clock. |
| * The ECSPI module can't work unless calling the ECSPI_MasterInit/ECSPI_SlaveInit to initialize module. |
| * |
| * @param base ECSPI base pointer |
| */ |
| void ECSPI_Deinit(ECSPI_Type *base); |
| |
| /*! |
| * @brief Enables or disables the ECSPI. |
| * |
| * @param base ECSPI base pointer |
| * @param enable pass true to enable module, false to disable module |
| */ |
| static inline void ECSPI_Enable(ECSPI_Type *base, bool enable) |
| { |
| if (enable) |
| { |
| base->CONREG |= ECSPI_CONREG_EN_MASK; |
| } |
| else |
| { |
| base->CONREG &= ~ECSPI_CONREG_EN_MASK; |
| } |
| } |
| /*! @} */ |
| |
| /*! |
| * @name Status |
| * @{ |
| */ |
| |
| /*! |
| * @brief Gets the status flag. |
| * |
| * @param base ECSPI base pointer |
| * @return ECSPI Status, use status flag to AND _ecspi_flags could get the related status. |
| */ |
| static inline uint32_t ECSPI_GetStatusFlags(ECSPI_Type *base) |
| { |
| return (base->STATREG); |
| } |
| |
| /*! |
| * @brief Clear the status flag. |
| * |
| * @param base ECSPI base pointer |
| * @param mask ECSPI Status, use status flag to AND _ecspi_flags could get the related status. |
| */ |
| static inline void ECSPI_ClearStatusFlags(ECSPI_Type *base, uint32_t mask) |
| { |
| base->STATREG |= mask; |
| } |
| /*! @} */ |
| |
| /*! |
| * @name Interrupts |
| * @{ |
| */ |
| |
| /*! |
| * @brief Enables the interrupt for the ECSPI. |
| * |
| * @param base ECSPI base pointer |
| * @param mask ECSPI interrupt source. The parameter can be any combination of the following values: |
| * @arg kECSPI_TxfifoEmptyInterruptEnable |
| * @arg kECSPI_TxFifoDataRequstInterruptEnable |
| * @arg kECSPI_TxFifoFullInterruptEnable |
| * @arg kECSPI_RxFifoReadyInterruptEnable |
| * @arg kECSPI_RxFifoDataRequstInterruptEnable |
| * @arg kECSPI_RxFifoFullInterruptEnable |
| * @arg kECSPI_RxFifoOverFlowInterruptEnable |
| * @arg kECSPI_TransferCompleteInterruptEnable |
| * @arg kECSPI_AllInterruptEnable |
| */ |
| static inline void ECSPI_EnableInterrupts(ECSPI_Type *base, uint32_t mask) |
| { |
| base->INTREG |= mask; |
| } |
| |
| /*! |
| * @brief Disables the interrupt for the ECSPI. |
| * |
| * @param base ECSPI base pointer |
| * @param mask ECSPI interrupt source. The parameter can be any combination of the following values: |
| * @arg kECSPI_TxfifoEmptyInterruptEnable |
| * @arg kECSPI_TxFifoDataRequstInterruptEnable |
| * @arg kECSPI_TxFifoFullInterruptEnable |
| * @arg kECSPI_RxFifoReadyInterruptEnable |
| * @arg kECSPI_RxFifoDataRequstInterruptEnable |
| * @arg kECSPI_RxFifoFullInterruptEnable |
| * @arg kECSPI_RxFifoOverFlowInterruptEnable |
| * @arg kECSPI_TransferCompleteInterruptEnable |
| * @arg kECSPI_AllInterruptEnable |
| */ |
| static inline void ECSPI_DisableInterrupts(ECSPI_Type *base, uint32_t mask) |
| { |
| base->INTREG &= ~(mask); |
| } |
| /*! @} */ |
| |
| /*! |
| * @name Software Reset |
| * @{ |
| */ |
| |
| /*! |
| * @brief Software reset. |
| * |
| * @param base ECSPI base pointer |
| */ |
| static inline void ECSPI_SoftwareReset(ECSPI_Type *base) |
| { |
| /* Disables the block and resets the internal logic with the exception of the ECSPI control register */ |
| base->CONREG &= ~ECSPI_CONREG_EN_MASK; |
| /* Software reset can not reset the control register, so clear the control register manually */ |
| base->CONREG = 0x0U; |
| } |
| /*! @} */ |
| |
| /*! |
| * @name Channel mode check |
| * @{ |
| */ |
| |
| /*! |
| * @brief Mode check |
| * |
| * @param base ECSPI base pointer |
| * @param channel ECSPI channel source |
| * @return mode of channel |
| */ |
| static inline bool ECSPI_IsMaster(ECSPI_Type *base, ecspi_channel_source_t channel) |
| { |
| return (bool)(((base->CONREG & ECSPI_CONREG_CHANNEL_MODE_MASK) >> |
| (ECSPI_CONREG_CHANNEL_MODE_SHIFT + (uint32_t)channel)) & |
| 0x1U); |
| } |
| /*! @} */ |
| |
| /*! |
| * @name DMA Control |
| * @{ |
| */ |
| |
| /*! |
| * @brief Enables the DMA source for ECSPI. |
| * |
| * @param base ECSPI base pointer |
| * @param mask ECSPI DMA source. The parameter can be any of the following values: |
| * @arg kECSPI_TxDmaEnable |
| * @arg kECSPI_RxDmaEnable |
| * @arg kECSPI_DmaAllEnable |
| * @param enable True means enable DMA, false means disable DMA |
| */ |
| static inline void ECSPI_EnableDMA(ECSPI_Type *base, uint32_t mask, bool enable) |
| { |
| if (enable) |
| { |
| base->DMAREG |= mask; |
| } |
| else |
| { |
| base->DMAREG &= ~mask; |
| } |
| } |
| /*! @} */ |
| |
| /*! |
| * @name FIFO Operation |
| * @{ |
| */ |
| |
| /*! |
| * @brief Get the Tx FIFO data count. |
| * |
| * @param base ECSPI base pointer. |
| * @return the number of words in Tx FIFO buffer. |
| */ |
| static inline uint8_t ECSPI_GetTxFifoCount(ECSPI_Type *base) |
| { |
| return (uint8_t)((base->TESTREG & ECSPI_TESTREG_TXCNT_MASK) >> ECSPI_TESTREG_TXCNT_SHIFT); |
| } |
| |
| /*! |
| * @brief Get the Rx FIFO data count. |
| * |
| * @param base ECSPI base pointer. |
| * @return the number of words in Rx FIFO buffer. |
| */ |
| static inline uint8_t ECSPI_GetRxFifoCount(ECSPI_Type *base) |
| { |
| return (uint8_t)((base->TESTREG & ECSPI_TESTREG_RXCNT_MASK) >> ECSPI_TESTREG_RXCNT_SHIFT); |
| } |
| /*! @} */ |
| |
| /*! |
| * @name Bus Operations |
| * @{ |
| */ |
| |
| /*! |
| * @brief Set channel select for transfer. |
| * |
| * @param base ECSPI base pointer |
| * @param channel Channel source. |
| */ |
| static inline void ECSPI_SetChannelSelect(ECSPI_Type *base, ecspi_channel_source_t channel) |
| { |
| /* Clear Channel select bits in CONREG register */ |
| uint32_t temp = base->CONREG & (~(ECSPI_CONREG_CHANNEL_SELECT_MASK)); |
| /* Set channel select bits */ |
| base->CONREG = (temp | ECSPI_CONREG_CHANNEL_SELECT(channel)); |
| } |
| /*! |
| * @brief Set channel select configuration for transfer. |
| * |
| * The purpose of this API is to set the channel will be use to transfer. |
| * User may use this API after instance has been initialized or before transfer start. |
| * The configuration structure _ecspi_channel_config_ can be filled by user from scratch. |
| * After calling this API, user can select this channel as transfer channel. |
| * |
| * @param base ECSPI base pointer |
| * @param channel Channel source. |
| * @param config Configuration struct of channel |
| */ |
| void ECSPI_SetChannelConfig(ECSPI_Type *base, ecspi_channel_source_t channel, const ecspi_channel_config_t *config); |
| |
| /*! |
| * @brief Sets the baud rate for ECSPI transfer. This is only used in master. |
| * |
| * @param base ECSPI base pointer |
| * @param baudRate_Bps baud rate needed in Hz. |
| * @param srcClock_Hz ECSPI source clock frequency in Hz. |
| */ |
| void ECSPI_SetBaudRate(ECSPI_Type *base, uint32_t baudRate_Bps, uint32_t srcClock_Hz); |
| |
| /*! |
| * @brief Sends a buffer of data bytes using a blocking method. |
| * |
| * @note This function blocks via polling until all bytes have been sent. |
| * |
| * @param base ECSPI base pointer |
| * @param buffer The data bytes to send |
| * @param size The number of data bytes to send |
| * @retval kStatus_Success Successfully start a transfer. |
| * @retval kStatus_ECSPI_Timeout The transfer timed out and was aborted. |
| */ |
| status_t ECSPI_WriteBlocking(ECSPI_Type *base, uint32_t *buffer, size_t size); |
| |
| /*! |
| * @brief Writes a data into the ECSPI data register. |
| * |
| * @param base ECSPI base pointer |
| * @param data Data needs to be write. |
| */ |
| static inline void ECSPI_WriteData(ECSPI_Type *base, uint32_t data) |
| { |
| base->TXDATA = data; |
| } |
| |
| /*! |
| * @brief Gets a data from the ECSPI data register. |
| * |
| * @param base ECSPI base pointer |
| * @return Data in the register. |
| */ |
| static inline uint32_t ECSPI_ReadData(ECSPI_Type *base) |
| { |
| return (uint32_t)(base->RXDATA); |
| } |
| /*! @} */ |
| |
| /*! |
| * @name Transactional |
| * @{ |
| */ |
| /*! |
| * @brief Initializes the ECSPI master handle. |
| * |
| * This function initializes the ECSPI master handle which can be used for other ECSPI master transactional APIs. |
| * Usually, |
| * for a specified ECSPI instance, call this API once to get the initialized handle. |
| * |
| * @param base ECSPI peripheral base address. |
| * @param handle ECSPI handle pointer. |
| * @param callback Callback function. |
| * @param userData User data. |
| */ |
| void ECSPI_MasterTransferCreateHandle(ECSPI_Type *base, |
| ecspi_master_handle_t *handle, |
| ecspi_master_callback_t callback, |
| void *userData); |
| |
| /*! |
| * @brief Transfers a block of data using a polling method. |
| * |
| * @param base SPI base pointer |
| * @param xfer pointer to spi_xfer_config_t structure |
| * @retval kStatus_Success Successfully start a transfer. |
| * @retval kStatus_InvalidArgument Input argument is invalid. |
| * @retval kStatus_ECSPI_Timeout The transfer timed out and was aborted. |
| */ |
| status_t ECSPI_MasterTransferBlocking(ECSPI_Type *base, ecspi_transfer_t *xfer); |
| |
| /*! |
| * @brief Performs a non-blocking ECSPI interrupt transfer. |
| * |
| * @note The API immediately returns after transfer initialization is finished. |
| * @note If ECSPI transfer data frame size is 16 bits, the transfer size cannot be an odd number. |
| * |
| * @param base ECSPI peripheral base address. |
| * @param handle pointer to ecspi_master_handle_t structure which stores the transfer state |
| * @param xfer pointer to ecspi_transfer_t structure |
| * @retval kStatus_Success Successfully start a transfer. |
| * @retval kStatus_InvalidArgument Input argument is invalid. |
| * @retval kStatus_ECSPI_Busy ECSPI is not idle, is running another transfer. |
| */ |
| status_t ECSPI_MasterTransferNonBlocking(ECSPI_Type *base, ecspi_master_handle_t *handle, ecspi_transfer_t *xfer); |
| |
| /*! |
| * @brief Gets the bytes of the ECSPI interrupt transferred. |
| * |
| * @param base ECSPI peripheral base address. |
| * @param handle Pointer to ECSPI transfer handle, this should be a static variable. |
| * @param count Transferred bytes of ECSPI master. |
| * @retval kStatus_ECSPI_Success Succeed get the transfer count. |
| * @retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. |
| */ |
| status_t ECSPI_MasterTransferGetCount(ECSPI_Type *base, ecspi_master_handle_t *handle, size_t *count); |
| |
| /*! |
| * @brief Aborts an ECSPI transfer using interrupt. |
| * |
| * @param base ECSPI peripheral base address. |
| * @param handle Pointer to ECSPI transfer handle, this should be a static variable. |
| */ |
| void ECSPI_MasterTransferAbort(ECSPI_Type *base, ecspi_master_handle_t *handle); |
| |
| /*! |
| * @brief Interrupts the handler for the ECSPI. |
| * |
| * @param base ECSPI peripheral base address. |
| * @param handle pointer to ecspi_master_handle_t structure which stores the transfer state. |
| */ |
| void ECSPI_MasterTransferHandleIRQ(ECSPI_Type *base, ecspi_master_handle_t *handle); |
| |
| /*! |
| * @brief Initializes the ECSPI slave handle. |
| * |
| * This function initializes the ECSPI slave handle which can be used for other ECSPI slave transactional APIs. Usually, |
| * for a specified ECSPI instance, call this API once to get the initialized handle. |
| * |
| * @param base ECSPI peripheral base address. |
| * @param handle ECSPI handle pointer. |
| * @param callback Callback function. |
| * @param userData User data. |
| */ |
| void ECSPI_SlaveTransferCreateHandle(ECSPI_Type *base, |
| ecspi_slave_handle_t *handle, |
| ecspi_slave_callback_t callback, |
| void *userData); |
| |
| /*! |
| * @brief Performs a non-blocking ECSPI slave interrupt transfer. |
| * |
| * @note The API returns immediately after the transfer initialization is finished. |
| * |
| * @param base ECSPI peripheral base address. |
| * @param handle pointer to ecspi_master_handle_t structure which stores the transfer state |
| * @param xfer pointer to ecspi_transfer_t structure |
| * @retval kStatus_Success Successfully start a transfer. |
| * @retval kStatus_InvalidArgument Input argument is invalid. |
| * @retval kStatus_ECSPI_Busy ECSPI is not idle, is running another transfer. |
| */ |
| static inline status_t ECSPI_SlaveTransferNonBlocking(ECSPI_Type *base, |
| ecspi_slave_handle_t *handle, |
| ecspi_transfer_t *xfer) |
| { |
| return ECSPI_MasterTransferNonBlocking(base, handle, xfer); |
| } |
| |
| /*! |
| * @brief Gets the bytes of the ECSPI interrupt transferred. |
| * |
| * @param base ECSPI peripheral base address. |
| * @param handle Pointer to ECSPI transfer handle, this should be a static variable. |
| * @param count Transferred bytes of ECSPI slave. |
| * @retval kStatus_ECSPI_Success Succeed get the transfer count. |
| * @retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress. |
| */ |
| static inline status_t ECSPI_SlaveTransferGetCount(ECSPI_Type *base, ecspi_slave_handle_t *handle, size_t *count) |
| { |
| return ECSPI_MasterTransferGetCount(base, handle, count); |
| } |
| |
| /*! |
| * @brief Aborts an ECSPI slave transfer using interrupt. |
| * |
| * @param base ECSPI peripheral base address. |
| * @param handle Pointer to ECSPI transfer handle, this should be a static variable. |
| */ |
| static inline void ECSPI_SlaveTransferAbort(ECSPI_Type *base, ecspi_slave_handle_t *handle) |
| { |
| ECSPI_MasterTransferAbort(base, handle); |
| } |
| |
| /*! |
| * @brief Interrupts a handler for the ECSPI slave. |
| * |
| * @param base ECSPI peripheral base address. |
| * @param handle pointer to ecspi_slave_handle_t structure which stores the transfer state |
| */ |
| void ECSPI_SlaveTransferHandleIRQ(ECSPI_Type *base, ecspi_slave_handle_t *handle); |
| |
| /*! @} */ |
| |
| #if defined(__cplusplus) |
| } |
| #endif |
| |
| /*! @} */ |
| |
| #endif /* _FSL_ECSPI_H_*/ |