|
楼主 |
发表于 2013-10-11 19:56:07
|
显示全部楼层
本帖最后由 Gorgon_Meducer 于 2013-12-19 19:20 编辑
一些大家可能会感兴趣的定义:
device.h
- //! \brief IO functions
- //! @{
- typedef enum io_func_sel_t {
- IO_WORKS_AS_GPIO = 0x0000,
- IO_WORKS_AS_FUNC_0 = 0x0000,
- IO_WORKS_AS_FUNC_1 = 0x0100,
- IO_WORKS_AS_FUNC_2 = 0x0200,
- IO_WORKS_AS_FUNC_3 = 0x0300,
- IO_WORKS_AS_CSC = 0x0300,
- IO_WORKS_AS_ANALOG = 0x0200,
- //! APIO0~7
- IO_WORKS_AS_APIO0 = 0x0300 | __IO_RW,
- IO_WORKS_AS_APIO1 = 0x0301 | __IO_RW,
- IO_WORKS_AS_APIO2 = 0x0302 | __IO_RW,
- IO_WORKS_AS_APIO3 = 0x0303 | __IO_RW,
- IO_WORKS_AS_APIO4 = 0x0304 | __IO_RW,
- IO_WORKS_AS_APIO5 = 0x0305 | __IO_RW,
- IO_WORKS_AS_APIO6 = 0x0306 | __IO_RW,
- IO_WORKS_AS_APIO7 = 0x0307 | __IO_RW,
- //! I2C0
- IO_WORKS_AS_I2C0_SCL = 0x0308 | __IO_RW,
- IO_WORKS_AS_I2C0_SDA = 0x0309 | __IO_RW,
- //! SPI0
- IO_WORKS_AS_SPI0_SCK = 0x030A | __IO_RW,
- IO_WORKS_AS_SPI0_MISO = 0x030B | __IO_RW,
- IO_WORKS_AS_SPI0_MOSI = 0x030C | __IO_RW,
- IO_WORKS_AS_SPI0_CS = 0x030D | __IO_RW,
- //! SPI1
- IO_WORKS_AS_SPI1_SCK = 0x030E | __IO_RW,
- IO_WORKS_AS_SPI1_MISO = 0x030F | __IO_RW,
- IO_WORKS_AS_SPI1_MOSI = 0x0310 | __IO_RW,
- IO_WORKS_AS_SPI1_CS = 0x0311 | __IO_RW,
- //! USART0
- IO_WORKS_AS_USART0_SCLK = 0x0312 | __IO_RW,
- IO_WORKS_AS_USART0_TXD = 0x0313 | __IO_WO,
- IO_WORKS_AS_USART0_RXD = 0x0314 | __IO_RO,
- IO_WORKS_AS_USART0_RTS = 0x0315 | __IO_WO,
- IO_WORKS_AS_USART0_DTR = 0x0316 | __IO_WO,
- IO_WORKS_AS_USART0_CTS = 0x0317 | __IO_RO,
- IO_WORKS_AS_USART0_DCD = 0x0318 | __IO_RO,
- IO_WORKS_AS_USART0_DSR = 0x0319 | __IO_RO,
- IO_WORKS_AS_USART0_RI = 0x031A | __IO_RO,
- //! USART1
- IO_WORKS_AS_USART1_SCLK = 0x031B | __IO_RW,
- IO_WORKS_AS_USART1_TXD = 0x031C | __IO_WO,
- IO_WORKS_AS_USART1_RXD = 0x031D | __IO_RO,
- IO_WORKS_AS_USART1_DIR = 0x031E | __IO_WO,
- IO_WORKS_AS_USART1_BAUD = 0x031F | __IO_WO,
-
- //! APIO8~15
- IO_WORKS_AS_APIO8 = 0x0320 | __IO_RW,
- IO_WORKS_AS_APIO9 = 0x0321 | __IO_RW,
- IO_WORKS_AS_APIO10 = 0x0322 | __IO_RW,
- IO_WORKS_AS_APIO11 = 0x0323 | __IO_RW,
- IO_WORKS_AS_APIO12 = 0x0324 | __IO_RW,
- IO_WORKS_AS_APIO13 = 0x0325 | __IO_RW,
- IO_WORKS_AS_APIO14 = 0x0326 | __IO_RW,
- IO_WORKS_AS_APIO15 = 0x0327 | __IO_RW,
- //! I2C1
- IO_WORKS_AS_I2C1_SCL = 0x0328 | __IO_RW,
- IO_WORKS_AS_I2C1_SDA = 0x0329 | __IO_RW,
- //! SPI2
- IO_WORKS_AS_SPI2_SCK = 0x032A | __IO_RW,
- IO_WORKS_AS_SPI2_MISO = 0x032B | __IO_RW,
- IO_WORKS_AS_SPI2_MOSI = 0x032C | __IO_RW,
- IO_WORKS_AS_SPI2_CS = 0x032D | __IO_RW,
- //! I2S
- IO_WORKS_AS_I2S0_TXMCLK = 0x032E | __IO_WO,
- IO_WORKS_AS_I2S0_TXCLK = 0x032F | __IO_RW,
- IO_WORKS_AS_I2S0_TXWS = 0x0330 | __IO_RW,
- IO_WORKS_AS_I2S0_TXD = 0x0331 | __IO_WO,
- IO_WORKS_AS_I2S0_RXMCLK = 0x0332 | __IO_WO,
- IO_WORKS_AS_I2S0_RXCLK = 0x0333 | __IO_RW,
- IO_WORKS_AS_I2S0_RXWS = 0x0334 | __IO_RW,
- IO_WORKS_AS_I2S0_RXD = 0x0335 | __IO_RO,
- //! USART2
- IO_WORKS_AS_USART2_SCLK = 0x0336 | __IO_RW,
- IO_WORKS_AS_USART2_TXD = 0x0337 | __IO_WO,
- IO_WORKS_AS_USART2_RXD = 0x0338 | __IO_RO,
- IO_WORKS_AS_USART2_DIR = 0x0339 | __IO_WO,
- //! USART3
- IO_WORKS_AS_USART3_SCLK = 0x033A | __IO_RW,
- IO_WORKS_AS_USART3_TXD = 0x033B | __IO_WO,
- IO_WORKS_AS_USART3_RXD = 0x033C | __IO_RO,
- IO_WORKS_AS_USART3_DIR = 0x033D | __IO_WO,
- }em_io_func_sel_t;
- //! @}
复制代码 io.h
- #ifndef __GSP_SPI_DRIVER_H__
- #define __GSP_SPI_DRIVER_H__
- /*============================ INCLUDES ======================================*/
- #include ".\app_cfg.h"
- #include "..\device.h"
- #include ".\i_io_spi.h"
- /*============================ MACROS ========================================*/
- //! \brief Macro for extern spi interface function prototypes
- #define __EXTERN_SPI_INTERFACE(__N, __DATA) \
- extern bool spi##__N##_init(spi_cfg_t *ptSspCfg); \
- extern bool spi##__N##_idle(void); \
- extern fsm_rt_t spi##__N##_open(void); \
- extern fsm_rt_t spi##__N##_close(void); \
- extern fsm_rt_t spi##__N##_data_exchange(uint16_t hwOut,uint16_t *phwIn); \
- extern bool spi##__N##_write(uint16_t hwOut); \
- extern bool spi##__N##_read(uint16_t *phwIn);
- /*============================ MACROFIED FUNCTIONS ===========================*/
- #define SPI_CFG(__SPI,...) \
- do { \
- spi_cfg_t tCFG = { \
- __VA_ARGS__ \
- }; \
- __SPI.Init(&tCFG); \
- } while(false)
- /*============================ TYPES =========================================*/
- //! \name spi working mode
- //! @{
- typedef enum {
- SPI_MODE_MASTER = 0x00, //!< select master mode
- SPI_MODE_SLAVE = _BV(0), //!< select slave mode
-
- SPI_MODE_FORMAT_SPI = 0x00, //!< use standard spi fram
- SPI_MODE_FORMAT_TI = _BV(1),
- SPI_MODE_FORMAT_MICROWIRE = _BV(2),
-
- SPI_MODE_CLK_IDLE_HIGH = _BV(3), //!< SCK is high in idle
- SPI_MODE_CLK_IDLE_LOW = 0x00, //!< SCK is low in idle
-
- SPI_MODE_SAMP_FIRST_EDGE = 0x00, //!< sample at first edge of sck
- SPI_MODE_SAMP_SECOND_EDGE = _BV(4), //!< sample at second edge of sck
-
- SPI_MODE_LOOP_BACK = _BV(5), //!< enable loop back
- SPI_MODE_NOT_LOOP_BACK = 0x00, //!< default disable loop back
-
- SPI_MODE_SLAVE_OUT_ENABLE = 0x00, //!< default enable slave output
- SPI_MODE_SLAVE_OUT_DISABLE = _BV(6) //!< disable slave output
- }em_spi_mode_t;
- //! @}
- //! \name spi datasize
- //! @{
- typedef enum {
- SPI_MODE_DATASIZE_4 = 0x3, //!< datasize is 4 bits
- SPI_MODE_DATASIZE_5 = 0x4, //!< datasize is 5 bits
- SPI_MODE_DATASIZE_6 = 0x5, //!< datasize is 6 bits
- SPI_MODE_DATASIZE_7 = 0x6, //!< datasize is 7 bits
- SPI_MODE_DATASIZE_8 = 0x7, //!< datasize is 8 bits
- SPI_MODE_DATASIZE_9 = 0x8, //!< datasize is 9 bits
- SPI_MODE_DATASIZE_10 = 0x9, //!< datasize is 10 bits
- SPI_MODE_DATASIZE_11 = 0xA, //!< datasize is 11 bits
- SPI_MODE_DATASIZE_12 = 0xB, //!< datasize is 12 bits
- SPI_MODE_DATASIZE_13 = 0xC, //!< datasize is 13 bits
- SPI_MODE_DATASIZE_14 = 0xD, //!< datasize is 14 bits
- SPI_MODE_DATASIZE_15 = 0xE, //!< datasize is 15 bits
- SPI_MODE_DATASIZE_16 = 0xF //!< datasize is 16 bits
- }em_spi_datasize_t;
- #define __SPI_CLK_DIV(__N,__Value) \
- SPI_PCLK_DIV_##__N = (2*(__N)),
- //! \name enum spi clk div
- //! @{
- typedef enum{
- MREPEAT(127,__SPI_CLK_DIV ,NULL)
- } em_spiclk_div_t;
- //! @}
- //! \name spi configuration structure
- //! @{
- typedef struct{
- uint16_t hwMode; //!< spi working mode
- uint8_t chDataSize; //!< frame size
- em_spiclk_div_t chClockDiv; //!< P_CLK prescaler
- } spi_cfg_t;
- //! @}
- //! \name class: spi_t
- //! @{
- DEF_INTERFACE(spi_t)
- bool (*Init)(spi_cfg_t *ptCfg); //!< initialize spi
- bool (*Idle)(void); //!< get busy flag status
- fsm_rt_t (*Open)(void); //!< open spi
- fsm_rt_t (*Close)(void); //!< close spi
- //! method for data exchange
- fsm_rt_t (*DataExchange)(uint16_t hwOut,uint16_t *phwIn);
- bool (*Write)(uint16_t hwOut); //!< write data to spi buffer
- bool (*Read)(uint16_t *phwIn); //!< read data from spi buffer
- spi_reg_t * const ptRegPage; //!< reference to register page
- END_DEF_INTERFACE(spi_t)
- //! @}
- /*============================ PROTOTYPES ====================================*/
- //! \brief spi interface function prototypes
- MREPEAT(SPI_COUNT, __EXTERN_SPI_INTERFACE, NULL)
- /*============================ GLOBAL VARIABLES ==============================*/
- //! \brief SPI objects
- extern ROOT const spi_t SPI[SPI_COUNT];
- /*============================ LOCAL VARIABLES ===============================*/
- #endif
复制代码 spi.c
- /*============================ INCLUDES ======================================*/
- #include ".\app_cfg.h"
- #include ".\i_io_spi.h"
- #include "..\device.h"
- #include "..\pm\pm.h"
- /*============================ MACROS ========================================*/
- //! \brief The reference for current object
- #define this (*ptThis)
- /*============================ MACROFIED FUNCTIONS ===========================*/
- //! \brief Macro for spi init
- #define __SPI__SPI_T_INIT(__N,__DATA) \
- { \
- ((spi_reg_t *)(SPI##__N##_BASE_ADDRESS)), \
- 0, \
- 0 \
- },
-
- //! \brief Macro for spi interface init
- #define __SPI_OBJ(__N,__A) \
- { \
- &spi##__N##_init, \
- &spi##__N##_idle, \
- &spi##__N##_open, \
- &spi##__N##_close, \
- &spi##__N##_data_exchange, \
- &spi##__N##_write, \
- &spi##__N##_read, \
- ((spi_reg_t *)(SPI##__N##_BASE_ADDRESS)), \
- },
- //! \brief Macro for spi interface function prototypes
- #define __SPI_INTERFACE_PROTOTYPES(__N,__DATA) \
- extern bool spi##__N##_init(spi_cfg_t *ptSpiCfg); \
- extern bool spi##__N##_idle(void); \
- extern fsm_rt_t spi##__N##_open(void); \
- extern fsm_rt_t spi##__N##_close(void); \
- extern fsm_rt_t spi##__N##_data_exchange(uint16_t hwOut,uint16_t *phwIn); \
- extern bool spi##__N##_write(uint16_t hwOut); \
- extern bool spi##__N##_read(uint16_t *phwIn);
- //! \brief Macro of spi modules interface function body
- #define __SPI_INTERFACE(__N,__DATA) \
- bool spi##__N##_init(spi_cfg_t *ptSpiCfg) \
- { \
- return spi_init((__spi_t *)&__SPI[__N],ptSpiCfg,__N); \
- } \
- bool spi##__N##_idle(void) \
- { \
- return spi_is_idle((__spi_t *)&__SPI[__N], __N); \
- } \
- fsm_rt_t spi##__N##_open(void) \
- { \
- return spi_open((__spi_t *)&__SPI[__N],__N); \
- } \
- fsm_rt_t spi##__N##_close(void) \
- { \
- return spi_close((__spi_t *)&__SPI[__N],__N); \
- } \
- fsm_rt_t spi##__N##_data_exchange(uint16_t hwOut,uint16_t *phwIn) \
- { \
- return spi_data_exchange((__spi_t *)&__SPI[__N],hwOut,phwIn); \
- } \
- bool spi##__N##_write(uint16_t hwOut) \
- { \
- return spi_write((__spi_t *)&__SPI[__N],hwOut); \
- } \
- bool spi##__N##_read(uint16_t *phwIn) \
- { \
- return spi_read((__spi_t *)&__SPI[__N],phwIn); \
- }
- /*============================ TYPES =========================================*/
- #define __SPI_CLK_DIV(__N,__Value) \
- SPI_PCLK_DIV_##__N = (2*(__N)),
- //! \name enum spi clk div
- //! @{
- typedef enum{
- MREPEAT(127,__SPI_CLK_DIV ,NULL)
- } em_spiclk_div_t;
- //! @}
- //! \name spi configuration structure
- //! @{
- typedef struct{
- uint16_t hwMode; //!< spi working mode
- uint8_t chDataSize; //!< frame size
- em_spiclk_div_t chClockDiv; //!< P_CLK prescaler
- } spi_cfg_t;
- //! @}
- //! \name class: spi_t
- //! @{
- DEF_INTERFACE(spi_t)
-
- bool (*Init)(spi_cfg_t *ptCfg); //!< initialize spi
- bool (*Idle)(void); //!< get busy flag status
- fsm_rt_t (*Open)(void); //!< open spi
- fsm_rt_t (*Close)(void); //!< close spi
- //! method for data exchange
- fsm_rt_t (*DataExchange)(uint16_t hwOut,uint16_t *phwIn);
- bool (*Write)(uint16_t hwOut); //!< write data to spi buffer
- bool (*Read)(uint16_t *phwIn); //!< read data from spi buffer
- spi_reg_t * const ptRegPage; //!< reference to register page
- END_DEF_INTERFACE(spi_t)
- //! @}
- //! \name internal class
- //! @{
- DEF_CLASS(__spi_t)
- spi_reg_t * const ptREG; //!< reference to register page
- uint8_t chStateClose; //!< state variable for Close
- uint8_t chStateExchange; //!< state variable for Exchange
- END_DEF_CLASS(__spi_t)
- //! @}
- //! \name spi working mode
- //! @{
- typedef enum {
- SPI_MODE_MASTER = 0x00, //!< select master mode
- SPI_MODE_SLAVE = _BV(0), //!< select slave mode
-
- SPI_MODE_FORMAT_SPI = 0x00, //!< use standard spi fram
- SPI_MODE_FORMAT_TI = _BV(1),
- SPI_MODE_FORMAT_MICROWIRE = _BV(2),
-
- SPI_MODE_CLK_IDLE_HIGH = _BV(3), //!< SCK is high in idle
- SPI_MODE_CLK_IDLE_LOW = 0x00, //!< SCK is low in idle
-
- SPI_MODE_SAMP_FIRST_EDGE = 0x00, //!< sample at first edge of sck
- SPI_MODE_SAMP_SECOND_EDGE = _BV(4), //!< sample at second edge of sck
-
- SPI_MODE_LOOP_BACK = _BV(5), //!< enable loop back
- SPI_MODE_NOT_LOOP_BACK = 0x00, //!< default disable loop back
-
- SPI_MODE_SLAVE_OUT_ENABLE = 0x00, //!< default enable slave output
- SPI_MODE_SLAVE_OUT_DISABLE = _BV(6) //!< disable slave output
- }em_spi_mode_t;
- //! @}
- //! \name spi datasize
- //! @{
- typedef enum {
- SPI_MODE_DATASIZE_4 = 0x3, //!< datasize is 4 bits
- SPI_MODE_DATASIZE_5 = 0x4, //!< datasize is 5 bits
- SPI_MODE_DATASIZE_6 = 0x5, //!< datasize is 6 bits
- SPI_MODE_DATASIZE_7 = 0x6, //!< datasize is 7 bits
- SPI_MODE_DATASIZE_8 = 0x7, //!< datasize is 8 bits
- SPI_MODE_DATASIZE_9 = 0x8, //!< datasize is 9 bits
- SPI_MODE_DATASIZE_10 = 0x9, //!< datasize is 10 bits
- SPI_MODE_DATASIZE_11 = 0xA, //!< datasize is 11 bits
- SPI_MODE_DATASIZE_12 = 0xB, //!< datasize is 12 bits
- SPI_MODE_DATASIZE_13 = 0xC, //!< datasize is 13 bits
- SPI_MODE_DATASIZE_14 = 0xD, //!< datasize is 14 bits
- SPI_MODE_DATASIZE_15 = 0xE, //!< datasize is 15 bits
- SPI_MODE_DATASIZE_16 = 0xF //!< datasize is 16 bits
- }em_spi_datasize_t;
- //! @}
- /*============================ PROTOTYPES ====================================*/
- //! \brief spi interface function prototypes
- MREPEAT(SPI_COUNT, __SPI_INTERFACE_PROTOTYPES, NULL)
- /*============================ GLOBAL VARIABLES ==============================*/
- //! \brief SPI object
- ROOT const spi_t SPI[] = {
- MREPEAT(SPI_COUNT, __SPI_OBJ, NULL)
- };
- /*============================ LOCAL VARIABLES ===============================*/
- //! \brief internal spi object
- static CLASS(__spi_t) __SPI[] = {
- //__SPI__SPI_T_INIT(0, 0xFF)
- MREPEAT(SPI_COUNT, __SPI__SPI_T_INIT, 0xFF)
- };
- #define SAFE_CLK_CODE(...) \
- {\
- ahbclk_status_t tAHBStatus;\
- pclk_status_t tPCLKStatus;\
- tAHBStatus = PM_GET_AHB_CLK_STATUS((em_ahb_clk_t)(AHBCLK_SPI0 + chIndex ));\
- tPCLKStatus = PM_GET_PCLK_STATUS(PCLK_SPI0 + chIndex);\
- PM_AHB_CLK_ENABLE((em_ahb_clk_t)(AHBCLK_SPI0 + chIndex ));\
- PM_PCLK_CFG((PCLK_SPI0 + chIndex),1);\
- __VA_ARGS__;\
- PM_AHB_CLK_RESUME((em_ahb_clk_t)(AHBCLK_SPI0 + chIndex ),tAHBStatus);\
- PM_PCLK_RESUME((PCLK_SPI0 + chIndex),tPCLKStatus);\
- }
- /*! \brief initialize spi
- *! \param ptSpiCfg spi configuration object
- *! \retval true initialization succeed
- *! \retval false initialization failed
- */
- static bool spi_init(__spi_t *ptSPI,spi_cfg_t *ptSpiCfg,uint8_t chIndex)
- {
-
- CLASS(__spi_t) *ptThis = (CLASS(__spi_t) *)ptSPI;
- bool bResult = false;
- //! validate input parameter
- if((ptThis == NULL) || (ptSpiCfg == NULL)) {
- return false;
- }
- SAFE_CLK_CODE (
- do {
- spi_reg_t *ptREG = this.ptREG;
- //! read CR0 register
- uint32_t wTempCR0 = ptREG->CR0.Value & ~(
- SPI_CR0_DSS_MSK |
- SPI_CR0_FRF_MSK |
- SPI_CR0_CPOL_MSK |
- SPI_CR0_CPHA_MSK |
- SPI_CR0_SCR_MSK
- );
- //! read CR1 register
- uint32_t wTempCR1 = ptREG->CR1.Value & ~(
- SPI_CR1_LBM_MSK |
- SPI_CR1_MS_MSK |
- SPI_CR1_SOD_MSK
- );
-
- uint32_t wTempCPSR = ptREG->CPSR.Value & ~(SPI_CPSR_CPSDVSR_MSK);
- /* -------------------- Modify Configuration Begin------------------- */
- //! switch between master mode and slave mode
- if (ptSpiCfg->hwMode & SPI_MODE_SLAVE) {
- //! use slave mode
- wTempCR1 |= SPI_MODE_SET(SPI_SLAVE);
- } /* else {
- //! use master mode
- }*/
- //! set frame type
- if (ptSpiCfg->hwMode & SPI_MODE_FORMAT_TI) {
- //!< use TI fram
- wTempCR0 |= SPI_FORMAT_SET(SPI_FORMAT_TI);
- } else if(ptSpiCfg->hwMode & SPI_MODE_FORMAT_MICROWIRE) {
- //! use Microwire
- wTempCR0 |= SPI_FORMAT_SET(SPI_FORMAT_MICROWIRE);
- } /*else {
- //! use standard type
- }*/
- //! set clock polarity and sample point
- if (ptSpiCfg->hwMode & SPI_MODE_CLK_IDLE_HIGH) {
- wTempCR0 |= SPI_CLK_POLARITY_SET(SPI_CLK_IDLE_HIGH);
- }/*else {
- //! use idle low type
- }*/
- if (ptSpiCfg->hwMode & SPI_MODE_SAMP_SECOND_EDGE) {
- wTempCR0 |= SPI_CLK_SAMP_SET(SPI_SAMP_SECOND_EDGE);
- }/*else {
- //! samp at first edge
- }*/
-
- //! set as loop-back mode
- if (ptSpiCfg->hwMode & SPI_MODE_LOOP_BACK) {
- wTempCR1 |= SPI_LOOP_BACK_SET(SPI_LOOP_BACK);
- }/*else {
- //! standard mode
- }*/
-
- //! if slave, data out disable
- if (ptSpiCfg->hwMode & SPI_MODE_SLAVE_OUT_DISABLE) {
- wTempCR1 |= SPI_SLAVE_OUT_SET(SPI_OUT_DISABLE);
- }/*else {
- //! standard mode
- }*/
-
- //! set data size
- if ( (ptSpiCfg->chDataSize < SPI_MODE_DATASIZE_4)
- || (ptSpiCfg->chDataSize > SPI_MODE_DATASIZE_16)) {
- bResult = false;
- break;
- } else {
- wTempCR0 |= SPI_DATASIZE_SET(ptSpiCfg->chDataSize);
- }
-
- //! set clock prescaler
- if((ptSpiCfg->chClockDiv < 2) || (ptSpiCfg->chClockDiv > 254)) {
- bResult = false;
- break;
- } else {
- wTempCPSR |= SPI_CPSR_SET(ptSpiCfg->chClockDiv & 0xFFFE);
- }
-
- /* -------------------- Modify Configuration End -------------------- */
- //! update CR0
- ptREG->CR0.Value = wTempCR0;
- //! update CR1
- ptREG->CR1.Value = wTempCR1;
- //! update CPSR
- ptREG->CPSR.Value = wTempCPSR;
-
- } while (false);
- )
- return bResult;
- }
- /*! \brief return state of spi
- *! \param void
- *! \retval true spi is idle
- *! \retval false spi is busy
- */
- static bool spi_is_idle(__spi_t *ptSPI,uint8_t chIndex)
- {
- CLASS(__spi_t) *ptThis = (CLASS(__spi_t) *)ptSPI;
- bool bResult = true;
- //! validate input parameter
- if(ptThis == NULL) {
- return false;
- }
- SAFE_CLK_CODE (
- //! spi is busy, return false
- if (this.ptREG->SR.Value & SPI_SR_BSY_MSK) {
- bResult = false;
- }
- )
- //! spi is idle, return true
- return bResult;
- }
- /*! \brief enable spi
- *! \param void
- *! \retval fsm_rt_cpl spi enabled
- *! \retval fsm_rt_err illegal input pointer
- */
- static fsm_rt_t spi_open(__spi_t *ptSPI,uint8_t chIndex)
- {
- CLASS(__spi_t) *ptThis = (CLASS(__spi_t) *)ptSPI;
- // enable AHBCLK
- PM_AHB_CLK_ENABLE((em_ahb_clk_t)(AHBCLK_SPI0 + chIndex ));
- PM_PCLK_CFG(PCLK_SPI0 + chIndex,1);
- //! validate input parameter
- if(ptThis == NULL) {
- return fsm_rt_err;
- }
-
- //! set spi enable bit
- //this.ptREG->CR1.Value &=~ SPI_CR1_SSE_MSK;
- this.ptREG->CR1.Value |= SPI_ENABLE_SET(SPI_ENABLE);
- return fsm_rt_cpl;
- }
- /*! \brief disable spi
- *! \param void
- *! \retval fsm_rt_cpl close prosess is complete
- *! \retval fsm_rt_on_going close prosess is on going
- *! \retval fsm_rt_err illegal input pointer
- */
- static fsm_rt_t spi_close(__spi_t *ptSPI,uint8_t chIndex)
- {
- CLASS(__spi_t) *ptThis = (CLASS(__spi_t) *)ptSPI;
-
- //! validate input parameter
- if(ptThis == NULL) {
- return fsm_rt_err;
- }
-
- //! wait for spi fifo empty
- if(this.ptREG->SR.Value & SPI_SR_TFE_MSK) {
- //! disable spi module
- this.ptREG->CR1.Value &=~ SPI_CR1_SSE_MSK;
- //this.ptREG->CR1.Value |= SPI_ENABLE_SET(SPI_DISABLE);
- // Disable AHBCLK
- PM_AHB_CLK_DISABLE((em_ahb_clk_t)(AHBCLK_SPI0 + chIndex ));
- PM_PCLK_CFG(PCLK_SPI0 + chIndex,0);
- return fsm_rt_cpl;
- }
- return fsm_rt_on_going;
- }
- #define SPI_DATA_EXCHANGE_START 0
- #define SPI_DATA_EXCHANGE_SEND 1
- #define SPI_DATA_EXCHANGE_RECEIVE 2
- #define SPI_DATA_EXCHANGE_FSM_RST()\
- do{\
- ptThis->chStateExchange = 0;\
- }while(0)
- /*! \brief exchange data once
- *! \param hwOut the out-data
- *! \param *hwIn the addr of in-data
- *! \retval fsm_rt_on_going exchange is on going
- *! \retval fsm_rt_cpl exchange is complete
- *! \retval fsm_rt_err illegal input pointer
- */
- static fsm_rt_t spi_data_exchange(__spi_t *ptSPI,uint16_t hwOut,uint16_t *phwIn)
- {
- CLASS(__spi_t) *ptThis = (CLASS(__spi_t) *)ptSPI;
-
- //! validate input parameter
- if(ptThis == NULL) {
- return fsm_rt_err;
- }
- switch(this.chStateExchange) {
- //! start
- case SPI_DATA_EXCHANGE_START:
- this.chStateExchange = SPI_DATA_EXCHANGE_SEND;
- //break;
- //! send data out
- case SPI_DATA_EXCHANGE_SEND:
- if(this.ptREG->SR.Value & SPI_SR_TNF_MSK) { //!< tx fifo is not full
- this.ptREG->DR.Value = hwOut;
- this.chStateExchange = SPI_DATA_EXCHANGE_RECEIVE;
- }
- break;
- //! read data in
- case SPI_DATA_EXCHANGE_RECEIVE:
- if(this.ptREG->SR.Value & SPI_SR_RNE_MSK) { //!< rx fifo is not empty
- uint16_t hwTemp;
- hwTemp = this.ptREG->DR.Value;
- if(phwIn != NULL) {
- *phwIn = hwTemp;
- }
- SPI_DATA_EXCHANGE_FSM_RST();
- return fsm_rt_cpl;
- }
- break;
- }
- return fsm_rt_on_going;
- }
- /*! \brief write a data with out recieving
- *! \param hwOut the out-data
- *! \retval true write access is success
- *! \retval false write access is failed or illegal input parameter
- */
- static bool spi_write(__spi_t *ptSPI,uint16_t hwOut)
- {
- CLASS(__spi_t) *ptThis = (CLASS(__spi_t) *)ptSPI;
-
- //! validate input parameter
- if(ptThis == NULL) {
- return false;
- }
- //! if tx fifo is not full, write data
- if(this.ptREG->SR.Value & SPI_SR_TNF_MSK) { //!< tx fifo is not full
- this.ptREG->DR.Value = hwOut;
- return true;
- }
- return false;
- }
- /*! \brief read a data with out sending
- *! \param phwIn the addr of in-data
- *! \retval true read access is success
- *! \retval false read access is failed or illegal input parameter
- */
- static bool spi_read(__spi_t *ptSPI,uint16_t *phwIn)
- {
- CLASS(__spi_t) *ptThis = (CLASS(__spi_t) *)ptSPI;
-
- //! validate input parameter
- if(ptThis == NULL) {
- return false;
- }
- //! if rx fifo is not empty, read data
- if(this.ptREG->SR.Value & SPI_SR_RNE_MSK) { //!< rx fifo is not empty
- uint16_t hwTemp;
- hwTemp = this.ptREG->DR.Value;
- if(phwIn != NULL) {
- *phwIn = hwTemp;
- }
- return true;
- }
- return false;
- }
-
- //! \brief Spi modules interface function body
- MREPEAT(SPI_COUNT, __SPI_INTERFACE, NULL)
- //! end of file
复制代码 |
|