SPI通信

 SPI是一种高速,全双工,同步通信总线,在芯片上管脚仅只有四根线

应用于:EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理

四根线  MISO;主设备数据输入,从设备数据输出;

             MOSI;主设备数据输出,从设备数据输入;

             SCLK:时钟信号,由主设备产生;

             CS:从设备片选信号,由主设备控制       

SPI通信_第1张图片

SPI 的工作原理

①:硬件方面为四根线

②:主机和从机都有一个串行移位寄存器,主机通过SPI串行移位寄存器写入一个字节发送一次传输

③:串行移位寄存器通过MOSI信号线将字节发送给从机,从机将自己的串行移位寄存器通过MISO返回给主机,从而两个移位寄存器内容被交换

④:外设的读写操作同步完成,只进行写操作,则会忽略读操作

        主机只进行从机的读操作,则主机需要发送一个空字节给从机引发传输

SPI的特征 (图来源于手册23.2.1)

SPI通信_第2张图片

 

 STM32的SPI接口可以配置为支持SPI协议或者支持IIS音频协议,默认为SPI的协议

可以通过软件的方式切换为IIS方式

NSS

软件模式:可以设置SPI_CR1寄存器的SSM位使能

内部NSS信号电平的话可以通过写SPI_CR1的SSI位来驱动

时钟信号的相位和极性

①SPl_CR寄存器的CPOL和CPHA位,能够组合成四种可能的时序关系,CPOL(时钟极性)位控制在没有数据传输时时钟的空闲状态电平,此位对主模式和从模式下的设备都有效。

如果CPOL被清0',SCK引脚在空闲状态下保持低电平。

如果CPOL被置‘1',SCK引脚在空闲状态保持高电平

如果CPHA(时钟相位)位被置'1',SCK时钟的第二个边沿(0为下降沿,1为上升沿)进行数据位的采样,数据在第二个时钟边沿被锁存。

如果CPHA位被清0,SCK时钟的第一个边沿(0为下降沿,1为上升沿)进行数据位采集,数据在第一个时钟边沿被锁存。

CPOL时钟极性和CPHA时钟相位的组合选择数据捕捉的时钟边沿

SPI通信_第3张图片

SPI通信_第4张图片

 

 SPI引脚配置SPI通信_第5张图片

 SPI库函数配置

void SPI2_init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	SPI_InitTypeDef SPI_InitStructure;
	
	GPIO_InitStructure.GPIO_Mode		=	GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin			=	GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Speed		=	GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);   //初始化GPIO
	GPIO_SetBits(GPIOB,GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);

	SPI_InitStructure.SPI_Direction =	SPI_Direction_2Lines_FullDuplex; //设置双线全双工
	SPI_InitStructure.SPI_Mode		= SPI_Mode_Master;    //设置SPI为主模式
	SPI_InitStructure.SPI_DataSize  = SPI_DataSize_8b;    //设置SPI数据大小为8位
	SPI_InitStructure.SPI_CPOL		= SPI_CPOL_High;      //设置SPI默认时钟悬空为高电平
	SPI_InitStructure.SPI_CPHA		= SPI_CPHA_2Edge;     //设置SPI数据捕获为第二个时钟沿   
	SPI_InitStructure.SPI_NSS		= SPI_NSS_Soft;       //设置SPINSS为软件管理
	SPI_InitStructure.SPI_FirstBit  = SPI_FirstBit_MSB;   //设置SPI模式从高位传输
	SPI_InitStructure.SPI_CRCPolynomial  = 7;             //设置SPI CRC值计算的多项式
	SPI_Init(SPI2,&SPI_InitStructure);                    //初始化SPI

}

你可能感兴趣的:(单片机,stm32,嵌入式硬件)