STM32--SPI通信与W25Q64(2)

news2024/11/22 23:23:44

STM32–SPI通信与W25Q64(1)

文章目录

  • SPI外设
    • 特征
  • SPI框图
  • 传输模式
    • 主模式全双工连续传输
  • 非连续传输
  • 硬件SPI读写W25Q64

SPI外设

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

特征

3线全双工同步传输
8或16位传输帧格式选择
主或从操作
支持多主模式
8个主模式波特率预分频系数(最大为fPCLK/2)
主模式和从模式下均可以由软件或硬件进行NSS管理:主/从操作模式的动态改变
可编程的数据顺序, MSB在前或LSB在前
可编程的时钟极性和相位
SPI总线忙状态标志
兼容I2S协议

STM32F103C8T6 硬件SPI资源:SPI1、SPI2

SPI框图

在这里插入图片描述
通过主控制电路来控制数据的传输;

先看左上角部分,对于接收的数据,会从MISO引脚进入;数据一位一位的进入移位寄存器,当有一个字节(或者两个字节大小)的数据在移位寄存器时,传送移位寄存器里的数据到接收缓冲器,并且RXNE标志被置位

这里的RXNE是是接收缓冲区的标志位,
在这里插入图片描述

读SPI_DR接收寄存器可以清除RNXE标志位
在连续传输数据中,一个要接收的数据只有被读出,下一个数据才有机会进入接收缓冲器。而利用RNXE标志位即可知道当前数据是否被读出。否则,下一个数据会对当前数据进行覆盖,那么读取数据就会造成错误。
对于要发送的数据,会将写入数据先放在发送缓冲器中,在发送第一个数据位时,数据字被并行地(通过内部总线)传入移位寄存器,而后串行地移出到MOSI脚上;(可自行设定低位先行还是高位先行); 数据从发送缓冲器传输到移位寄存器时TXE标志将被置位

发送到移位寄存器的标志位在这里插入图片描述

只要写入SPI_DR寄存器那么TXE标志位就会被清除。这里将移位寄存器和接收缓冲区和发送缓冲区合在一起,就是数据寄存器;
这里要注意,数据寄存器内部会分为两部分,接收和发送,移位寄存器是共用的,但传输单位最小是8bit或者是16bit,都是以字节为单位的,不会造成同时进行发送和接收的冲突

右边则是将寄存器的位都标出来了,CR是控制寄存器,只要是产生使能的寄存器;SR是状态寄存器,比较重要的就是刚才介绍的两个RXNE和TXE;

波特率发生器用来控制SCK分频;

传输模式

主模式全双工连续传输

同时进行传输的
在这里插入图片描述
一开始,会先写入一个数据1,接着会使标志位TXE置非空,等到TXE位空时,再写入一个数据2,此时会等待RXNE非空时,读取数据A1,接着就是等到TXE为空,再写入一个数据3,然后又是等待RXNE非空时,读取数据A2…以此传输下去,到最后,RXNE非空,读取数据AN,TXE也为空时,BSY位置0,关闭SPI模块;
在这里插入图片描述

这里的连续传输就是在一开始一个数据写入之后,还会继续写入一个数据,由于是同时进行传输,所以等到读取数据后又写入一个数据;
在最后会连续读取两个数据表示结束。

非连续传输

在这里插入图片描述
一开始写入一个数据1,接着会等待TXE为空时,此时读取一个数据A1,接着会等待RXNE非空时,再写入数据2,以此类推。
在这里插入图片描述

对于写入的数据,等待TXE为空后,本来可以再写入一个数据,但是在这种模式是读取一个数据,等到RXNE非空时,再写入数据;
你会发现,在标志位后本来是做出对应的事件,但是这种方式却是选择等待,也就是传输的数据是不连续的。

硬件SPI读写W25Q64

这里的接线方式和试验方法和软件读写是一致的,只是将MySPI.进行改装。

#include "stm32f10x.h"                  // Device header

//片选电平
void MySPI_W_SS(uint8_t Byte)
{
    GPIO_WriteBit(GPIOA,GPIO_Pin_4,(BitAction)Byte);
}


//初始化
void MySPI_Init()
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //上拉输入
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    SPI_InitTypeDef SPI_InitStructure;
    SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_128; //设置SCK时钟波特率分频值
    SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;//指定哪个边沿开始捕获
    SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low; //低边沿为常态
    SPI_InitStructure.SPI_CRCPolynomial=7; //CRC设置值,默认值为7
    SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;//传输数据大小(bit)
    SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//设置双工和收发
    SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;//指定传输从低位还是高位开始
    SPI_InitStructure.SPI_Mode=SPI_Mode_Master;//主从模式
    SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;//软件设置
    SPI_Init(SPI1,&SPI_InitStructure);
    
    SPI_Cmd(SPI1,ENABLE);
    MySPI_W_SS(1);
    
}
//开始
void MySPI_Start()
{
    MySPI_W_SS(0);
}
//结束
void MySPI_Stop()
{
    MySPI_W_SS(1);
}
//交换字节
uint8_t MySPI_SwapByte(uint8_t SendByte)
{
    while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE));
    SPI_I2S_SendData(SPI1,SendByte);
    while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE));
    return SPI_I2S_ReceiveData(SPI1);
}

对于片选信号,我们用GPIO引脚表示高低电平会更加容易;
对于A5和A7引脚,由于SPI外设是GPIO口的片上外设,所以要采用复用功能;
这里SPI外设的传输是有多种模式,我们选择全双工收发模式;
高位开始低位开始传输也是可以选择的;
最后要记得要启用SPI,否则将无效;

这里的交换字节采用非连续传输的方式,我们的顺序与上面的逻辑图是相反的,是因为对于标志位,在读取和写入时会自动清除标志位,先写标志位,再写发送数据和读出数据会更加方便;

在这里说一下试验的注意事项,

对于扇区擦除,只要输入的数据在指定扇区,那么就会对那一片扇区进行擦除;
在这里插入图片描述
这是一片扇区,那么输入000000h到000FFFh的地址位,都是对该扇区的擦除;

对于测试连续写入多字节时,最多写入一页的数据,超过页尾位置的数据,会回到页首覆盖写入。
我们可以以000000h为头,那么0000FFh就是尾,(页的大小)进行测试;通过改变地址来进行验证。

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

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

相关文章

leetcode 496. 下一个更大元素 I

2023.8.28 这题提供暴力解法和单调栈法两种方法。 暴力解&#xff1a; class Solution { public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {vector<int> ans(nums1.size(),-1);for(int i0; i<nums1.size…

『FastGithub』一款.Net开源的稳定可靠Github加速神器,轻松解决GitHub访问难题

&#x1f4e3;读完这篇文章里你能收获到 如何使用FastGithub解决Github无法访问问题了解FastGithub的工作原理 文章目录 一、前言二、项目介绍三、访问加速原理四、FastGithub安装1. 项目下载2. 解压双击运行3. 运行效果4. GitHub访问效果 一、前言 作为开发者&#xff0c;会…

springMVC之拦截器

文章目录 前言一、拦截器的配置二、拦截器的三个抽象方法三、多个拦截器的执行顺序总结 前言 拦截器 一、拦截器的配置 SpringMVC中的拦截器用于拦截控制器方法的执行 SpringMVC中的拦截器需要实现HandlerInterceptor SpringMVC的拦截器必须在SpringMVC的配置文件中进行配置&…

数字化智能工厂信息化系统集成整合规划建设方案[150页word]

导读&#xff1a;原文《150页6万字数字化智能工厂信息化系统集成整合规划建设方案》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 数字化智能工厂建设方案 设备智…

大数据学习:Hive常用函数

Hive常用函数 1. Hive的参数传递 1.1 Hive命令行 查看hive命令的参数 [hadoopnode03 ~]$ hive -help语法结构: hive [-hiveconf xy]* [<-i filename>]* [<-f filename>|<-e query-string>][-S] 说明&#xff1a; -i 从文件初始化HQL。-e从命令行执行指定…

LVDS 2-port RGB 转 MIPI参数计算

有一些显示器是只给了屏幕的参数&#xff0c;屏幕输入的参数不一定&#xff0c;可能是输出的MIPI 给显示器&#xff0c;显示内部转换后是LVDS RGB&#xff0c;因此需要转换。 屏幕参数 转换为MIPI参数

当我焦虑时,我从CSDN的博主身上学到了什么?

文章目录 前言一、思考为什么会产生差距1.1 懒惰1.2 没有合理的规划学习时间 二、我该如何做&#xff1f;2.1 认真生活规律作息2.2 做事就是0和1 结语 前言 我们在学习的过程当中总会遇到一些比我们自己优秀的人&#xff0c;不论你是在更好的985或211院校学习&#xff0c;还是…

计算系统丢失CONCRT140.dll文件的四种解决方法(亲测可用)

今天&#xff0c;我将为大家分享一个关于计算机技术的问题——计算系统丢失CONCRT140.dll文件的四种解决方法。希望我的分享能够帮助到大家&#xff0c;解决你们在日常生活和工作中遇到的困扰。 CONCRT140.dll是Windows操作系统中的一个动态链接库文件&#xff0c;它包含了一些…

迅为RK3588开发板Android12 设置系统默认不锁屏

修改 frameworks/base/packages/SettingsProvider/res/values/defaults.xml 文件&#xff0c;修改为如下 所示&#xff1a; - <bool name"def_lockscreen_disabled">false</bool> <bool name"def_lockscreen_disabled">true</bool&…

Linux————LNMT搭建

一、原理 搭建一个基于Linux系统的Web服务器&#xff0c;使用Nginx作为反向代理服务器&#xff0c;Tomcat作为应用服务器&#xff0c;MySQL作为数据库服务器。 Linux操作系统 基于Linux的操作系统 Nginx Nginx是一款高性能的Web服务器和反向代理服务器&#xff0…

传承精神 缅怀伟人——湖南多链优品科技有限公司赴韶山开展红色主题活动

8月27日上午&#xff0c; 湖南多链优品科技有限公司全体员工怀着崇敬之情&#xff0c;以红色文化为引领&#xff0c;参加了毛泽东同志诞辰130周年的纪念活动。以董事长程小明为核心的公司班子成员以及全国优秀代表近70人一行专赴韶山&#xff0c;缅怀伟人毛泽东同志的丰功伟绩。…

Jenkins自动化部署-Jenkins的安装

首先我们需要安装docker 安装 yum-utils包 yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 --skip-broken 设置镜像地址 yum-config-manager \ --add-repo \ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce…

经过6年发展,NIST发布三种可以抵御量子计算机未来攻击的算法标准草案

近日&#xff0c;美国国家标准与技术研究院&#xff08;NIST&#xff09;发布了2022年选定的四种算法中的三种算法的标准草案&#xff1a;CRYSTALS–KYBER、CRYSTALS–Dilithium和SPHINCS&#xff0c;第四种算法FALCON的标准草案将在大约一年内发布。 近年关于量子计算机的研究…

302 | 异常 exception

异常处理 快捷键 CtrlAltt 一般来说&#xff0c;运行时异常可不做处理&#xff0c;因为太常见了&#xff0c;影响代码执行效率&#xff1b;而编译时异常是编译器必须处理的异常 两类异常 Error 严重错误&#xff0c;程序崩溃&#xff1a;JVM无法解决的严重问题&#xff0c;如…

SRE方法论之减少琐事

我们先回顾一下SRE的定义&#xff1a;SRE就是用软件工程的思维和方法论&#xff0c;通过设计、构建自动化工具完成以前由运维工程师手动操作的任务。所以&#xff0c;SRE要把更多的时间花费在长期项目研发上而非日常运维中的琐事。 一、什么是琐事 琐事就是运维服务中手动性的…

c++冒泡排序的动画演示+程序实现

冒泡排序&#xff08;Bubble Sort&#xff09;是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的元素列&#xff0c;依次比较两个相邻的元素&#xff0c;如果顺序&#xff08;如从大到小、首字母从Z到A&#xff09;错误就把他们交换过来。走访元素的工作是重复…

算法的影响力有多少

目录 1.什么是算法 2.算法的应用领域 3.学习算法需要掌握哪些知识 4.算法给人类带来了哪些便利 1.什么是算法 算法是一系列解决问题或执行任务的有序步骤的集合。它是一种用于描述和解决计算问题的具体方法或规则。算法由若干个明确定义的步骤组成&#xff0c;每个步骤都表…

Vue插槽实现商品列表-编辑渲染

商品列表 文章目录 商品列表核心步骤创建组件 1. MyTag组件详细步骤双击显示&#xff0c;自动聚焦失去焦点&#xff0c;隐藏输入框回显标签信息回车修修改内容&#xff0c;同时隐藏输入框 MyTable组件详细步骤1-动态的设置整个表格的数据 &#xff1a; props2-实现自定义结构-插…

飞致云及其旗下1Panel进入2023年第二季度最具成长性开源初创榜单

近日&#xff0c;知名风险投资机构Runa Capital发布了2023年第二季度ROSS指数&#xff08;Runa Open Source Startup Index&#xff09;。ROSS指数按季度汇总并公布在代码托管平台GitHub上年化增长率&#xff08;AGR&#xff09;排名前二十位的开源初创公司和开源项目。在这份名…

六款热门项目协作软件详解:解析项目管理利器

项目协作已经成为了企业、组织以及个人工作中不可或缺的一部分。通过使用项目协作软件&#xff0c;团队成员可以更加高效地协同工作&#xff0c;提高工作效率和质量。本文将介绍项目协作软件的功能和种类&#xff0c;帮助读者更好地了解这一领域的发展和应用。 "项目协作软…