#ifndef __SSPI_H__ #define __SSPI_H__ #include "sci_common.h" #define SSPI00_SDR SCI0->SCI.SIO00 #define SSPI01_SDR SCI0->SCI.SIO01 #define SSPI10_SDR SCI0->SCI.SIO10 #define SSPI11_SDR SCI0->SCI.SIO11 #define SSPI20_SDR SCI1->SCI.SIO20 #define SSPI21_SDR SCI1->SCI.SIO21 #if defined(BAT32G1XX_80PIN) || defined(BAT32G1XX_100PIN) #define IS_SSPI_ALL_PERIPH(PERIPH) (((PERIPH) == SSPI00) || ((PERIPH) == SSPI01) || ((PERIPH) == SSPI10) || \ ((PERIPH) == SSPI11) || ((PERIPH) == SSPI20) || ((PERIPH) == SSPI21)|| ((PERIPH) == SSPI30)|| ((PERIPH) == SSPI31)) #else #define IS_SSPI_ALL_PERIPH(PERIPH) (((PERIPH) == SSPI00) || ((PERIPH) == SSPI01) || ((PERIPH) == SSPI10) || \ ((PERIPH) == SSPI11) || ((PERIPH) == SSPI20) || ((PERIPH) == SSPI21)) #endif typedef struct { uint16_t SPI_Mode; /*!< Specifies the SPI operating mode. This parameter can be a value of @ref SPI_mode */ uint16_t SPI_DataSize; /*!< Specifies the SPI data size. This parameter can be a value of @ref SPI_data_size */ uint32_t SPI_ClockSpeed; /*!< Specifies the Baud Rate which will transmit and receive clock.*/ uint16_t SPI_Bitorder; /*!< Specifies whether data transfers start from MSB or LSB bit.*/ uint16_t SPI_Phase_Mode; /*!< Specifies data transfers starts before operation clock and its phase.*/ uint16_t SPI_Int_Source; /*!< Specifies interrupt source of channel n.*/ }SPI_InitTypeDef; /** * @brief SCI unit ST register */ #define SSPI_STOP_EN ((uint16_t)0x0001) /** * @brief SCI unit SS register */ #define SSPI_START_EN ((uint16_t)0x0001) #define SSPI_START_DIS ((uint16_t)0x0000) /** * @brief SCI unit SPS register */ #define SSPI_SPS_MAX_VALUE ((uint16_t)0x000F) #define SSPI_SPS_MIN_VALUE ((uint16_t)0x0000) /** * @brief SCI unit SSR register to read flags */ #define SSPI_FLAG_TSF ((uint16_t)0x0040) #define SSPI_FLAG_BEF ((uint16_t)0x0020) #define SSPI_FLAG_OVERRUN ((uint16_t)0x0001) #define IS_SSPI_FLAG(FLAG) ((((FLAG) & (uint16_t)0xFF9E) == 0x00) && ((FLAG) != (uint16_t)0x00)) /** * @brief SCI unit SIR register to clear flags */ #define SSPI_CLEAR_FLAG_FEF ((uint16_t)0x0004) #define SSPI_CLEAR_FLAG_PEF ((uint16_t)0x0002) #define SSPI_CLEAR_FLAG_OVF ((uint16_t)0x0001) #define IS_SSPI_CLEAR_FLAG(FLAG) ((((FLAG) & (uint16_t)0x0007) == 0x00) && ((FLAG) != (uint16_t)0x00)) /** * @brief SCI unit SCR setting register */ #define SSPI_DATA_LENGTH_9 ((uint16_t)0x0001) #define SSPI_DATA_LENGTH_7 ((uint16_t)0x0002) #define SSPI_DATA_LENGTH_8 ((uint16_t)0x0003) #define SSPI_DATA_STOPBIT_NONE ((uint16_t)0x0000) #define SSPI_DATA_STOPBIT_1 ((uint16_t)0x0010) #define SSPI_DATA_STOPBIT_2 ((uint16_t)0x0020) #define SSPI_DATA_STOPBIT_INVALID ((uint16_t)0x0030) #define SSPI_DIR_MSB ((uint16_t)0x0000) #define SSPI_DIR_LSB ((uint16_t)0x0080) #define SSPI_PARITY_NONE ((uint16_t)0x0000) #define SSPI_INTSRE_NONE ((uint16_t)0x0000) #define SSPI_PHASE_NONE ((uint16_t)0x0000) /** * @brief SCI unit SO setting register */ #define SSPI_BusLevel_Low ((uint16_t)0x0000) #define SSPI_BusLevel_High ((uint16_t)0x0001) #define IS_SSPI_BUS_LEVEL(LEVEL) (((LEVEL) == SSPI_BusLevel_Low) || \ ((LEVEL) == SSPI_BusLevel_High)) #define SSPI_TransmitMode_Recv ((uint8_t)0x01) #define SSPI_TransmitMode_Send ((uint8_t)0x02) #define SSPI_TransmitMode_TxRx ((uint8_t)0x03) #define SSPI_TransmitMode_Mask ((uint8_t)0x03) #define IS_SSPI_TRANSMIT_MODE(MODE) (((MODE) == SSPI_TransmitMode_Send) || \ ((MODE) == SSPI_TransmitMode_Recv)) #define SPI_Phase_Mode0 ((uint16_t)0x3000)//11: DAP_1: data sampling on first edge,data change on second edge; CKP_1: Clock polarity is low when idle #define SPI_Phase_Mode1 ((uint16_t)0x1000)//01: DAP_0: Data sampling on second edge; data change on first edge CKP_1: Clock polarity is low when idle #define SPI_Phase_Mode2 ((uint16_t)0x2000)//10: DAP_1: data sampling on first edge; CKP_0: Clock polarity is high when idle #define SPI_Phase_Mode3 ((uint16_t)0x0000)//00: DAP_0: Data sampling on second edge; CKP_0: Clock polarity is high when idle #define SPI_Mode_Master ((uint16_t)0x0000) #define SPI_Mode_Slave ((uint16_t)0x0001) #define SPI_Data_Bits_8 ((uint16_t)0x0007) #define SPI_Data_Bits_7 ((uint16_t)0x0006) #define IS_SPI_DATASIZE(DATASIZE) (((DATASIZE) == SPI_Data_Bits_8) || ((DATASIZE) == SPI_Data_Bits_7))) #define SPI_Bit_Msb ((uint16_t)0x0000) #define SPI_Bit_Lsb ((uint16_t)0x0080) #define SPI_Interrupt_TransferEnd ((uint16_t)0x0000) #define SPI_Interrupt_BufferEmpty ((uint16_t)0x0002) typedef void (*NSS_Func)(void); typedef struct { void(*Active)(void); void(*Inactive)(void); }NSS_FUNC_T; extern NSS_FUNC_T NSS; extern uint8_t g_spi_tx_end,g_spi_rx_end; void SSPI_Set_TransmitMode(SCIAFSelect_TypeDef SSPIx, uint8_t Mode); uint8_t SSPI_Get_MasterMode(SCIAFSelect_TypeDef SSPIx); uint8_t SSPI_Get_TransmitMode(SCIAFSelect_TypeDef SSPIx); uint8_t SSPI_TransmitData(SCIAFSelect_TypeDef SSPIx, uint8_t Data); void SSPI_Start(SCIAFSelect_TypeDef func); void SSPI_Stop(SCIAFSelect_TypeDef func); int8_t SSPI_Init(SCIAFSelect_TypeDef func, SPI_InitTypeDef * SPI_InitStruct); void SSPI_SendByte(SCIAFSelect_TypeDef SPIx, uint8_t Data); uint8_t SSPI_ReceiveByte(SCIAFSelect_TypeDef SPIx); FlagStatus SSPI_GetErrStaus(SCIAFSelect_TypeDef SSPIx, uint16_t SSPI_FLAG); void SSPI_ClearFlag(SCIAFSelect_TypeDef SSPIx, uint16_t SSPI_FLAG); uint8_t SSPI_TransmitData(SCIAFSelect_TypeDef SSPIx, uint8_t Data); #endif