一:定义的数据结构

typedef struct
{
  uint16_t    SPI_BaudRatePrescaler;   //指定波特率预分频器值,用于配置发送和接收SCK时钟。此参数可以是                                                                                          SPI_BaudRate_Prescaler的值

uint16_t     SPI_CPHA;    //指定位捕获的时钟活动边沿。此参数可以是SPI_Clock_Phase的值

uint16_t     SPI_CPOL;   //指定串行时钟稳定状态。此参数可以是SPI_Clock_Polarity的值

uint16_t      SPI_CRCPolynomial;   //指定用于CRC计算的多项式。

uint16_t      SPI_DataSize;     //指定SPI数据大小。此参数可以是SPI_data_size的值

uint16_t      SPI_Direction  ; //指定SPI单向或双向数据模式。此参数可以是SPI_data_direction的值

uint16_t     SPI_FirstBit;   //指定数据传输是从MSB还是LSB位开始。此参数可以是SPI_MSB_LSB_transmission的值

uint16_t    SPI_Mode;    //指定SPI操作模式。此参数可以是SPI_mode的值

uint16_t    SPI_NSS;      //指定NSS信号是由硬件(NSS引脚)管理还是由软件使用SSI位管理。此参数可以是                                                                      SPI_MSB_LSB_transmission的值
} SPI_InitTypeDef;

typedef struct
{
  uint32_t    I2S_AudioFreq;   //指定为I2S通信选择的频率。此参数可以是I2S_Audio_Frequency的值

uint16_t     I2S_CPOL;    //指定I2S时钟的空闲状态。此参数可以是I2S_Clock_Polarity的值

uint16_t     I2S_DataFormat;   //指定I2S通信的数据格式。此参数可以是I2S_Data_Format的值

uint16_t      I2S_MCLKOutput;   //指定是否启用I2S MCLK输出。此参数可以是I2S_MCLK_Output的值

uint16_t      I2S_Mode;     //指定I2S操作模式。此参数可以是I2S_Mode的值

uint16_t      I2S_Standart; //指定用于I2S通信的标准。此参数可以是I2S_Standard的值
} I2S_InitTypeDef;

二:预定义的配置项

/*------------------SPI_data_direction----------------------------*/

#define     SPI_Direction_2Lines_FullDuplex    ((uint16_t)0x0000)
#define     SPI_Direction_2Lines_RxOnly    ((uint16_t)0x0400)
#define     SPI_Direction_1Line_Rx    ((uint16_t)0x8000)
#define     SPI_Direction_1Line_Tx    ((uint16_t)0xC000)
#define     IS_SPI_DIRECTION_MODE(MODE)  (((MODE)== SPI_Direction_2Lines_FullDuplex)|| \
                                     ((MODE)== SPI_Direction_2Lines_RxOnly)|| \
                                     ((MODE)== SPI_Direction_1Line_Rx)|| \
                                     ((MODE)== SPI_Direction_1Line_Tx))

/*------------------SPI_mode----------------------------*/

#define    SPI_Mode_Master    ((uint16_t)0x0104)
#define    SPI_Mode_Slave    ((uint16_t)0x0000)
#define    IS_SPI_MODE(MODE)  (((MODE)== SPI_Mode_Master)|| \
                           ((MODE)== SPI_Mode_Slave))

/*------------------SPI_data_size----------------------------*/

#define SPI_DataSize_16b   ((uint16_t)0x0800)
#define SPI_DataSize_8b   ((uint16_t)0x0000)
#define IS_SPI_DATASIZE(DATASIZE)        (((DATASIZE) == SPI_DataSize_16b) || \
                                                                       ((DATASIZE) == SPI_DataSize_8b))

/*-----------------SPI_Clock_Polarity ----------------------------*/

#define SPI_CPOL_Low  ((uint16_t)0x0000)
#define SPI_CPOL_High ((uint16_t)0x0002)
#define IS_SPI_CPOL(CPOL)   (((CPOL) == SPI_CPOL_Low) || \
                                                   ((CPOL) == SPI_CPOL_High))

/*-----------------SPI_Clock_Phase ----------------------------*/

#define SPI_CPHA_1Edge  ((uint16_t)0x0000)
#define SPI_CPHA_2Edge  ((uint16_t)0x0001)
#define IS_SPI_CPHA(CPHA   (((CPHA) == SPI_CPHA_1Edge) || \
                                                   ((CPHA) == SPI_CPHA_2Edge))

/*-----------------SPI_Slave_Select_management ----------------------------*/

#define SPI_NSS_Soft        ((uint16_t)0x0200)
#define SPI_NSS_Hard       ((uint16_t)0x0000)
#define IS_SPI_NSS(NSS)    (((NSS) == SPI_NSS_Soft) || \
                                               ((NSS) == SPI_NSS_Hard))

/*-----------------SPI_BaudRate_Prescaler  ----------------------------*/

#define SPI_BaudRatePrescaler_2                  ((uint16_t)0x0000)
#define SPI_BaudRatePrescaler_4                  ((uint16_t)0x0008)
#define SPI_BaudRatePrescaler_8                  ((uint16_t)0x0010)
#define SPI_BaudRatePrescaler_16                 ((uint16_t)0x0018)
#define SPI_BaudRatePrescaler_32                 ((uint16_t)0x0020)
#define SPI_BaudRatePrescaler_64                 ((uint16_t)0x0028)
#define SPI_BaudRatePrescaler_128                ((uint16_t)0x0030)
#define SPI_BaudRatePrescaler_256                ((uint16_t)0x0038)
#define IS_SPI_BAUDRATE_PRESCALER(PRESCALER)     (((PRESCALER) == SPI_BaudRatePrescaler_2) || \
                                                                                                  ((PRESCALER) == SPI_BaudRatePrescaler_4) || \
                                                                                                  ((PRESCALER) == SPI_BaudRatePrescaler_8) || \
                                                                                                  ((PRESCALER) == SPI_BaudRatePrescaler_16) || \
                                                                                                   ((PRESCALER) == SPI_BaudRatePrescaler_32) || \
                                                                                                  ((PRESCALER) == SPI_BaudRatePrescaler_64) || \
                                                                                                  ((PRESCALER) == SPI_BaudRatePrescaler_128) || \
                                                                                                  ((PRESCALER) == SPI_BaudRatePrescaler_256))

/*-----------------SPI_MSB_LSB_transmission ----------------------------*/

#define SPI_FirstBit_MSB                   ((uint16_t)0x0000)
#define SPI_FirstBit_LSB                    ((uint16_t)0x0080)
#define    IS_SPI_FIRST_BIT(BIT)     (((BIT) == SPI_FirstBit_MSB) || \
                                                            ((BIT) == SPI_FirstBit_LSB))

/*-----------------SPI_I2S_Mode ----------------------------*/

#define I2S_Mode_SlaveTx           ((uint16_t)0x0000)
#define I2S_Mode_SlaveRx           ((uint16_t)0x0100)
#define    I2S_Mode_MasterTx      ((uint16_t)0x0200)
#define    I2S_Mode_MasterRx      ((uint16_t)0x0300)
#define    IS_I2S_MODE(MODE)   (((MODE) == I2S_Mode_SlaveTx) || \
                                                        ((MODE) == I2S_Mode_SlaveRx) || \
                                                        ((MODE) == I2S_Mode_MasterTx)|| \
                                                        ((MODE) == I2S_Mode_MasterRx))

/*-----------------SPI_I2S_Standard----------------------------*/

#define I2S_Standard_Phillips                      ((uint16_t)0x0000)
#define I2S_Standard_MSB                          ((uint16_t)0x0010)
#define I2S_Standard_LSB                           ((uint16_t)0x0020)
#define I2S_Standard_PCMShort                  ((uint16_t)0x0030)
#define I2S_Standard_PCMLong                   ((uint16_t)0x00B0)
#define IS_I2S_STANDARD(STANDARD)     (((STANDARD) == I2S_Standard_Phillips) || \
                                                                        ((STANDARD) == I2S_Standard_MSB) || \
                                                                        ((STANDARD) == I2S_Standard_LSB) || \
                                                                        ((STANDARD) == I2S_Standard_PCMShort) || \
                                                                        ((STANDARD) == I2S_Standard_PCMLong))

/*-----------------SPI_I2S_Data_Format ----------------------------*/

#define I2S_DataFormat_16b   ((uint16_t)0x0000)
#define I2S_DataFormat_16bextended   ((uint16_t)0x0001)
#define I2S_DataFormat_24b   ((uint16_t)0x0003)
#define I2S_DataFormat_32b   ((uint16_t)0x0005)
#define IS_I2S_DATA_FORMAT(FORMAT)    (((FORMAT) == I2S_DataFormat_16b) || \
                                                                         ((FORMAT) == I2S_DataFormat_16bextended) || \
                                                                         ((FORMAT) == I2S_DataFormat_24b) || \
                                                                         ((FORMAT) == I2S_DataFormat_32b))

/*-----------------SPI_I2S_MCLK_Output ----------------------------*/

#define I2S_MCLKOutput_Enable                    ((uint16_t)0x0200)
#define I2S_MCLKOutput_Disable                    ((uint16_t)0x0000)
#define    IS_I2S_MCLK_OUTPUT(OUTPUT)   (((OUTPUT) == I2S_MCLKOutput_Enable) || \
                                                                           ((OUTPUT) == I2S_MCLKOutput_Disable))

/*-----------------SPI_I2S_Audio_Frequency----------------------------*/

#define I2S_AudioFreq_192k           ((uint32_t)192000)
#define I2S_AudioFreq_96k           ((uint32_t)96000)
#define I2S_AudioFreq_48k               ((uint32_t)48000)
#define I2S_AudioFreq_44k                 ((uint32_t)44100)
#define I2S_AudioFreq_32k               ((uint32_t)32000)
#define    I2S_AudioFreq_22k             ((uint32_t)22050)
#define    I2S_AudioFreq_16k                 ((uint32_t)16000)
#define I2S_AudioFreq_11k                  ((uint32_t)11025)
#define I2S_AudioFreq_8k                  ((uint32_t)8000)
#define I2S_AudioFreq_Default           ((uint32_t)2)
#define IS_I2S_AUDIO_FREQ(FREQ)  ((((FREQ) >= I2S_AudioFreq_8k) && \
                                                               ((FREQ) <= I2S_AudioFreq_192k)) || \
                                                               ((FREQ) == I2S_AudioFreq_Default))

/*-----------------SPI_I2S_Clock_Polarity----------------------------*/

#define I2S_CPOL_Low            ((uint16_t)0x0000)
#define I2S_CPOL_High           ((uint16_t)0x0008)
#define IS_I2S_CPOL(CPOL)   (((CPOL) == I2S_CPOL_Low) || \
                                                   ((CPOL) == I2S_CPOL_High))

/*-----------------SPI_I2S_DMA_transfer_requests ----------------------------*/

#define SPI_I2S_DMAReq_Tx   ((uint16_t)0x0002)
#define SPI_I2S_DMAReq_Rx   ((uint16_t)0x0001)
#define IS_SPI_I2S_DMAREQ(DMAREQ)   ((((DMAREQ) & (uint16_t)0xFFFC) == 0x00) && ((DMAREQ) != 0x00))

/*-----------------SPI_CRC_Transmit_Receive ----------------------------*/

#define SPI_CRC_Tx   ((uint8_t)0x00)
#define SPI_CRC_Rx   ((uint8_t)0x01)
#define IS_SPI_CRC(CRC)   (((CRC) == SPI_CRC_Tx) || ((CRC) == SPI_CRC_Rx))

/*-----------------SPI_direction_transmit_receive----------------------------*/

#define SPI_Direction_Rx                            ((uint16_t)0xBFFF)
#define SPI_Direction_Tx                             ((uint16_t)0x4000)
#define IS_SPI_DIRECTION(DIRECTION)  (((DIRECTION) == SPI_Direction_Rx) || \
                                                                      ((DIRECTION) == SPI_Direction_Tx))

/*-----------------SPI_I2S_interrupts_definition----------------------------*/

#define SPI_I2S_IT_TXE   ((uint8_t)0x71)
#define SPI_I2S_IT_RXNE   ((uint8_t)0x60)
#define SPI_I2S_IT_ERR   ((uint8_t)0x50)
#define I2S_IT_UDR   ((uint8_t)0x53)
#define SPI_I2S_IT_TIFRFE   ((uint8_t)0x58)
#define SPI_I2S_IT_OVR   ((uint8_t)0x56)
#define SPI_IT_MODF   ((uint8_t)0x55)
#define SPI_IT_CRCERR   ((uint8_t)0x54)
#define IS_SPI_I2S_CLEAR_IT(IT)   (((IT) == SPI_IT_CRCERR)) 
#define IS_SPI_I2S_CONFIG_IT(IT)  (((IT) == SPI_I2S_IT_TXE) || \
                                                            ((IT) == SPI_I2S_IT_RXNE) || \
                                                            ((IT) == SPI_I2S_IT_ERR))
#define IS_SPI_I2S_GET_IT(IT)     (((IT) == SPI_I2S_IT_RXNE)|| ((IT) == SPI_I2S_IT_TXE) || \
                                                         ((IT) == SPI_IT_CRCERR)  || ((IT) == SPI_IT_MODF) || \
                                                         ((IT) == SPI_I2S_IT_OVR) || ((IT) == I2S_IT_UDR) ||\
                                                         ((IT) == SPI_I2S_IT_TIFRFE))

/*-----------------SPI_I2S_flags_definition----------------------------*/

#define SPI_I2S_FLAG_RXNE   ((uint16_t)0x0001)
#define SPI_I2S_FLAG_TXE   ((uint16_t)0x0002)
#define I2S_FLAG_CHSIDE   ((uint16_t)0x0004)
#define I2S_FLAG_UDR   ((uint16_t)0x0008)
#define SPI_FLAG_CRCERR   ((uint16_t)0x0010)
#define SPI_FLAG_MODF   ((uint16_t)0x0020)
#define SPI_I2S_FLAG_OVR   ((uint16_t)0x0040)
#define SPI_I2S_FLAG_BSY   ((uint16_t)0x0080)
#define SPI_I2S_FLAG_TIFRFE   ((uint16_t)0x0100)
#define IS_SPI_I2S_CLEAR_FLAG(FLAG)   (((FLAG) == SPI_FLAG_CRCERR))
#define IS_SPI_I2S_GET_FLAG(FLAG)  (((FLAG) == SPI_I2S_FLAG_BSY) || ((FLAG) == SPI_I2S_FLAG_OVR) || \
                                                                   ((FLAG) == SPI_FLAG_MODF) || ((FLAG) == SPI_FLAG_CRCERR) || \
                                                                  ((FLAG) == I2S_FLAG_UDR) || ((FLAG) == I2S_FLAG_CHSIDE) || \
                                                                  ((FLAG) == SPI_I2S_FLAG_TXE) || ((FLAG) == SPI_I2S_FLAG_RXNE)|| \
                                                                  ((FLAG) == SPI_I2S_FLAG_TIFRFE))

/*-----------------SPI_CRC_polynomial----------------------------*/

#define IS_SPI_CRC_POLYNOMIAL(POLYNOMIAL)   ((POLYNOMIAL) >= 0x1)

/*-----------------SPI_I2S_Legacy----------------------------*/

#define SPI_DMAReq_Tx   SPI_I2S_DMAReq_Tx
#define SPI_DMAReq_Rx   SPI_I2S_DMAReq_Rx
#define SPI_IT_TXE   SPI_I2S_IT_TXE
#define SPI_IT_RXNE   SPI_I2S_IT_RXNE
#define SPI_IT_ERR   SPI_I2S_IT_ERR
#define SPI_IT_OVR   SPI_I2S_IT_OVR
#define SPI_FLAG_RXNE   SPI_I2S_FLAG_RXNE
#define SPI_FLAG_TXE   SPI_I2S_FLAG_TXE
#define SPI_FLAG_OVR   SPI_I2S_FLAG_OVR
#define SPI_FLAG_BSY   SPI_I2S_FLAG_BSY
#define SPI_DeInit   SPI_I2S_DeInit
#define SPI_ITConfig   SPI_I2S_ITConfig
#define SPI_DMACmd   SPI_I2S_DMACmd
#define SPI_SendData   SPI_I2S_SendData
#define SPI_ReceiveData   SPI_I2S_ReceiveData
#define SPI_GetFlagStatus   SPI_I2S_GetFlagStatus
#define SPI_ClearFlag   SPI_I2S_ClearFlag
#define SPI_GetITStatus   SPI_I2S_GetITStatus
#define SPI_ClearITPendingBit   SPI_I2S_ClearITPendingBit

#define IS_I2S_EXT_PERIPH(PERIPH)     (((PERIPH) == I2S2ext) || \
                                    ((PERIPH) == I2S3ext))
#define IS_SPI_23_PERIPH(PERIPH )     (((PERIPH) == SPI2) || \
                                   ((PERIPH) == SPI3))
#define IS_SPI_23_PERIPH_EXT(PERIPH )     (((PERIPH) == SPI2) || \
                                       ((PERIPH) == SPI3) || \
                                       ((PERIPH) == I2S2ext) || \
                                       ((PERIPH) == I2S3ext))
#define IS_SPI_ALL_PERIPH(PERIPH )     (((PERIPH) == SPI1) || \
                                   ((PERIPH) == SPI2) || \
                                   ((PERIPH) == SPI3))
#define IS_SPI_ALL_PERIPH_EXT(PERIPH )     (((PERIPH) == SPI1) || \
                                       ((PERIPH) == SPI2) || \
                                       ((PERIPH) == SPI3) || \
                                       ((PERIPH) == I2S2ext) || \
                                       ((PERIPH) == I2S3ext))

#define CR1_CLEAR_MASK   ((uint16_t)0x3040)
#define I2SCFGR_CLEAR_MASK   ((uint16_t)0xF040)
#define PLLCFGR_PPLR_MASK   ((uint32_t)0x70000000)
#define PLLCFGR_PPLN_MASK   ((uint32_t)0x00007FC0)
#define SPI_CR2_FRF   ((uint16_t)0x0010)
#define SPI_SR_TIFRFE   ((uint16_t)0x0100)

三:定义的功能函数

/*-----------------初始化和配置----------------------------*/

void I2S_Cmd(SPI_TypeDef *     SPIx,FunctionalState     NewState)            
说明:
        启用或禁用指定的SPI外设(在I2S模式下)
参数:
        SPIx: 其中x可以是2或3来选择SPI外设(或I2Sxext用于全双工模式
        NewState: SPIx外设的新状态。此参数可以是:ENABLE或DISABLE。
返回值:
        无     
        
void I2S_FullDuplexConfig(SPI_TypeDef * I2Sxext,I2S_InitTypeDef * I2S_InitStruct)            
说明:
        根据I2S_InitStruct中指定的参数,使用扩展I2Sxext配置I2Sx外设的全双工模式。
参数:
        I2Sxext: 其中x可以是2或3来选择I2S外设扩展块。
        I2S_InitStruct: 指向I2S_InitTypeDef结构的指针,该结构包含指定I2S外设扩展的配置信息
注意:
        I2S_InitStruct参数指向的结构应与主I2S外设使用的结构相同。在这种情况下,如果主设备配置为发送器,则从设备将是接收器,反之亦然。或者,您可以通过将字段I2S_Mode修改为独立于主配置的值I2S_SlaveRx或I2S_SlaveTx来强制执行其他模式。
        I2S全双工扩展只能配置为从机模式。
返回值:
        无     
        
void I2S_Init(SPI_TypeDef * SPIx,I2S_InitTypeDef * I2S_InitStruct     )            
说明:
        根据I2S_InitStruct中的指定参数初始化SPIx外设。
参数:
        SPIx: 其中x可以是2或3来选择SPI外设(在I2S模式下配置)。
        I2S_InitStruct: 指向I2S_InitTypeDef结构的指针,该结构包含在I2S模式下配置的指定SPI外设的配置信息。
注意:
        该功能计算获得最准确音频所需的最佳预分频器(取决于I2S时钟源,PLL值和产品配置)。但是如果预分频器值大于511,则将配置默认值(0x02)。
        如果外部时钟用作I2S的源时钟,则应启用文件stm32f4xx_conf.h中的定义I2S_EXTERNAL_CLOCK_VAL并将其设置为源时钟频率的值(以Hz为单位)。
返回值:
        无     
        
void I2S_StructInit    (I2S_InitTypeDef *I2S_InitStruct)     
说明:
        使用其默认值填充每个I2S_InitStruct成员。
参数:
        I2S_InitStruct: 指向将被初始化的I2S_InitTypeDef结构的指针
返回值:    
        无     
        
void SPI_BiDirectionalLineConfig(SPI_TypeDef * SPIx,uint16_t SPI_Direction     )            
说明:
        为指定的SPI选择双向模式下的数据传输方向。
参数:
        SPIx: 其中x可以是1,2或3来选择SPI外设。
        SPI_Direction:     指定双向模式下的数据传输方向。此参数可以是以下值之一:
                        SPI_Direction_Tx:选择Tx传输方向
                        SPI_Direction_Rx:选择Rx接收方向
返回值:
        无     
        
void SPI_Cmd(SPI_TypeDef * SPIx,FunctionalState NewState     )            
说明:
        启用或禁用指定的SPI外设。
参数:
        SPIx:     其中x可以是1,2或3来选择SPI外设。
        NewState:  SPIx外设的新状态。此参数可以是:ENABLE或DISABLE。
返回值:
        无     
        
void SPI_DataSizeConfig    (SPI_TypeDef *     SPIx,uint16_t SPI_DataSize     )            
说明:
        配置所选SPI的数据大小。
参数:
        SPIx:     其中x可以是1,2或3来选择SPI外设。
        SPI_DataSize:     指定SPI数据大小。此参数可以是以下值之一:
                        SPI_DataSize_16b:将数据帧格式设置为16bit
                        SPI_DataSize_8b:将数据帧格式设置为8bit
返回值:
        无     
        
void SPI_I2S_DeInit    (SPI_TypeDef * SPIx    )     
说明:
        将SPIx外设寄存器取消初始化为其默认复位值。
参数:
        SPIx:     其中x可以是1,2或3来选择SPI外设。
注意:
        当相对I2S外设被去初始化时(扩展块的时钟由I2S外设时钟管理),扩展的I2S块(即I2S2ext和I2S3ext块)被去初始化。
返回值:
        无     
        
void SPI_Init(SPI_TypeDef *SPIx,SPI_InitTypeDef *SPI_InitStruct     )            
说明:
        根据SPI_InitStruct中的指定参数初始化SPIx外设。
参数:
        SPIx: 其中x可以是1,2或3来选择SPI外设。
        SPI_InitStruct: 指向SPI_InitTypeDef结构的指针,该结构包含指定SPI外设的配置信息。
返回值:
        无     
        
void SPI_NSSInternalSoftwareConfig(SPI_TypeDef * SPIx,uint16_t     SPI_NSSInternalSoft     )            
说明:
        通过软件在内部配置所选SPI的NSS引脚。

参数:
        SPIx: 其中x可以是1,2或3来选择SPI外设。
        SPI_NSSInternalSoft: 指定SPI NSS内部状态。此参数可以是以下值之一:
                                SPI_NSSInternalSoft_Set:在内部设置NSS引脚
                                SPI_NSSInternalSoft_Reset:在内部复位NSS引脚
返回值:
        无     
        
void SPI_SSOutputCmd(SPI_TypeDef *SPIx,FunctionalState     NewState     )            
说明:
        启用或禁用所选SPI的SS输出。
参数:
        SPIx:     其中x可以是1,2或3来选择SPI外设。
        NewState:     SPIx外设的新状态。此参数可以是:ENABLE或DISABLE。
返回值:
        无     
        
void SPI_StructInit    (SPI_InitTypeDef *SPI_InitStruct)     
说明:
    使用其默认值填充每个SPI_InitStruct成员。

参数:
        SPI_InitStruct: 指向将被初始化的SPI_InitTypeDef结构的指针。
返回值:
        无     
        
void SPI_TIModeCmd(SPI_TypeDef *SPIx,FunctionalState NewState     )            
说明:
        启用或禁用SPIx / I2Sx DMA接口。
注意:
        只有在调用SPI_Init()函数后才能调用此函数。
        选择TI模式时,不考虑控制位SSM,SSI,CPOL和CPHA,并分别由硬件配置TI模式要求。
参数:
        SPIx:     其中x可以是1,2或3来选择SPI外设。
        NewState:     SPIx外设的新状态。此参数可以是:ENABLE或DISABLE。
返回值:
        无

/*-----------------数据传输---------------------------*/

uint16_t SPI_I2S_ReceiveData(SPI_TypeDef *SPIx )    
说明:
        返回SPIx / I2Sx外设最新接收的数据。
参数:
        SPIx :     要选择SPIx / I2Sx外设,其中x可以是:SPI模式下为1,2或3,I2S模式下为2或3,I2S为全双工模式时为I2Sxext。
返回值:
        接收数据的值。
        
void SPI_I2S_SendData(SPI_TypeDef *SPIx,uint16_t Data)            
说明:
        通过SPIx / I2Sx外设传输数据。
参数:
        SPIx: 要选择SPIx / I2Sx外设,其中x可以是:SPI模式下为1,2或3,I2S模式下为2或3,I2S为全双工模式时为I2Sxext。
        Data: 要传输的数据。
返回值:
        无

/*-----------------硬件CRC计算功能---------------------------*/

void SPI_CalculateCRC(SPI_TypeDef *SPIx,FunctionalState NewState     )            
说明:
        启用或禁用传输字节的CRC值计算。
参数:
        SPIx : 其中x可以是1,2或3来选择SPI外设。    
        NewState : SPIx CRC值计算的新状态。此参数可以是:ENABLE或DISABLE。
返回值:
        无     
        
uint16_t SPI_GetCRC    (SPI_TypeDef *SPIx,uint8_t SPI_CRC     )            
说明:
        返回指定SPI的发送或接收CRC寄存器值。
参数:
        SPIx : 其中x可以是1,2或3来选择SPI外设。
        SPI_CRC : 指定要读取的CRC寄存器。此参数可以是以下值之一:
                    SPI_CRC_Tx:选择Tx CRC寄存器
                    SPI_CRC_Rx:选择Rx CRC寄存器
返回值:
        选择的CRC寄存器值.
        
uint16_t SPI_GetCRCPolynomial(SPI_TypeDef *SPIx)     
说明:
        返回指定SPI的CRC多项式寄存器值。
参数:
        SPIx :     其中x可以是1,2或3来选择SPI外设。
返回值:
        CRC多项式寄存器值。
        
void SPI_TransmitCRC(SPI_TypeDef *SPIx)     
说明:
        传输SPIx CRC值。
参数:
        SPIx :     其中x可以是1,2或3来选择SPI外设。
返回值:
        无

/*-----------------DMA传输管理---------------------------*/

void SPI_I2S_DMACmd    (SPI_TypeDef *SPIx,uint16_t SPI_I2S_DMAReq,FunctionalState NewState)            
说明:
        启用或禁用SPIx / I2Sx DMA接口。
参数:
        SPIx :要选择SPIx / I2Sx外设,其中x可以是:SPI模式下为1,2或3,I2S模式下为2或3,I2S为全双工模式时为I2Sxext。
        SPI_I2S_DMAReq :指定要启用或禁用的SPI DMA传输请求。此参数可以是以下值的任意组合:
                        SPI_I2S_DMAReq_Tx:Tx缓冲区DMA传输请求
                        SPI_I2S_DMAReq_Rx:Rx缓冲区DMA传输请求
        NewState :     所选SPI DMA传输请求的新状态。此参数可以是:ENABLE或DISABLE。
返回值:
        无

/*-----------------中断事件和标志管理---------------------------*/

void SPI_I2S_ClearFlag(SPI_TypeDef *SPIx,uint16_t     SPI_I2S_FLAG)            
说明:
        清除SPIx CRC错误(CRCERR)标志。
参数:
        SPIx :     要选择SPIx / I2Sx外设,其中x可以是:SPI模式下为1,2或3,I2S模式下为2或3,I2S为全双工模式时为I2Sxext。
        SPI_I2S_FLAG :     指定要清除的SPI标志。此函数仅清除CRCERR标志。
        SPI_FLAG_CRCERR:CRC错误标志。
注意:
        OVR(溢出错误)标志由软件序列清零:对SPI_DR寄存器的读操作(SPI_I2S_ReceiveData()),然后对SPI_SR寄存器(SPI_I2S_GetFlagStatus())进行读操作。
        通过对SPI_SR寄存器(SPI_I2S_GetFlagStatus())的读操作清除UDR(欠运行错误)标志。
        MODF(模式故障)标志由软件序列清除:对SPI_SR寄存器(SPI_I2S_GetFlagStatus())的读/写操作,然后对SPI_CR1寄存器(SPI_Cmd()使能SPI 的写操作)。
返回值:
        无     
        
void SPI_I2S_ClearITPendingBit(SPI_TypeDef *SPIx,uint8_t SPI_I2S_IT)            
说明:
        清除SPIx CRC错误(CRCERR)中断挂起位。
参数:
        SPIx :     要选择SPIx / I2Sx外设,其中x可以是:SPI模式下为1,2或3,I2S模式下为2或3,I2S为全双工模式时为I2Sxext。
        SPI_I2S_IT :     指定要清除的SPI中断挂起位。该函数仅清除CRCERR中断挂起位。
        SPI_IT_CRCERR:CRC错误中断。
注意:
        OVR(溢出错误)中断标志位由软件序列清零:对SPI_DR寄存器的读操作(SPI_I2S_ReceiveData()),然后对SPI_SR寄存器(SPI_I2S_GetITStatus())进行读操作。
        通过对SPI_SR寄存器(SPI_I2S_GetITStatus())的读操作清除UDR(欠运行错误)中断标志位。
        MODF(模式故障)中断标志位由软件序列清零:对SPI_SR寄存器(SPI_I2S_GetITStatus())进行读/写操作,然后对SPI_CR1寄存器进行写操作(SPI_Cmd()使能SPI)。
返回值:
        无
        
FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef *SPIx,uint16_t     SPI_I2S_FLAG)            
说明:
        检查指定的SPIx / I2Sx标志是否置1。
参数:
        SPIx :     要选择SPIx / I2Sx外设,其中x可以是:SPI模式下为1,2或3,I2S模式下为2或3,I2S为全双工模式时为I2Sxext。
        SPI_I2S_FLAG :     指定要检查的SPI标志。此参数可以是以下值之一:
                        SPI_I2S_FLAG_TXE:发送缓冲区空标志。
                        SPI_I2S_FLAG_RXNE:接收缓冲区非空标志。
                        SPI_I2S_FLAG_BSY:忙旗。
                        SPI_I2S_FLAG_OVR:溢出标志。
                        SPI_FLAG_MODF:模式故障标志。
                        SPI_FLAG_CRCERR:CRC错误标志。
                        SPI_I2S_FLAG_TIFRFE:格式错误。
                        I2S_FLAG_UDR:欠载错误标志。
                        I2S_FLAG_CHSIDE:通道侧标志。
返回值:
        该SPI_I2S_FLAG的新状态(SET或RESET)
        
ITStatus SPI_I2S_GetITStatus(SPI_TypeDef * SPIx,uint8_t  SPI_I2S_IT)            
说明:
        检查是否发生了指定的SPIx / I2Sx中断
参数:
        SPIx : 要选择SPIx / I2Sx外设,其中x可以是:SPI模式下为1,2或3,I2S模式下为2或3,I2S为全双工模式时为I2Sxext。
        SPI_I2S_IT :指定要检查的SPI中断源。此参数可以是以下值之一:
                    SPI_I2S_IT_TXE:发送缓冲区空中断。
                    SPI_I2S_IT_RXNE:接收缓冲区非空中断。
                    SPI_I2S_IT_OVR:溢出中断。
                    SPI_IT_MODF:模式故障中断。
                    SPI_IT_CRCERR:CRC错误中断。
                    I2S_IT_UDR:欠载中断。
                    SPI_I2S_IT_TIFRFE:格式错误中断。
返回值:
        该SPI_I2S_IT的新状态(SET或RESET)
        
void SPI_I2S_ITConfig(SPI_TypeDef *SPIx,uint8_t SPI_I2S_IT,FunctionalState     NewState)            
说明:
        启用或禁用指定的SPI / I2S中断。
参数:
        SPIx :要选择SPIx / I2Sx外设,其中x可以是:SPI模式下为1,2或3,I2S模式下为2或3,I2S为全双工模式时为I2Sxext。
        SPI_I2S_IT : 指定要启用或禁用的SPI中断源。此参数可以是以下值之一:
                    SPI_I2S_IT_TXE:Tx缓冲区空中断掩码
                    SPI_I2S_IT_RXNE:Rx缓冲区不为空中断掩码
                    SPI_I2S_IT_ERR:错误中断屏蔽
        NewState : 指定SPI中断的新状态。此参数可以是:ENABLE或DISABLE。
返回值:
        无

STM32F1xx_StdPeriph_Driver——SPI相关推荐

  1. stc15w404as引脚图_STC15F2K6S2与stc15w404AS的spi通讯

    #include/*********************************位定义***********************************/ #define uchar unsi ...

  2. I2C和SPI总线优缺点对比

    IIC vs SPI现今,在低端数字通信应用领域,我们随处可见IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Interface)的身影 ...

  3. Java中的ClassLoader和SPI机制

    深入探讨 Java 类加载器 成富是著名的Java专家,在IBM技术网站发表很多Java好文,也有著作. 线程上下文类加载器 线程上下文类加载器(context class loader)是从 JDK ...

  4. Java的SPI机制

    Dubbo等框架使用到必须掌握. java.sql.Driver 是 Spi,com.mysql.jdbc.Driver 是 Spi 实现,其它的都是 Api. package org.hadoop. ...

  5. linux spi双机通信,【转】STM32 SPI双机通信(主从全双工)

    欢迎大家测试 u8 SPI1_ReadByte(u8 TxData) { u8 retry=0; // while((SPI1->SR&1<<1)==0)//等待发送区空 / ...

  6. JDK/Dubbo/Spring 三种 SPI 机制,谁更好?

    点击关注公众号,Java干货及时送达 来源:juejin.cn/post/6950266942875779108 SPI 全称为 Service Provider Interface,是一种服务发现机 ...

  7. 通讯波形记录——I2S、I2C、Uart、SPI

    SPI波形 设置: UART I2S 扩展: I2S有3个主要信号: 1.  SCLK:串行时钟,也叫位时钟(BCLK),即对应数字音频的每一位数据,SCLK都有1个脉冲.SCLK的频率=2×采样频率 ...

  8. SPI flash配置

    配置表中预先配好了一些,我们用到什么SPI就需要添加相应的spi配置参数 spi flash name jedec_id ext_id block_size chip_size clk chip se ...

  9. spi nor flash使用汇总

    Overview SPI flash, 分为spi flash, DUAL spi flash, QUAD spi flash, 3-wire spi, 4-wire spi, 6-wire spi. ...

最新文章

  1. 【社工】NodeJS 应用仓库钓鱼
  2. 英雄难过棍子关html游戏开发,《英雄难过棍子关》评测:看我变长再变长!
  3. android 揭示动画_遗传编程揭示具有相互作用的多元线性回归
  4. aop实现原理_从宏观的实现原理和设计本质入手,带你理解 AOP 框架的原理
  5. 数据库存入表情符报错问题
  6. 静秋姐姐运营课程-笔记
  7. 滴滴为什么接不到长途单?
  8. 【oracle】除数为0
  9. 未找到依赖项 ‘org.apache.spark:spark-hive_2.11:2.4.5‘
  10. 自定义表单-列表字段的数据源绑定
  11. flask之--钩子,异常,上下文,flask-script,模板,过滤器,csrf_token
  12. JAVA计算机毕业设计宠物医院管理系统Mybatis+源码+数据库+lw文档+系统+调试部署
  13. 保研经历总结-清华大学计算机系
  14. 程序员的算法趣题 python3 - (4)
  15. JVM MAT使用分析详解
  16. soc 设计soc设计 uml实务手册_芯片设计进阶之路——SOC电源管理系统
  17. sigmoid和softmax
  18. VMware Tools 安装成功无法从主机拖动文件到虚拟机
  19. 信息平台课件服务器,《CDN平台介绍v》PPT课件.ppt
  20. 如何优化我的世界服务器,我的世界服务器怎么优化 服务器优化建议

热门文章

  1. 塑胶模具设计中的几个小问题,学会不吃亏
  2. python爬取网易云音乐飙升榜音乐_Python爬虫实战,30行代码轻松爬取网易云音乐热歌榜...
  3. Java实现 计算数的平方根
  4. 模型小常识,C4D扫描的使用
  5. 皇甫兵兵php,段颎 汉 文旅网 - powered by phpwind.net
  6. 获苹果中国区推荐,能带来多少新增
  7. 结构化数据与非结构化数据
  8. 《node-thunder》:Node使用迅雷下载
  9. python爬虫与java爬虫的区别_java爬虫(一)主流爬虫框架的基本介绍
  10. oracle随机取名,oracle 表查询随机抽取数据