// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // File name : spi_drv.h // Version : V0.1 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef SPI_DRV_H_ #define SPI_DRV_H_ #include "spi_reg.h" #include "memmap.h" /* SPI Init structure definition */ typedef struct { UINT8 SPI_Direction; UINT8 SPI_Mode; UINT8 SPI_DataSize; UINT8 SPI_CPOL;//SPI空闲时,时钟信号SCLK的电平(1:空闲时高电平; 0:空闲时低电平) UINT8 SPI_CPHA;//SPI在SCLK第几个边沿开始采样(0:第一个边沿开始; 1:第二个边沿开始) UINT8 SPI_BaudRatePrescaler;//SPI Baud Rate UINT8 SPI_FirstBit;//LSB-First Enable Bit UINT8 SPI_CRCPolynomial; }SPI_InitTypeDef; typedef enum { SPI_MISO = 0, SPI_MOSI, SPI_SCK, SPI_SS }SPI_PINx; #define IS_SPI_PINx(pin) (((pin) == SPI_MISO) || \ ((pin) == SPI_MOSI) || \ ((pin) == SPI_SCK) || \ ((pin) == SPI_SS)) #define SPI1 ((SPI_TypeDef *)(SPI1_BASE_ADDR)) #define SPI2 ((SPI_TypeDef *)(SPI2_BASE_ADDR)) #define SPI3 ((SPI_TypeDef *)(SPI3_BASE_ADDR)) #define IS_SPI_ALL_PERIPH(PERIPH) (((PERIPH) == SPI1) || \ ((PERIPH) == SPI2) || \ ((PERIPH) == SPI3)) /* SPI master/slave mode */ #define SPI_Mode_Master ((UINT8)0x10) #define SPI_Mode_Slave ((UINT8)0x00) #define IS_SPI_MODE(MODE) (((MODE) == SPI_Mode_Master) || \ ((MODE) == SPI_Mode_Slave)) /* SPI data direction mode */ #define SPI_Direction_2Lines_FullDuplex ((UINT8)0x00) #define SPI_Direction_1Line_RxOrTx ((UINT8)0x01) #define IS_SPI_DIRECTION_MODE(MODE) (((MODE) == SPI_Direction_2Lines_FullDuplex) || \ ((MODE) == SPI_Direction_1Line_RxOrTx)) /* SPI data size */ #define SPI_DataSize_16b (0x0f) #define SPI_DataSize_8b (0x07) #define IS_SPI_DATASIZE(DATASIZE) (((DATASIZE) == SPI_DataSize_16b) || \ ((DATASIZE) == SPI_DataSize_8b)) /* SPI Clock Polarity */ #define SPI_CPOL_Low ((UINT8)0x00) #define SPI_CPOL_High ((UINT8)0x08) #define IS_SPI_CPOL(CPOL) (((CPOL) == SPI_CPOL_Low) || \ ((CPOL) == SPI_CPOL_High)) /* SPI Clock Phase */ #define SPI_CPHA_1Edge ((UINT16)0x00) #define SPI_CPHA_2Edge ((UINT16)0x04) #define IS_SPI_CPHA(CPHA) (((CPHA) == SPI_CPHA_1Edge) || \ ((CPHA) == SPI_CPHA_2Edge)) /* SPI BaudRate Prescaler */ #define SPI_BaudRatePrescaler_2 (0x00) #define SPI_BaudRatePrescaler_4 (0x01) #define SPI_BaudRatePrescaler_6 (0x20) #define SPI_BaudRatePrescaler_8 (0x02) #define SPI_BaudRatePrescaler_10 (0x40) #define SPI_BaudRatePrescaler_20 (0x41) #define SPI_BaudRatePrescaler_40 (0x42) #define SPI_BaudRatePrescaler_64 (0x05) #define SPI_BaudRatePrescaler_256 (0x07) #define IS_SPI_BAUDRATE_PRESCALER(PRESCALER) (((PRESCALER) == SPI_BaudRatePrescaler_2) || \ ((PRESCALER) == SPI_BaudRatePrescaler_4) || \ ((PRESCALER) == SPI_BaudRatePrescaler_6) || \ ((PRESCALER) == SPI_BaudRatePrescaler_8) || \ ((PRESCALER) == SPI_BaudRatePrescaler_10) || \ ((PRESCALER) == SPI_BaudRatePrescaler_20) || \ ((PRESCALER) == SPI_BaudRatePrescaler_40) || \ ((PRESCALER) == SPI_BaudRatePrescaler_64)) /* SPI MSB/LSB transmission */ #define SPI_FirstBit_MSB ((UINT8)0x00) #define SPI_FirstBit_LSB ((UINT8)0x01) #define IS_SPI_FIRST_BIT(BIT) (((BIT) == SPI_FirstBit_MSB) || \ ((BIT) == SPI_FirstBit_LSB)) #define CR1_SPE_Set ((UINT8)0x40) #define CR1_SPE_Reset ((UINT8)0xBF) #define SPI_CS_L(x) do{x->SPIPORT &= 0xF7;}while(0) #define SPI_CS_H(x) do{x->SPIPORT |= 0x08;}while(0) //#define SPI1_CS_L do{SPI1->SPIPORT &= 0xF7;}while(0) //#define SPI1_CS_H do{SPI1->SPIPORT |= 0x08;}while(0) //#define SPI2_CS_L do{SPI2->SPIPORT &= 0xF7;}while(0) //#define SPI2_CS_H do{SPI2->SPIPORT |= 0x08;}while(0) //#define SPI3_CS_L do{SPI3->SPIPORT &= 0xF7;}while(0) //#define SPI3_CS_H do{SPI3->SPIPORT |= 0x08;}while(0) #define SPISR_TXDMAE_MASK (0x02) #define SPISR_RXDMAE_MASK (0x01) /******************************************************************************* * Function Name : SPI_StructInit * Description : Fills each SPI_InitStruct member with its default value. * Input : - SPI_InitStruct : pointer to a SPI_InitTypeDef structure * which will be initialized. * Output : None * Return : None *******************************************************************************/ void SPI_StructInit(UINT8 mode,SPI_InitTypeDef* SPI_InitStruct); /******************************************************************************* * Function Name : SPI_Init * Description : SPI初始化 * * Input : - SPIx: where x can be 1, 2 to select the SPI peripheral. * - SPI_InitStruct: pointer to a SPI_InitTypeDef structure that * contains the configuration information for the specified * SPI peripheral. * Output : None * Return : None ******************************************************************************/ void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct); /******************************************************************************* * Function Name : SPI_Cmd * Description : Enables or disables the specified SPI peripheral. * Input : - SPIx: where x can be 1, 2 to select the SPI peripheral. * - NewState: new state of the SPIx peripheral. * This parameter can be: ENABLE or DISABLE. * Output : None * Return : None *******************************************************************************/ void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState); /******************************************************************************* * Function Name : SPI_MasterSendData * Description : SPI作为主设备发送数据 * Input : - SPIx: where x can be 1, 2 to select the SPI peripheral. * - Send: 发送数据缓冲 * - Len:发送数据的长度 * * Output : None * Return : None ******************************************************************************/ void SPI_MasterSendData(SPI_TypeDef* SPIx, UINT8 *Send, UINT32 Len); /******************************************************************************* * Function Name : SPI_MasterFixedSendData * Description : SPI作为主设备发送长度Len的相同Send数据 * Input : - SPIx: where x can be 1, 2 to select the SPI peripheral. * - Send: 发送的数据 * - Len:发送数据的长度 * * Output : None * Return : None ******************************************************************************/ void SPI_MasterFixedSendData(SPI_TypeDef* SPIx, UINT8 Send, UINT16 Len); /******************************************************************************* * Function Name : SPI_MasterReceiveData * Description : SPI作为主设备接收来自从设备数据 * Input : - SPIx: where x can be 1, 2 to select the SPI peripheral. * * - Len:需要接收数据的长度 * * Output : - Revc: 接收数据缓冲 * Return : None ******************************************************************************/ void SPI_MasterReceiveData(SPI_TypeDef* SPIx, UINT8 *Recv, UINT16 Len); /******************************************************************************* * Function Name : SPI_MasterSendData * Description : SPI作为从设备发送数据 * Input : - SPIx: where x can be 1, 2 to select the SPI peripheral. * - Send: 发送数据缓冲 * - Len:发送数据的长度 * * Output : None * Return : None ******************************************************************************/ void SPI_SlaveSendData(SPI_TypeDef* SPIx, UINT8 *Send, UINT16 Len); /******************************************************************************* * Function Name : SPI_SlaveReceiveData * Description : SPI作为从设备接收来自主设备数据 * Input : - SPIx: where x can be 1, 2 to select the SPI peripheral. * * - Len:需要接收数据的长度 * * Output : - Revc: 接收数据缓冲 * Return : None ******************************************************************************/ void SPI_SlaveReceiveData(SPI_TypeDef* SPIx, UINT8 *Revc, UINT16 Len); /******************************************************************************* * Function Name : SPI_ConfigGpio * Description : SPI配置成GPIO用途 * Input : - SPIx: where x can be 1, 2 to select the SPI peripheral. * - SPI_Pin:SPI对应的PIN脚,取值SPI_MISO、SPI_MOSI、SPI_SCK、SPI_SS * - SPI_Dir:设置GPIO方向 GPIO_OUTPUT:输出 GPIO_INPUT:输入 * * Output : None * Return : None ******************************************************************************/ void SPI_ConfigGpio(SPI_TypeDef* SPIx, SPI_PINx SPI_Pin, UINT8 SPI_Dir); /******************************************************************************* * Function Name : SPI_ReadGpioData * Description : 获取SPI_Pin对应引脚的电平 * Input : - SPIx: where x can be 1, 2 to select the SPI peripheral. * - SPI_Pin:SPI对应的PIN脚,取值SPI_MISO、SPI_MOSI、SPI_SCK、SPI_SS * * Output : None * Return : Bit_SET:高电平 Bit_RESET:低电平 ******************************************************************************/ UINT8 SPI_ReadGpioData(SPI_TypeDef* SPIx, SPI_PINx SPI_Pin); /******************************************************************************* * Function Name : SPI_WriteGpioData * Description : 设置SPI_Pin对应引脚的电平 * Input : - SPIx: where x can be 1, 2 to select the SPI peripheral. * - SPI_Pin:SPI对应的PIN脚,取值SPI_MISO、SPI_MOSI、SPI_SCK、SPI_SS * - bitVal:设置的电平,Bit_SET:设置为高电平 Bit_RESET:设置为低电平 * * Output : None * Return : None ******************************************************************************/ void SPI_WriteGpioData(SPI_TypeDef* SPIx, SPI_PINx SPI_Pin, UINT8 bitVal); /******************************************************************************* * Function Name : SPI_MasterReceiveDataByEDMA * Description : SPI作为主设备发送并接收数据 * Input : - SPIx: where x can be 1, 2 ,3 to select the SPI peripheral. * - recvAddr: 接收数据缓冲首地址 * - Len:发送数据的长度 * * Output : None * Return : None ******************************************************************************/ void SPI_MasterReceiveDataByEDMA(SPI_TypeDef* SPIx, UINT32 recvAddr, UINT32 Len); /******************************************************************************* * Function Name : SPI_MasterOnlyReceiveDataByEDMA * Description : SPI作为主设备接收数据 * Input : - SPIx: where x can be 1, 2 ,3 to select the SPI peripheral. * - recvAddr: 接收数据缓冲首地址 * - Len:接收数据的长度 * * Output : None * Return : None ******************************************************************************/ void SPI_MasterOnlyReceiveDataByEDMA(SPI_TypeDef* SPIx, UINT32 recvAddr, UINT32 Len); /******************************************************************************* * Function Name : SPI_MasterSendDataByEDMA * Description : SPI作为主设备发送数据 * Input : - SPIx: where x can be 1, 2 ,3 to select the SPI peripheral. * - sendAddr: 发送数据缓冲首地址 * - Len:发送数据的长度 * * Output : None * Return : None ******************************************************************************/ void SPI_MasterSendDataByEDMA(SPI_TypeDef* SPIx, UINT32 sendAddr, UINT32 Len); /******************************************************************************* * Function Name : SPI_MasterOnlySendDataByEDMA * Description : SPI作为主设备发送数据 * Input : - SPIx: where x can be 1, 2 ,3 to select the SPI peripheral. * - sendAddr: 发送数据缓冲首地址 * - Len:发送数据的长度 * * Output : None * Return : None ******************************************************************************/ void SPI_MasterOnlySendDataByEDMA(SPI_TypeDef* SPIx, UINT32 sendAddr, UINT32 Len); /******************************************************************************* * Function Name : SPI_MasterOnlySendSameDataByEDMA * Description : SPI作为主设备发送数据,不会改变源buf数据 * Input : - SPIx: where x can be 1, 2 ,3 to select the SPI peripheral. * - sendAddr: 发送数据缓冲首地址 * - Len:发送数据的长度 * * Output : None * Return : None ******************************************************************************/ void SPI_MasterOnlySendSameDataByEDMA(SPI_TypeDef* SPIx, UINT32 sendAddr, UINT32 Len); /******************************************************************************* * Function Name : SPI_EnableDMA * Description : SPI DMA功能的使能 * Input : - SPIx: where x can be 1, 2, 3 to select the SPI peripheral. * - enable: 是否使能 * * Output : None * Return : None ******************************************************************************/ void SPI_EnableDMA(SPI_TypeDef* SPIx,bool enable); /******************************************************************************* * Function Name : SPI_StructInit_NFC * Description : Fills each SPI_InitStruct member with its default value. * Input : - SPI_InitStruct : pointer to a SPI_InitTypeDef structure * which will be initialized. * Output : None * Return : None *******************************************************************************/ void SPI_StructInit_NFC(UINT8 mode,SPI_InitTypeDef* SPI_InitStruct); #endif /* SPI_DRV_H_ */