STM32_SPI

目录

1:STM32SPI简介

2:SPI内部结构简明图

3:程序配置


1:STM32SPI简介

SPI:Serial Peripheral interface(串行外围设备接口)

是一种高速、全双工、同步的通信总线,并且在芯片的管脚上只占四根线

STM32F4有3个SPI,不仅支持SPI,还支持I2S音频协议,默认是SPI模式,通过软件切换到I2S模式

2:SPI内部结构简明图

 STM32_SPI_第1张图片

MISO:主设备数据输入,从设备数据输出

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

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

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

  • 硬件上为4根线。
  • 主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。 串行移位寄存器通过MOSI信号线将字节传送给从机,从机也将自己的串行移位寄存器中的内容通过MISO信号线返回给主机。这样,两个移位寄存器中的内容就被交换。
  • 外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。

3:程序配置

在查表找到SPIX相应的引脚后,将其配置为复用推挽输出

	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;		                //设置SPI工作模式:设置为主SPI
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;		            //设置SPI的数据大小:SPI发送接收8位帧结构
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;		//串行同步时钟的空闲状态为高电平
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;	//串行同步时钟的第二个跳变沿(上升或下降)数据被采样
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;		//NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;		//定义波特率预分频的值:波特率预分频值为256
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;	//指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
	SPI_InitStructure.SPI_CRCPolynomial = 7;	//CRC值计算的多项式
	SPI_Init(SPI1, &SPI_InitStructure);         //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
 
	SPI_Cmd(SPI1, ENABLE);   //使能SPI外设

	SPI1_ReadWriteByte(0xff);//启动传输	
	  

//SPI1 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPI1_ReadWriteByte(u8 TxData)
{		 			 
 
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){}  //等待发送区空  
	
	SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个byte  数据
		
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){} //等待接收完一个byte  
 
	return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据	
}

 	
  1. SPI_Direction:设置SPI_CR1寄存器的位10,14、15
  2. SPI_Mode:设置SPI_CR1寄存器的位2,8
  3. SPI_DataSize_8b:设置SPI_CR1寄存器的位11
  4. SPI_CPOL:设置SPI_CR1寄存器的位1
  5. SPI_CPHA:设置SPI_CR1寄存器的位0
  6. SPI_NSS:设置SPI_CR1寄存器的位9
  7. SPI_BaudRatePrescaler:设置SPI_CR1寄存器的位[3:5]
  8. SPI_FirstBit:设置SPI_CR1寄存器的位7
  9. SPI_CRCPolynomial:设置SPI_CRCPR寄存器,该寄存器复位值为0x0007

SPI_Cmd:设置SPI_CR1寄存器的位6

SPI_I2S_GetFlagStatus,根据第二个参数,来查询SPI_SR状态寄存器

SPI_I2S_SendData、SPI_I2S_ReceiveData:操作SPI_DR寄存器,这个寄存器可以拿来接受和发送

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(STM32)