/****************************************************************************** * * @brief header file for SPI module utilities (SPI). * ******************************************************************************* * * provide APIs for accessing SPI module (SPI) ******************************************************************************/ #ifndef SPI_H_ #define SPI_H_ #ifdef __cplusplus extern "C" { #endif /****************************************************************************** * Includes ******************************************************************************/ /****************************************************************************** * Constants ******************************************************************************/ /****************************************************************************** * Macros ******************************************************************************/ /* maximum number of SPIs */ #define MAX_SPI_NO 2 /****************************************************************************** * define SPI register default value * *//*! @addtogroup spi_default_value * @{ *******************************************************************************/ #define SPI_C1_DEFAULT 0x04 /*!< SPI C1 register */ #define SPI_C2_DEFAULT 0x00 /*!< SPI C2 register */ #define SPI_BR_DEFAULT 0x00 /*!< SPI BR register */ #define SPI_S_DEFAULT 0x20 /*!< SPI S register */ #define SPI_M_DEFAULT 0x00 /*!< SPI M register */ /*! @} End of spi_default_value */ /****************************************************************************** * define SPI error status * *//*! @addtogroup spi_error_list * @{ *******************************************************************************/ #define SPI_ERR_SUCCESS 0 /*!< success */ #define SPI_ERR_CODE_BASE ((uint32)SPI0 - 0x40000000L) /*!< error code base for SPI */ #define SPI_ERR_TXBUF_NOT_EMPTY (SPI_ERR_CODE_BASE+1) /*!< failure due to SPTEF (empty) not set */ #define SPI_ERR_RXBUF_NOT_FULL (SPI_ERR_CODE_BASE+2) /*!< failure due to SPRF (full) not set */ /*! @} End of spi_error_list */ /****************************************************************************** * Types ******************************************************************************/ typedef uint8_t SPI_WidthType; /* SPI width type */ typedef uint32_t ResultType; /* SPI routine Result code */ /****************************************************************************** * define SPI call back funtion * *//*! @addtogroup spi_callback * @{ *******************************************************************************/ typedef void (*SPI_CallbackType)(void); /*!< SPI call back function */ /*! @} End of spi_callback */ /****************************************************************************** * *//*! @addtogroup spi_setting_type * @{ *******************************************************************************/ /*! * @brief SPI setting type. * */ typedef struct { uint32_t bIntEn : 1; /*!< 1: Interrupt Enable, 0: Interrupt disable */ uint32_t bModuleEn : 1; /*!< 1: SPI module Enable, 0: SPI module disable */ uint32_t bTxIntEn : 1; /*!< 1: Tx Interrupt Enable, 0: Tx Interrupt disable */ uint32_t bMasterMode : 1; /*!< 1: Master mode, 0: Slave mode */ uint32_t bClkPolarityLow : 1; /*!< 1: Active-low SPI clock, 0: Active-HIgh SPI clock */ uint32_t bClkPhase1 : 1; /*!< Set clock phase */ uint32_t bMasterAutoDriveSS : 1; /*!< Slave select output enable */ uint32_t bShiftLSBFirst : 1; /*!< 1: LSB first, 0: MSB first */ uint32_t bMatchIntEn : 1; /*!< 1: Match interrupt Enable, 0: Match interrupt disable */ uint32_t bModeFaultEn : 1; /*!< Master mode-fault function enable */ uint32_t bBidirectionModeEn : 1; /*!< Bidirectional mode output enable */ uint32_t bPinAsOuput : 1; /*!< enables bidirectional pin configurations */ uint32_t bStopInWaitMode : 1; /*!< SPI stop in wait mode */ uint32_t bRsvd : 19; } SPI_SettingType; /*! @} End of spi_setting_type */ /****************************************************************************** * *//*! @addtogroup spi_config_type * @{ *******************************************************************************/ /*! * @brief SPI configuration type. * */ typedef struct { SPI_SettingType sSettings; /*!< SPI settings */ uint32_t u32BitRate; /*!< set baud rate */ uint32_t u32BusClkHz; /*!< input bus clock */ } SPI_ConfigType; /*!< SPI configuration structure */ /*! @} End of spi_config_type */ /****************************************************************************** * Global variables ******************************************************************************/ /****************************************************************************** * inline function ******************************************************************************/ /****************************************************************************** * *//*! @addtogroup spi_api_list * @{ *******************************************************************************/ /*****************************************************************************//*! * * @brief LSB first (shifter direction). * * @param[in] pSPI point to SPI module type. * * @return none. * * @ Pass/ Fail criteria: none. *****************************************************************************/ __STATIC_INLINE void SPI_SetLSBFirst(SPI_Type *pSPI) { pSPI->C1 |= SPI_C1_LSBFE_MASK; } /*****************************************************************************//*! * * @brief MSB first (shifter direction). * * @param[in] pSPI point to SPI module type. * * @return none. * * @ Pass/ Fail criteria: none. *****************************************************************************/ __STATIC_INLINE void SPI_SetMSBFirst(SPI_Type *pSPI) { pSPI->C1 &= ~SPI_C1_LSBFE_MASK; } /*****************************************************************************//*! * * @brief set SPI clock polarity. * * @param[in] pSPI point to SPI module type. * @param[in] u8PolLow set clock polarity, 1 - Active-low SPI clock (idles high). * @return none * * @ Pass/ Fail criteria: none *****************************************************************************/ __STATIC_INLINE void SPI_SetClockPol(SPI_Type *pSPI,uint8_t u8PolLow) { if( u8PolLow ) { pSPI->C1 |= SPI_C1_CPOL_MASK; } else { pSPI->C1 &= ~SPI_C1_CPOL_MASK; } } /*****************************************************************************//*! * * @brief set SPI clock phase. * * @param[in] pSPI point to SPI module type. * @param[in] u8Phase set clock phase, 1 - First edge on SPSCK occurs at the start of the first cycle of a data transfer. * * @return none * * @ Pass/ Fail criteria: none *****************************************************************************/ __STATIC_INLINE void SPI_SetClockPhase(SPI_Type *pSPI,uint8_t u8Phase) { if( u8Phase ) { pSPI->C1 |= SPI_C1_CPHA_MASK; } else { pSPI->C1 &= ~SPI_C1_CPHA_MASK; } } /*****************************************************************************//*! * * @brief enable SPI module. * * @param[in] pSPI point to SPI module type. * * @return none * * @ Pass/ Fail criteria: none *****************************************************************************/ __STATIC_INLINE void SPI_Enable(SPI_Type *pSPI) { pSPI->C1 |= SPI_C1_SPE_MASK; } /*****************************************************************************//*! * * @brief disable SPI module. * * @param[in] pSPI point to SPI module type. * * @return none * * @ Pass/ Fail criteria: none *****************************************************************************/ __STATIC_INLINE void SPI_Disable(SPI_Type *pSPI) { pSPI->C1 &= ~SPI_C1_SPE_MASK; } /*****************************************************************************//*! * * @brief enable SPI interrupt. * * @param[in] pSPI point to SPI module type. * * @return none * * @ Pass/ Fail criteria: none *****************************************************************************/ __STATIC_INLINE void SPI_IntEnable(SPI_Type *pSPI) { pSPI->C1 |= SPI_C1_SPIE_MASK; } /*****************************************************************************//*! * * @brief disable SPI interrupt. * * @param[in] pSPI point to SPI module type. * * @return none * * @ Pass/ Fail criteria: none *****************************************************************************/ __STATIC_INLINE void SPI_IntDisable(SPI_Type *pSPI) { pSPI->C1 &= ~SPI_C1_SPIE_MASK; } /*****************************************************************************//*! * * @brief set SPI to master mode. * * @param[in] pSPI point to SPI module type. * * @return none * * @ Pass/ Fail criteria: none *****************************************************************************/ __STATIC_INLINE void SPI_SetMasterMode(SPI_Type *pSPI) { pSPI->C1 |= SPI_C1_MSTR_MASK; } /*****************************************************************************//*! * * @brief set SPI to slave mode. * * @param[in] pSPI point to SPI module type. * * @return none * * @ Pass/ Fail criteria: none *****************************************************************************/ __STATIC_INLINE void SPI_SetSlaveMode(SPI_Type *pSPI) { pSPI->C1 &= ~SPI_C1_MSTR_MASK; } /*****************************************************************************//*! * * @brief SPI transmit interrupt enable. * * @param[in] pSPI point to SPI module type. * * @return none. * * @ Pass/ Fail criteria: none. *****************************************************************************/ __STATIC_INLINE void SPI_TxIntEnable(SPI_Type *pSPI) { pSPI->C1 |= SPI_C1_SPTIE_MASK; } /*****************************************************************************//*! * * @brief SPI transmit interrupt disable. * * @param[in] pSPI point to SPI module type. * * @return none * * @ Pass/ Fail criteria: none *****************************************************************************/ __STATIC_INLINE void SPI_TxIntDisable(SPI_Type *pSPI) { pSPI->C1 &= ~SPI_C1_SPTIE_MASK; } /*****************************************************************************//*! * * @brief Slave select output enable. * * @param[in] pSPI point to SPI module type. * * @return none * * @ Pass/ Fail criteria: none *****************************************************************************/ __STATIC_INLINE void SPI_SSOutputEnable(SPI_Type *pSPI ) { pSPI->C1 |= SPI_C1_SSOE_MASK; } /*****************************************************************************//*! * * @brief Slave select output disable. * * @param[in] pSPI point to SPI module type. * * @return none * * @ Pass/ Fail criteria: none *****************************************************************************/ __STATIC_INLINE void SPI_SSOutputDisable(SPI_Type *pSPI ) { pSPI->C1 &= ~SPI_C1_SSOE_MASK; } /*****************************************************************************//*! * * @brief SPI match interrupt enable. * * @param[in] pSPI point to SPI module type. * * @return none * * @ Pass/ Fail criteria: none *****************************************************************************/ __STATIC_INLINE void SPI_MatchIntEnable(SPI_Type *pSPI ) { pSPI->C2 |= SPI_C2_SPMIE_MASK; } /*****************************************************************************//*! * * @brief SPI match interrupt disable. * * @param[in] pSPI point to SPI module type. * * @return none. * * @ Pass/ Fail criteria: none. *****************************************************************************/ __STATIC_INLINE void SPI_MatchIntDisable(SPI_Type *pSPI ) { pSPI->C2 &= ~SPI_C2_SPMIE_MASK; } /*****************************************************************************//*! * * @brief Master mode-fault function disable. * * @param[in] pSPI point to SPI module type. * * @return none. * * @ Pass/ Fail criteria: none. *****************************************************************************/ __STATIC_INLINE void SPI_ModfDisable(SPI_Type *pSPI ) { pSPI->C2 &= ~SPI_C2_MODFEN_MASK; } /*****************************************************************************//*! * * @brief Master mode-fault function enable. * * @param[in] pSPI point to SPI module type. * * @return none. * * @ Pass/ Fail criteria: none. *****************************************************************************/ __STATIC_INLINE void SPI_ModfEnable(SPI_Type *pSPI ) { pSPI->C2 |= SPI_C2_MODFEN_MASK; } /*****************************************************************************//*! * * @brief Bidirectional mode output enable. * * @param[in] pSPI point to SPI module type. * * @return none. * * @ Pass/ Fail criteria: none. *****************************************************************************/ __STATIC_INLINE void SPI_BidirOutEnable(SPI_Type *pSPI ) { pSPI->C2 |= SPI_C2_BIDIROE_MASK; } /*****************************************************************************//*! * * @brief Bidirectional mode output disable. * * @param[in] pSPI point to SPI module type. * * @return none. * * @ Pass/ Fail criteria: none. *****************************************************************************/ __STATIC_INLINE void SPI_BidirOutDisable(SPI_Type *pSPI ) { pSPI->C2 &= ~SPI_C2_BIDIROE_MASK; } /*****************************************************************************//*! * * @brief SPI stop in wait mode * * @param[in] pSPI point to SPI module type. * * @return none. * * @ Pass/ Fail criteria: none. *****************************************************************************/ __STATIC_INLINE void SPI_ClockStopDisable(SPI_Type *pSPI ) { pSPI->C2 &= ~SPI_C2_SPISWAI_MASK; } /*****************************************************************************//*! * * @brief SPI stop in wait mode. * * @param[in] pSPI point to SPI module type. * * @return none * * @ Pass/ Fail criteria: none *****************************************************************************/ __STATIC_INLINE void SPI_ClockStopEnable(SPI_Type *pSPI ) { pSPI->C2 |= SPI_C2_SPISWAI_MASK; } /*****************************************************************************//*! * * @brief enables bidirectional pin configurations. * * @param[in] pSPI point to SPI module type. * * @return none * * @ Pass/ Fail criteria: none *****************************************************************************/ __STATIC_INLINE void SPI_BidirPinEnable(SPI_Type *pSPI) { pSPI->C2 |= SPI_C2_SPC0_MASK; } /*****************************************************************************//*! * * @brief enables bidirectional pin configurations. * * @param[in] pSPI point to SPI module type. * * @return none * * @ Pass/ Fail criteria: none *****************************************************************************/ __STATIC_INLINE void SPI_BidirPinDisable(SPI_Type *pSPI) { pSPI->C2 &= ~SPI_C2_SPC0_MASK; } /*****************************************************************************//*! * * @brief check SPI read buffer full flag. * * @param[in] pSPI point to SPI module type. * * @return TRUE or FALSE. * * @ Pass/ Fail criteria: none. *****************************************************************************/ __STATIC_INLINE uint8_t SPI_IsSPRF(SPI_Type *pSPI ) { return(pSPI->S & SPI_S_SPRF_MASK); } /*****************************************************************************//*! * * @brief check SPI match flag. * * @param[in] pSPI point to SPI module type. * * @return TRUE or FALSE. * * @ Pass/ Fail criteria: none. *****************************************************************************/ __STATIC_INLINE uint8_t SPI_IsSPMF(SPI_Type *pSPI ) { return(pSPI->S & SPI_S_SPMF_MASK); } /*****************************************************************************//*! * * @brief check SPI transmit buffer empty flag. * * @param[in] pSPI point to SPI module type. * * @return TRUE or FALSE. * * @ Pass/ Fail criteria: none *****************************************************************************/ __STATIC_INLINE uint8_t SPI_IsSPTEF(SPI_Type *pSPI ) { return(pSPI->S & SPI_S_SPTEF_MASK); } /*****************************************************************************//*! * * @brief check master mode fault flag. * * @param[in] pSPI point to SPI module type. * * @return TRUE or FALSE. * * @ Pass/ Fail criteria: none *****************************************************************************/ __STATIC_INLINE uint8_t SPI_IsMODF(SPI_Type *pSPI ) { return(pSPI->S & SPI_S_MODF_MASK); } /*****************************************************************************//*! * * @brief read SPI data register. * * @param[in] pSPI point to SPI module type. * * @return data register value * * @ Pass/ Fail criteria: none *****************************************************************************/ __STATIC_INLINE uint8_t SPI_ReadDataReg(SPI_Type *pSPI ) { return pSPI->D; } /*****************************************************************************//*! * * @brief write SPI data register. * * @param[in] pSPI point to SPI module type. * @param[in] u8WrBuff data buffer write to spi data register. * * @return none * * @ Pass/ Fail criteria: none *****************************************************************************/ __STATIC_INLINE void SPI_WriteDataReg(SPI_Type *pSPI, uint8_t u8WrBuff ) { pSPI->D = u8WrBuff; } /*****************************************************************************//*! * * @brief write SPI match register. * * @param[in] pSPI point to SPI module type. * @param[in] u8WrBuff the data buffer write to match register. * * @return none * * @ Pass/ Fail criteria: none *****************************************************************************/ __STATIC_INLINE void SPI_WriteMatchValue(SPI_Type *pSPI, uint8_t u8WrBuff ) { pSPI->M = u8WrBuff; } /****************************************************************************** * Global functions ******************************************************************************/ void SPI_Enable(SPI_Type *pSPI); void SPI_Disable(SPI_Type *pSPI); void SPI_SetLSBFirst(SPI_Type *pSPI); void SPI_SetMSBFirst(SPI_Type *pSPI); void SPI_IntEnable(SPI_Type *pSPI); void SPI_IntDisable(SPI_Type *pSPI); void SPI_SetMasterMode(SPI_Type *pSPI); void SPI_SetSlaveMode(SPI_Type *pSPI); void SPI_TxIntEnable(SPI_Type *pSPI); void SPI_TxIntDisable(SPI_Type *pSPI); void SPI_SSOutputEnable(SPI_Type *pSPI ); void SPI_SSOutputDisable(SPI_Type *pSPI ); void SPI_MatchIntEnable(SPI_Type *pSPI ); void SPI_MatchIntDisable(SPI_Type *pSPI ); void SPI_ModfDisable(SPI_Type *pSPI ); void SPI_ModfEnable(SPI_Type *pSPI ); void SPI_BidirOutEnable(SPI_Type *pSPI ); void SPI_BidirOutDisable(SPI_Type *pSPI ); void SPI_ClockStopDisable(SPI_Type *pSPI ); void SPI_ClockStopEnable(SPI_Type *pSPI ); void SPI_BidirPinEnable(SPI_Type *pSPI ); void SPI_BidirPinDisable(SPI_Type *pSPI ); void SPI_SetClockPol(SPI_Type *pSPI,uint8_t u8PolLow); void SPI_SetClockPhase(SPI_Type *pSPI,uint8_t u8Phase); void SPI_SetBaudRate(SPI_Type *pSPI,uint32_t u32BusClock,uint32_t u32Bps ); uint8_t SPI_IsSPRF(SPI_Type *pSPI ); uint8_t SPI_IsSPMF(SPI_Type *pSPI ); uint8_t SPI_IsSPTEF(SPI_Type *pSPI ); uint8_t SPI_IsMODF(SPI_Type *pSPI ); uint8_t SPI_ReadDataReg(SPI_Type *pSPI ); void SPI_WriteDataReg(SPI_Type *pSPI, uint8_t u8WrBuff ); void SPI_WriteMatchValue(SPI_Type *pSPI, uint8_t u8WrBuff ); void SPI_Init(SPI_Type *pSPI, SPI_ConfigType *pConfig); void SPI_DeInit(SPI_Type *pSPI); ResultType SPI_TransferWait(SPI_Type *pSPI, SPI_WidthType* pRdBuff, SPI_WidthType *pWrBuff,uint32 uiLength); void SPI_SetCallback(SPI_Type *pSPI,SPI_CallbackType pfnCallback); /*! @} End of spi_api_list */ #ifdef __cplusplus } #endif #endif /* SPI_H_ */