123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634 |
- /******************************************************************************
- *
- * @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_ */
|