STM32 SPI通信

一、SPI总线简介

1.1 SPI总线

        串口外设接口(Serial Peripheral Interface,SPI)总线是一种同步串行外设接口,允许MCU与各种外围设备进行全双工、同步串行通信

SPI总线有四根通信线:

①SCKSerial Clock,串行时钟):作为主设备的输出、从设备的输入

②MOSI(Master Output Slave Input):主设备发送数据,从模式接收数据

③MISO(Master Input Slave Output):主设备接收数据,从模式发送数据

④SS(Slave Select,片选引脚,低电平有效):选择从机,让主设备可以单独地与特定从设备通信,避免数据线上地冲突

        SPI总线采用主从模式(Master - Slave)架构,支持总线挂载多设备(一主多从),被广泛应用于MCU和外设模块(如E2PROM、ADC、显示驱动器等)

        在大容量和互联型产品上,SPI可以配置为支持SPI协议或者支持I²S音频协议

1.2 SPI硬件电路

所有SPI设备的SCKMOSIMISO分别连在一起

主机另外引出多条SS控制线,分别接到各从机的SS引脚

输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入

为了避免一个主机输入,其他从机均为推挽输出,导致的总线冲突:SPI规定,当从机SS引脚为高电平时,其输出引脚必须切换为高阻态

1.3 SPI通信原理

        SPI为环形总线结构。通信总是由主机发起,在同步SCK驱动下,主机移位寄存器的最高位数据通过MOSI移位到从机移位寄存器的最低位,而从机移位寄存器的最高位数据通过MISO移位到主机移位寄存器的最低位。循环上述过程8次,则通信一个字节数据

1.4 SPI通信时序

1.4.1 起始与终止

1.4.2 交换模式

根据CPOL(Clock Polarity,时钟极性)和CPHA(Clock Phase,时钟相位)两位组合,共有四种组合模式

(1)模式0(常用)

CPOL = 0空闲时SCK为低电平

CPHA = 0:第一个边沿(上升沿)移入(采样)数据,第二个边沿(下降沿)移出数据

对于传输的首个数据的最高位,在SS的下降沿就将其移出,之后在SCL的(上升沿)移入(采样)

(2)模式1

CPOL = 0空闲时SCK为低电平

CPHA = 1上升沿移出数据下降沿移入(采样)数据

(3)模式2

CPOL = 1空闲时SCK为高电平

CPHA = 0:第一个边沿(上升沿)移入(采样)数据,第二个边沿(下降沿)移出数据

对于传输的首个数据的最高位,在SS的下降沿就将其移出,之后在SCL的(上升沿)移入(采样)

(4)模式3

CPOL = 1空闲时SCK为高电平

CPHA = 1上升沿移出数据下降沿移入(采样)数据

1.5 SPI数据格式

SPI:指令码(芯片厂商规定)+寄存器地址+数据

(1)发送指令

向SS指定的设备,发送指令(0x06

(2)指定地址写

向SS指定的设备,发送写指令(0x02), 随后在指定地址(Address[23:0])下,写入指定数据(Data

(3)指定地址读

向SS指定的设备,发送读指令(0x03),随后在指定地址(Address[23:0])下,读取从机数据(Data

二、W25Q64存储器芯片

2.1 W2Q564简介

        时钟频率:160MHz(Dual SPI,双重SPI等效的时钟频率),该存储器的芯片将SPI进行了改进:MOSI和MISO可以同时发送或者同时接收,数据传输速率相当于普通SPI通信模式的2

        320MHz(Quad SPI,四重SPI等效的时钟频率),MOSI、MISO、WP(写保护)、HOLD,四个引脚同时收发数据,数据传输速率相当于普通SPI通信模式的4

2.2 硬件电路

2.3 W2Q564结构框图

        存储空间的划分:先划分为若干的块(Block),其中每一块再划分为若干的扇区(Sector),对于一个扇区,内部还可以分成很多页(Page)

        W2Q564一共有8MByte的存储空间(00 0000H ~ 7F FFFFH),其中,每块定义占用内存64KB,可分为128块;每扇区定义占用内存4KB,可分为16个扇区;每页定义占用内存256B,可分为16页

块Block(0~127,64KB):地址变化规律 :xx 0000H ~  xx FFFFH(xx:最高两位表示位于某一块,变化范围:00~7F

扇区Sector(0~15,4KB):地址变化规律:xx k000H ~  xx kFFFH(k:第四位表示位于某一扇区,变化范围:0~F)

页Page(0~16,256B):地址变化规律:xx xj00H ~  xx xjFFH(k:第三位表示位于某一页,变化范围:0~F)

2.4 状态寄存器

写使能:WEL = 1,表示可以进行写操作

写失能:WEL = 0

(1)上电后,芯片默认写失能

(1)执行以下指令:写失能、页编程、扇区擦除

在任何写操作前,都需要来一遍写使能

一个写使能,只能保证后续的一条指令可以执行

2.5 指令集

三、SPI外设

STM32内部集成了硬件SPI收发电路,可以由硬件自动执行时钟生成、数据收发等功能,减轻CPU的负担

(1)8位或16位传输帧格式选择

(2)可编程的时钟极性、时钟相位和数据传输顺序(高位先行 or 低位先行)

(3)时钟频率: fPCLK / (2, 4, 8, 16, 32, 64, 128, 256)

(4)支持全双工同步、或者半双工/单工同步通信

(5)支持多主机模式

(6)支持DMA功能的1字节发送和接收缓冲器,产生发送和接收请求

(7)支持可靠通信的硬件CRC

(8)兼容I²S协议(仅在大容量和互联型产品)

STM32F103C8T6 硬件SPI资源:SPI1SPI2

SPI主模式:

        数据发送:当写入数据至发送缓冲器时,发送开始。在发送第一个数据位时,数据字被并行地传入移位寄存器,而后串行的移出到MOSI引脚上,MSB(高位)在先还是LSB(低位)在先,取决于SPI_CR1中LSBFIRST位的设置。当时据从发送缓冲器传输到移位寄存器时,TXE置1,如果设置了SPI_CR1中的TXEIE,将产生中断

        数据接收:当数据传输完成时,传送移位寄存器中的数据到接收缓冲器,并且RXNE被置1。如果设置了SPI_CR1中的RXNEIE,将产生中断。当读SPI_DR时,将返回接收缓冲器中的数据,同时RXNE被置0

主模式全双工连续传输:

在模式3下,TXE为1时,数据写入发送缓冲器,此时,发送缓冲器的数据并行传送到移位寄存器

TXE为0,数据开始传输,并将下一位数据写入发送缓冲器,等待第一个数据发送完成

当第一个数据发送完成,交换的数据被接收,放到了接收缓冲器中,并将RXNE置1。

当第二个数据发送完成,交换的数据被接收,放到了接收缓冲器中,并将RXNE置1。

简易流程:

(1)等待TXE为1,写入数据,之后TXE为0

(2)数据移入移位寄存器,TXE为1,下一个数据移入发送缓冲器等待,此时,TXE为1

(3)第一个数据发送完成后,交换的数据从移位寄存器,并行传送到接收缓冲器,将RXNE置1

(4)与此同时,第二个数据迅速转移到移位寄存器,此时TXE为1

(5)接着,将下一位数据写入发送缓冲器中,此时,TXE为1

主模式全双工非连续传输:

(1)等待TXE为1,写入发送数据

(2)等待RXNE为1,接收数据

连续传输优点:传输效率高,性能强大

缺点:软件设计复杂

非连续传输优点:软件设计简单,易于理解

缺点:传输效率相对较低,在字节与字节之间会出现间隙,且随着时钟频率的增快而变长

四、SPI相关库函数

(1)初始化:SPI_Init()

(2)传送数据:SPI_SendData ()

(3)接收数据:SPI_ReceiveData()

五、SPI外设基本配置

(1)开启SPI、GPIO的时钟

(2)配置GPIO的模式

(3)配置SPI外设,完成初始化

	SPI_InitTypeDef SPI_InitStruct;SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;  //波特率分频系数SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;  //时钟相位SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;  //时钟极性SPI_InitStruct.SPI_CRCPolynomial = 7;  //CRC:未用,赋一个默认值SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;  //数据帧大小:8位SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //双线双向全双工SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;  //高位先行SPI_InitStruct.SPI_Mode = SPI_Mode_Master;  //主机SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;SPI_Init(SPI1,&SPI_InitStruct);

(4)使能SPI外设

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/829999.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux的压缩与备份

一、打包 格式&#xff1a;tar -参数 <打包文件名> <打包的目标> 作用&#xff1a;将文件或者目录打包 重要参数&#xff1a;-f 使用归档文件&#xff0c;一定要加上这个参数 -c 新建打包文件 -x 解包文件 -t 可以不用解包就能查看包文件内容 -v 打包和解包时显…

JVM的垃圾回收机制(GC机制)

在Java代码运行的过程中&#xff0c;JVM发现 某些资源不需要再使用的时候&#xff0c;就会自动把资源所占的内存给回收掉&#xff0c;就不需要程序员自行操作了。“自动回收资源”就是JVM的“垃圾回收机制”&#xff0c;“垃圾回收机制”也称"GC机制"。 对于Java代码…

C语言指针进阶_字符指针、指针数组、数组指针、函数指针等的介绍

文章目录 前言一、字符指针二、指针数组三、 数组指针1. 数组名和 & 数组名2. 数组指针3. 数组指针解引用 四、数组指针的使用二维数组的传参说明数组指针使用小测验 五、数组传参和指针传参1. 一维数组传参总结2. 二维数组传参总结3. 一级指针传参4. 二级指针传参 六、函数…

java案例-服务端与客户端(传输对象)

需求 代码 SysUser 用户类Operation 操作类Client 客户端Server 服务端ServerReaderThread 服务端线程类 SysUser 用户类 需要实现Serializable 方便序列化&#xff0c;传输对象 public class SysUser implements Serializable {private String username;private String passwo…

kerberos-hive-dbeaver问题总结

一、kerberos安装windows客户端 1、官方下载地址 http://web.mit.edu/kerberos/dist/ 2、环境变量配置 下载msi安装包&#xff0c;无需重启计算机&#xff0c;调整环境变量在jdk的前面&#xff0c;尽量靠前&#xff0c;因为jdk也带了kinit、klist等命令 C:\Program Files\…

【Node.js工程师养成计划】之原生node开发web服务器

一、使用node创建http服务器 var http require(http);// 获取到服务器实例对象 var server http.createServer() server.listen(8080, function() {console.log(http://127.0.0.1:8080); })server.on(request, function(req, res){console.log(request);res.write(6666666688…

如何利用 GPT 自我提高写作能力

GPT革命&#xff1a;如何用AI技术重新定义写作 介绍 在我们的数字时代&#xff0c;了解自我提高写作的必要性至关重要。 随着 GPT 的兴起&#xff0c;我们正在见证书写的变革时代。 这篇扩展文章深入探讨了 GPT 如何显着提高写作技能。 拥抱未来&#xff1a; 人工智能时代的写…

Maven介绍 主要包括Maven的基本介绍,作用,以及对应的Maven模型,可以对Maven有一个基本的了解

1、Maven介绍 1.1 什么是Maven Maven是Apache旗下的一个开源项目&#xff0c;是一款用于管理和构建java项目的工具。 官网&#xff1a;https://maven.apache.org/ Apache 软件基金会&#xff0c;成立于1999年7月&#xff0c;是目前世界上最大的最受欢迎的开源软件基金会&…

Elasticsearch实现hotel索引库自动补全、拼音搜索功能

Elasticsearch实现hotel索引库自动补全、拼音搜索功能 在这里边我们有两个字段需要用拼音分词器&#xff0c;一个name字段&#xff0c;一个all字段。 然后我们还需要去实现自动补全&#xff0c;而自动补全对应的字段必须使用completion类型。目前我们酒店里面所有的字段都采用的…

【SpringBoot】00 Maven配置及创建项目

一、Maven配置 1、下载Maven 进入官网下载&#xff1a;Maven – Welcome to Apache MavenMaven – Download Apache Maven 本文以最新版为例&#xff0c;可按需选择版本 Maven – Welcome to Apache Maven 2、解压下载好的安装包 将安装包解压到自己设置的空文件夹中 3、…

AI视频教程下载:构建一个ChatGPT股票配对交易机器人

ChatGPT及其后续版本GPT-4已经开始改变世界。人们对新机会感到兴奋&#xff0c;同时对我们社会可能受到的影响感到恐惧。这门课程结合了两个主题&#xff1a;AI和财务&#xff08;算法交易&#xff09;。 你将会学到的&#xff1a; 使用ChatGPT构建一个Python配对交易机器人 …

(Linux)Centos7.*版本安装配置Java环境、Tomcat、Nginx并打包部署SSM框架web系统

一、准备软件与安装包 (一)、必须的软件 1、点击下载Xshell 2、点击下载FileZilla (二)、准备安装包 1、点击下载JDK1.8Linux版本 2、点击下载Nginx 3、点击下载Tomcat 二、关于FileZilla软件的使用说明 (一)、FileZilla软件的打开和说明 (二)、配置服务器地址去连…

理解ROS2的动作

​ 1. 创建一个动作 目标&#xff1a; 在ROS 2软件包中定义一个动作。 1.1 新建包 设置一个 workspace 并创建一个名为 action_tutorials_interfaces 的包&#xff1a; mkdir -p ros2_ws/src #you can reuse existing workspace with this naming convention cd ros2_ws/s…

NLP发展及其详解

一、RNN(循环神经网络) 在这里附上一个很好的笔记 零基础入门深度学习(5) - 循环神经网络 RNN(循环神经网络)的结构特点在于其循环单元的设计,这种设计允许网络在处理序列数据时保持对之前信息的记忆。下面详细解释RNN的结构: 循环单元:RNN的循环单元是网络的核心,它…

基于Springboot的爱心商城系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的爱心商城系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

[BT]BUUCTF刷题第25天(4.28)

第25天&#xff08;共3题&#xff09; Web [CISCN 2019 初赛]Love Math 打开网站就是一段泄露的源代码&#xff1a; <?php error_reporting(0); //听说你很喜欢数学&#xff0c;不知道你是否爱它胜过爱flag if(!isset($_GET[c])){show_source(__FILE__); }else{//例子 c…

【LeetCode刷题记录】简单篇-70-爬楼梯

【题目描述】 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 【测试用例】 示例1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1.1阶 1阶…

C语言-------实现贪吃蛇小游戏

目录 一、预备知识 1.1 Win32 API介绍 Windows 这个多作业系统除了协调应用程序的执行、分配内存、管理资源之外&#xff0c; 它同时也是一个很大的服务中心&#xff0c;调用这个服务中心的各种服务&#xff08;每一种服务就是一个函数&#xff09;&#xff0c;可以帮应用程…

PyVista 3D数据可视化 Python 库 简介

Pyvista是一个用于科学可视化和分析的Python库 &#xff1b;我认为它适合做一些网格数据的处理&#xff1b; 它封装了VTK&#xff08;Visualization Toolkit&#xff09;之上&#xff0c;提供了一些高级接口&#xff0c; 3D数据可视化变得更加简单和易用。 1.安装 pyvista&…

SpringMVC进阶(自定义拦截器以及异常处理)

文章目录 1.自定义拦截器1.基本介绍1.说明2.自定义拦截器的三个方法3.流程图 2.快速入门1.Myinterceptor01.java2.FurnHandler.java3.springDispatcherServlet-servlet.xml配置拦截器4.单元测试 3.拦截特定路径1.拦截指定路径2.通配符配置路径 4.细节说明5.多个拦截器1.执行流程…