stm32f1系列串行外围设备接口---SPI

SPI也是一种通信协议。它与我们之前介绍的USART不同的主要是,SPI属于同步通信协议,USART属于异步通信的协议。SPI的控制也主要是三个寄存器,状态(SR)控制(CR)数据(DR)。其实一般协议的寄存器都是要依据这几个寄存器来操作的。所以我们也主要从这几个寄存器中介绍一下SPI的寄存器。首先介绍一下SPI需要用的引脚。
名词解释:
MISO:主设备输入/从设置输出引脚。当SPI为主模式下,这个引脚来接收数据。在从模式下,也是靠这个引脚来输出数据的。可以这样理解M=MASTER I=INPUT S=SLAVE O=OUTPUT
MOSI:主设备输出/从设备输出引脚。当SPI为主模式下,这个引脚是来发送数据的。在从模式下,这个引脚是接收数据的。
SCK:这个时钟的意思,一般都是由主设备输出给从设备。(同步嘛时钟是要一样的)
NSS:片选脚。每个从机都会有一个引脚CS是片选脚,如果CS为低电平,才代表片选成功。SPI的NSS脚可以做为输入,也可以作为输出。(NSS东西太多,其实我自己也就有点混淆,我就通俗的讲吧)。

-------------------------------------------------------分割线---------------------------------------------------------------

1.首先SPI建立通信的原则是主机的NSS为高,从机的NSS为低。
2.每个SPI的NSS引脚都由输入和输出的功能。是由CR2寄存器中的SSOE位控制,所以在主机模式下,SSOE 为1的话就是输出低电平,SSOE为0的话就会进入主模式失败中。从机与其相连就会被拉低,从而片选成功。
3.输入模式的话可以分为硬件输入和软件输入。主要是根据CR1寄存器中的SSM和SSI位来控制,SSM位1的话代表是软件输入使能了,SSI的话是控制高低电平的,1是高电平,0是低电平。如果是主机的话,这里SSI就是为1,因为STM32手册中有说,要保证主机模式下,也就是MSTR和SPE为1的前提就是SSI为1.(就是我我想要一直是主机的话,我就要MSPR和SPE这两位为1,这两位想要为1的话SSI就要一直为1).
4.根据3可以知道,主机已经自己拉高了,从机的话也要自己想办法。第一种就是SSI设置为0.这种方法的话必须你这是STM32自带的SPI才可以,因为这么32自己的芯片的SPI的NSS引脚才有内部NSS和外部NSS。如果是一个SPI芯片的话,NSS这个脚想要拉低话,要么直接接一个GND,要么就被一个STM32的IO控制。当然了,主机被设置为了NSS输入模式了,是内部NSS输入模式了,外部NSS这个引脚其实就和一个普通的IO口一样了。
5.硬件的话直接接高接低。
-----------------------------------------------------------------分割线-----------------------------------------------------
现在我们开始从寄存器讲吧
首先是SPI_CR1控制寄存器模式

在这里插入图片描述
这次就不详细介绍了,就简单介绍其中平常要用到的几个就号了。从高到低
15.BIDIMODE 双向数据模式使能:0 双线双向 1单线双向
11.DFF数据帧格式。0是8位,1是16位
10.RXONLY 只接收:0是全双工(接收发送) 1禁止输出只接收
9.SSM 软件从设备管理:0禁止软件使能 1启用软件使能
8.SSI内部从设备管理:SSM为1时才有意义。 0为低电平,1为高电平。
7.LSBFIRET 帧格式: 0先发MSB 1先发LSB
6.SPE使能 :0 禁止 1使能
[5,3]波特率控制

2.MSTR主设备选择:0从设备 1主设备
1.CPOL时钟极性:0空闲为低 1空闲为高
0.CPHA时钟相位:0数据从第一个时钟沿采样 1时钟从第二个时钟沿采样
在这里插入图片描述
这个寄存器只用到8位。
[7,5]分别为发送、接收缓冲区中断使能和错误中断使能位
2.SSOE 输出使能位,前面讲到过,如果NSS脚要设置为输出位置的话需要把这个引脚使能
[1,0]发送接收缓冲区DMA使能,这个就是TXE/RXE置位时就会发送DMA请求

在这里插入图片描述
状态寄存器同样是16位只用到了8位
7.BSY 忙碌标志。置为说明SPI正在忙于通信或者发送缓冲区非空(该位置由硬件置为或者复位)
6.OVR 溢出标志
5.MODF 模式错误位
在这里插入图片描述
在这里插入图片描述
[1,0]TXE,RXNE 发送缓冲区为空/接收缓冲区非空
在这里插入图片描述
最后一个数据寄存器比较简单,大家可以一眼就看的出来,这里就不多做介绍了

接下来就是寄存器版本的SPI初始化配置

#include "my_spi.h"

//spi初始化
void MY_SPI_Init(void)
{
	RCC->APB1ENR|=1<<2;//GPIOA使能
	RCC->APB2ENR|=1<<12;//SPI1使能
	
	GPIOA->CRL&=0x000fffff;//复位除PA567之外的其他引脚
	GPIOA->CRL|=0XBBB00000;//复用推挽输出 速度50
	GPIOA->BSRR|=0x0111<<5;//PA567拉高
	
	SPI1->CR1|=0<<10;//全双工模式
	SPI1->CR1|=1<<2;//SPI配置为主机模式
	SPI1->CR1|=0<<11;//8位数据帧格式
	SPI1->CR1|=1<<1;//CPOL闲置时位高
	SPI1->CR1|=1<<0;//CPHA从第二个时钟边沿开始采集
	SPI1->CR1|=0x11<<8;//由软件控制NSS脚电平为高
	SPI1->CR1|=0x111<<3;//波特率为Fpclk/256
	SPI1->CR1|=0<<7;//MSB先发
	
	SPI1->CR1|=1<<6;//SPI使能
	
//	SPI1_ReadWriteByte(0xff) //启动传输(主要作用:维持 MOSI 为高)
}

//发送一个数据
void SPI_SEND(u16 DATE)
{
	DATE=0xff;
	while(!(SPI1->SR|=1<<1));//发送缓冲区为空
	SPI1->DR|=DATE;
}

//接受一个数据
u16 SPI_RECEIVE(void)
{
	while(!(SPI1->SR|=1<<0));//接收缓冲区非空
	
	return SPI1->DR;
}

如果对您的问题有帮助的话可以帮忙点个赞,谢谢~QQ群:540093471 有问题大家可以一起交流沟通!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_LiuChunJiang刘春江

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值