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;//复用推挽输出 速度50GPIOA->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/256SPI1->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 有问题大家可以一起交流沟通!

stm32f1系列串行外围设备接口---SPI相关推荐

  1. 第五课 MC9S08DZ60之串行外围设备接口SPI

    本章节将浅析SPI通信原理,以及利用MC9S08DZ60单片机的串行外围设备接口SPI,实现SPI串行通信,MCU为主控设备.有兴趣的读者可以通过单片机的I/O口,模拟SPI通信过程,实现SPI通信. ...

  2. SPI串行外围设备接口

    一.要知道SPI总线是什么,首先要知道具体的通信时序是怎样的? 串行外围设备接口SPI(serial peripheral interface)总线技术是Motorola公司推出的一种同步串行接口. ...

  3. SPI (串行外围设备接口) 协议简介

    1.SPI协议简介 1.1 SPI协议概括 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口.是Motorola首先在其MC68HCXX系列处理 ...

  4. F28335第十一篇——串行外设接口(SPI)

    摘要 本文大致介绍了F28335中SPI工作原理和大致寄存器.还有很多细节知识没有列出,需要详细了解的同学,可以参考TI官方文档(TI官网免费下载),或者可以看书籍.重点推荐符晓编写的<TMS3 ...

  5. platform框架--Linux MISC杂项框架--Linux INPUT子系统框架--串行集成电路总线I2C设备驱动框架--串行外设接口SPI 设备驱动框架---通用异步收发器UART驱动框架

    platform框架 input. pinctrl. gpio 子系统都是 Linux 内核针对某一类设备而创建的框架, input子系统是管理输入的子系统 pinctrl 子系统重点是设置 PIN( ...

  6. 嵌入式硬件协议: SPI串行外设接口 Serial Peripheral Interface

    简介 SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设备接口,是 一种高速全双工的通信总线.它被广泛地使用在ADC.LCD 等设备与M ...

  7. arduino教程-9. 串行外设接口(spi)

    文章目录 相关资料 1. spi针脚 Arduino 串行外设接口 串行外设接口简介 板的SPI引脚 SPI.h 库 SPI.h官方示例 SPI为主机 例子 SPI为从机 例子 相关资料 SPI li ...

  8. DSP SPI串行外设接口

    1.SPI介绍 1.1 SPI简介 SPI的全称是"Serial Peripheral Interface",意为串行外围接口,是Motorola首先在其MC68HCXX系列处理器 ...

  9. 谈谈SPI (Serial Peripheral Interface,串行外设接口)

    今天我们来一起聊聊谈谈SPI (Serial Peripheral Interface,串行外设接口): 什么是SPI SPI (Serial Peripheral Interface,串行外设接口) ...

最新文章

  1. 目标定位--Deep Self-Taught Learning for Weakly Supervised Object Localization
  2. matplotlb.finance导包报错——ModuleNotFoundError No module named mpl finance
  3. JFrame 居中显示
  4. wireshark抓包图解 TCP三次握手/四次挥手详解
  5. php实现多条件查找分页,Yii2.0框架实现带分页的多条件搜索功能示例
  6. c++之二维数组参数传递
  7. ELK详解(三)——Elasticsearch部署优化
  8. 【数据库试题及答案】关系模型得数据操纵即就是建立在关系上得数据操纵,一般有(查询)、增加、删除与 修改四种操作
  9. html5 shiv
  10. and design 如何引入阿里图表矢量库 创建自定义icon
  11. HTML给表格写个标题居中,如何将表格中的各个标题居中?
  12. Pr效果:音频过渡效果
  13. IDEA 配置文件位置
  14. 利用H5SVG实现线性动画效果
  15. python做交易软件_我用Python做了个量化交易工具!
  16. 未来避难所:漂浮的诺亚方舟宾馆可抵御洪流
  17. 网易云商-七鱼客服使用感受
  18. 华为的海外员工生活写实
  19. jit和jitx区别_JIT的核心思想是什么?
  20. 【Axure10基础教程】第七章 设置文本

热门文章

  1. 基于SSM水果蔬菜商城批发网站|电商购物系统
  2. 查看所有订单的管理页面html,亚马逊订单管理
  3. 微信晚上服务器,腾讯解释为什么微信没有夜间模式:不忍心占用你的夜晚时间...
  4. 他成功创业,做到中国水饺品类的隐形冠军,拥有门店近400家
  5. 无线网络2.4G与5.0G的区别
  6. 三菱PLC气缸控制程序 此程序已经实际设备上批量应用
  7. JavaScript 基础 | 基础语法知识梳理
  8. vscode折叠功能失效问题解决
  9. casio计算机按键,卡西欧按键功能
  10. Ubuntu 安装jdk17详细配置教程