SPI与I2S
Table.0-1 SPI寄存器 No 1 2 3 4 5 6 7 8 9 寄存器 CR1 CR2 SR DR CRCPR RxCRCR TxCRCR I2S_CFGR I2SPR 描述 SPI控制寄存器1 SPI控制寄存器2 SPI状态寄存器 SPI数据寄存器 SPI CRC多项式寄存器 SPI接收CRC寄存器 SPI发送CRC寄存器 I2S配置寄存器 I2S预分频寄存器 SPI √ √ √ √ √ √ √ I2S √ √ √ √ √ 备注:小容量和中容量没有I2S接口。故STM32F103RBT6不需要考虑I2S库函数。 Table.0-2 库函数列表
No 函数名 描述 1 SPI_I2S_DeInit 将外设SPIx\\I2Sx寄存器重设为缺省值 2 SPI_Init 根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器 3 I2S_Init 根据I2S_InitStruct中指定的参数初始化外设I2Sx寄存器 4 SPI_StructInit 把SPI_InitStruct中的每一个参数按缺省值填入 5 I2S_StructInit 把I2S_InitStruct中的每一个参数按缺省值填入 6 SPI_Cmd 使能或失能SPI外设 7 I2S_Cmd 使能或失能I2S外设 8 SPI_I2S_ITConfig 使能或失能指定的SPIx\\I2Sx中断 9 SPI_I2S_DMACmd 使能或失能指定SPIx\\I2Sx的DMA请求 10 SPI_I2S_SendData 通过外设SPIx\\I2Sx发送一个数据 11 SPI_I2S_ReceiveData 返回通过SPIx\\I2Sx最近接收的数据 12 SPI_NSSInternalSoftwareConfig 为选定的SPI软件配置内部NSS管脚 13 SPI_SSOutputCmd 使能或失能指定的SPI SS输出 14 SPI_DataSizeConfig 设置选定的SPI数据大小 15 SPI_TransmitCRC 发送SPIx的CRC值 16 SPI_CalculateCRC 使能或失能指定SPI的传输字CRC值计算 17 SPI_GetCRC 返回指定SPI的发送或者接受CRC寄存器值 18 SPI_GetCRCPolynomial 返回指定SPI的CRC多项式寄存器值 19 SPI_BiDirectionalLineConfig 选择指定SPI在双向模式下的数据传输方向 20 SPI_I2S_GetFlagStatus 检查指定的SPIx\\I2Sx标志位设置与否 21 SPI_I2S_ClearFlag 清除SPIx\\I2Sx的待处理标志位 22 SPI_I2S_GetITStatus 检查指定的SPI\\I2Sx中断发生与否 23 SPI_I2S_ClearITPendingBit 清除SPIx\\I2Sx的中断待处理位 注 标有SPI_I2S的函数,既符合SPI接口,也符合I2S接口;标示I2S的只能对应I2S接口 串行外设接口(SPI)提供与外部设备进行同步串行通讯的功能。接口可以被设置工作在主模式或者从模式。
/*【01】函数SPI_I2S_DeInit
****************************************************************************** * Function Name : SPI_I2S_DeInit
* Description : Deinitializes the SPIx peripheral registers to their default * reset values (Affects also the I2Ss).
* Input : - SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. * Output : None * Return : None
*******************************************************************************/ void SPI_I2S_DeInit(SPI_TypeDef* SPIx) {
/* Check the parameters */
assert_param(IS_SPI_ALL_PERIPH(SPIx));
switch (*(u32*)&SPIx) {
case SPI1_BASE:
/* Enable SPI1 reset state */
RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, ENABLE); /* Release SPI1 from reset state */
RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, DISABLE); break;
case SPI2_BASE:
//I2S只有I2S2、I2S3,分别对应SPI2、SPI3。先开启SPI2外设,然后设置I2SCFGR可以开启I2S2或SPI2 /* Enable SPI2 reset state */
RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, ENABLE); /* Release SPI2 from reset state */
RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, DISABLE); break;
case SPI3_BASE:
/* Enable SPI3 reset state */
RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, ENABLE); /* Release SPI3 from reset state */
RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, DISABLE); break;
default: break; } }
/*【02】函数SPI_Init
****************************************************************************** * Function Name : SPI_Init
* Description : Initializes the SPIx peripheral according to the specified * parameters in the SPI_InitStruct.
* Input : - SPIx: where x can be 1, 2 or 3 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
******************************************************************************/ SPI_InitTypeDef structure:
typedef struct {
u16 SPI_Direction; u16 SPI_Mode; u16 SPI_DataSize; u16 SPI_CPOL; u16 SPI_CPHA; u16 SPI_NSS;
u16 SPI_BaudRatePrescaler; u16 SPI_FirstBit;
u16 SPI_CRCPolynomial; }SPI_InitTypeDef;
SPI_Direction:设置了SPI单向或者双向的数据模式。 Table.02-1 SPI_Direction值
SPI_Direction SPI_Direction_2Lines_RxOnly SPI_Direction_1Line_Rx SPI_Direction_1Line_Tx SPI_Mode:设置了SPI 工作模式。 Table .02-2 SPI_Mode值
SPI_Mode 描述/CR1.8/2 组合的意义 SPI_Mode_Master 设置为主SPI SPI_Mode_Slave 设置为从SPI SPI_DataSize:设置了SPI的数据大小。 Table.02-3 SPI_DataSize值
SPI_DataSize SPI_DataSize_16b SPI_DataSize_8b 描述/CR1.DFF/bit11 SPI发送接收16位帧结构 SPI发送接收8位帧结构 0x0800 0x0000 0x0104 SSI=1;MSTR=1 0x0000 描述CR.15/14/10 SPI设置为双线单向接收 SPI设置为单线双向接收 SPI设置为单线双向发送 组合的意义 SPI_Direction_2Lines_FullDuplex SPI设置为双线双向全双工 0x0000 BIDIMODE=0(双线双向): 0x0400 RXONLY:全双工、只接收 0x8000 BIDIMODE=1(单线双向): 0xC000 BIDIOE:只接收、只发送 SPI_CPOL:选择了串行时钟的稳态。 Table.02-4 SPI_ SPI_CPOL 值
SPI_CPOL 描述/CR1.CPOL SPI_CPOL_High 时钟悬空高 SPI_CPOL_Low 时钟悬空低 bit1 0x0002 0x0000 SPI_CPHA:设置了位捕获的时钟活动沿。 Table.02-5 SPI_SPI_CPHA值
SPI_CPHA SPI_CPHA_2Edge SPI_CPHA_1Edge 描述/CR1.CPHA/bit0 数据捕获于第二个时钟沿 数据捕获于第一个时钟沿 0x0001 0x0000 SPI_NSS:指定了NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理。 Table .02-6 SPI_NSS值
SPI_NSS SPI_NSS_Hard SPI_NSS_Soft 描述/CR1.SSM/bit9 NSS由外部管脚管理 0x0000 内部NSS信号由SSI位控制 0x0200 SPI_BaudRatePrescaler:用来定义波特率预分频的值,这个值用以设置发送和接收的SCK时钟。 Table.02-7 SPI_BaudRatePrescaler值
SPI_BaudRatePrescaler SPI_BaudRatePrescaler2 SPI_BaudRatePrescaler4 SPI_BaudRatePrescaler8 描述/CR1.BR[2:0] 波特率预分频值为2 波特率预分频值为4 波特率预分频值为8 bit5-4 0x0000 0x0008 0x0010 SPI_BaudRatePrescaler16 SPI_BaudRatePrescaler32 SPI_BaudRatePrescaler64 SPI_BaudRatePrescaler128 SPI_BaudRatePrescaler256 波特率预分频值为16 波特率预分频值为32 波特率预分频值为64 波特率预分频值为128 波特率预分频值为256 0x0018 0x0020 0x0028 0x0030 0x0038 注意:通讯时钟由主SPI的时钟分频而得,不需要设置从SPI的时钟。 SPI_FirstBit:指定了数据传输从MSB位还是LSB 位开始。 Table.02-8 SPI_FirstBit值 SPI_FirstBit 描述/CR1. LSBFIRST SPI_FisrtBit_MSB SPI_FisrtBit_LSB 例:
/* Initialize the SPI1 according to the SPI_InitStructure members */ SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DatSize = SPI_DatSize_16b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitStructure);
函数原型如下:
void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct) {
u16 tmpreg = 0;
/* check the parameters */
assert_param(IS_SPI_ALL_PERIPH(SPIx));
/* Check the SPI parameters */
assert_param(IS_SPI_DIRECTION_MODE(SPI_InitStruct->SPI_Direction)); assert_param(IS_SPI_MODE(SPI_InitStruct->SPI_Mode));
assert_param(IS_SPI_DATASIZE(SPI_InitStruct->SPI_DataSize)); assert_param(IS_SPI_CPOL(SPI_InitStruct->SPI_CPOL)); assert_param(IS_SPI_CPHA(SPI_InitStruct->SPI_CPHA));
assert_param(IS_SPI_NSS(SPI_InitStruct->SPI_NSS));
assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_InitStruct->SPI_BaudRatePrescaler)); assert_param(IS_SPI_FIRST_BIT(SPI_InitStruct->SPI_FirstBit));
assert_param(IS_SPI_CRC_POLYNOMIAL(SPI_InitStruct->SPI_CRCPolynomial));
/*---------------------------- SPIx CR1 Configuration ------------------------*/ /* Get the SPIx CR1 value */ tmpreg = SPIx->CR1;
/* Clear BIDIMode, BIDIOE, RxONLY, SSM, SSI, LSBFirst, BR, MSTR, CPOL and CPHA bits */ tmpreg &= CR1_CLEAR_Mask;// 0x3040,CR1除了CRCEN、CRCNEXT、SPE三个控制位,其他都清除。
bit7 数据传输从MSB位开始 0x0000 数据传输从LSB位开始 0x0080 SPI_CRCPolynomial:定义了用于CRC值计算的多项式:>= 0x1。
/* Configure SPIx: direction, NSS management, first transmitted bit, BaudRate prescaler master/salve mode, CPOL and CPHA */
/* Set BIDImode, BIDIOE and RxONLY bits according to SPI_Direction value */ /* Set SSM, SSI and MSTR bits according to SPI_Mode and SPI_NSS values */ /* Set LSBFirst bit according to SPI_FirstBit value */
/* Set BR bits according to SPI_BaudRatePrescaler value */ /* Set CPOL bit according to SPI_CPOL value */
/* Set CPHA bit according to SPI_CPHA value */
tmpreg |= (u16)((u32)SPI_InitStruct->SPI_Direction | SPI_InitStruct->SPI_Mode | SPI_InitStruct->SPI_DataSize | SPI_InitStruct->SPI_CPOL | SPI_InitStruct->SPI_CPHA | SPI_InitStruct->SPI_NSS |
SPI_InitStruct->SPI_BaudRatePrescaler | SPI_InitStruct->SPI_FirstBit); /* Write to SPIx CR1 */ SPIx->CR1 = tmpreg;
/* Activate the SPI mode (Reset I2SMOD bit in I2SCFGR register) */
SPIx->I2SCFGR &= SPI_Mode_Select; // 0xF7FF,bit11:I2SMOD( 0--SPI;1--I2S )
/*---------------------------- SPIx CRCPOLY Configuration --------------------*/ /* Write to SPIx CRCPOLY */
SPIx->CRCPR = SPI_InitStruct->SPI_CRCPolynomial; }
/*【03】函数I2S_Init
****************************************************************************** * Function Name : I2S_Init
* Description : Initializes the SPIx peripheral according to the specified * parameters in the I2S_InitStruct.
* Input : - SPIx: where x can be 2 or 3 to select the SPI peripheral * (configured in I2S mode).
* - I2S_InitStruct: pointer to an I2S_InitTypeDef structure that * contains the configuration information for the specified * SPI peripheral configured in I2S mode. * Output : None
* Return : None
******************************************************************************/ 结构体I2S_InitTypeDef定义如下:
typedef struct {
u16 I2S_Mode;
u16 I2S_Standard; u16 I2S_DataFormat; u16 I2S_MCLKOutput; u16 I2S_AudioFreq; u16 I2S_CPOL; }I2S_InitTypeDef; [1]、I2S_Mode:
Table.03-1 I2S模式设置,设置主/从模式的发送/接收。 I2S_Mode 意义/I2SCFGR.bit9-8 #define Val