首页 > 其他分享 >STM32--硬件读写W25Q64

STM32--硬件读写W25Q64

时间:2024-08-31 19:24:48浏览次数:12  
标签:初始化 引脚 -- 硬件 W25Q64 时序 STM32 SPI 外设

声明:我是跟着B站江科大的视频的学习过程中记录下来作者的文案,记录下来是为了方便自己日后复习。如果你也是跟着江科大的视频学习的,可以一起学习。

我把其中一些白话进行了修改,并且添加了自己的一些理解。我只有一些pyhon基础,所以可能有错误,学起来也比较吃力,就把自己的一些理解加上去了,方便大家有和我一样没有基础的人进行学习,如果有不对的地方欢迎指正

硬件SPI的接线图和上一节软件SPI的接线图一致,硬件引脚不能随便接,要参考芯片的引脚定义图。

要使用SPI1,就要接在这些引脚。其中NSS可以用软件模拟的方式进行实现,所以NSS没有必要继续接在PA4,其他三个引脚必须接在PA5/6/7。

使用SPI2,就要接在这些引脚。

此外,SPI1还可以重定义,如果PA4/5/6/7这几个引脚被占用了,可以重定义PB3/4/5和PA15这四个引脚使用SPI1。其中PA15、PB3/4这几个引脚没有被加粗,这是因为默认情况下他们是作为JTAG的调试端口使用的。如果要使用原本的GPIO功能,或者要使用重定义的外设引脚功能,都需要先解除调试端口的复用,否则GPIO和外设引脚都不能正常工作

我们需要做的就是修改低层的MySPI.c文件,把初始化和时序的执行步骤由软件实现改成硬件实现,最后基于通信层的业务代码W25Q64.c不需要进行任何更改,因为这些部分只是调用低层的通信函数来实现功能。

对于SS引脚还是使用软件模拟,所以留着,其他三个引脚使用硬件,删掉即可。

之后MySPI初始化这里也可以全部删掉,换成SPI外设初始化。

然后交换字节函数里的内容先删掉。写SPI外设操作时序,完成交换一个字节的流程。

将SPI初始化的流程分为几步:

第一步,开启时钟,开启SPI和GPIO的时钟,

第二步,初始化GPIO口,其中SCK和MOSI是由硬件外设控制的输出信号,所以配置为复用推挽输出;MISO是硬件外设的输入信号,配置为上拉输入,因为输入设备可以有多个,所以不存在复用输入这个东西;SS是软件控制的输出信号,所以配置为通用的推挽输出;

第三步,配置SPI外设,使用一个结构体选参数即可;调用SPI_Init(),比如8位/16位数据帧,高位/低位先行,SPI模式几,主机还是从机等等。

第四步,开关控制,SPI_Cmd()。

初始化之后参考这个时序,来执行运行控制的代码。

用到的函数就是写DR、读DR、获取状态标志位等等。

然后开始正式写代码。

将初始化代码进行修改。

PA4引脚接了SS,所以配置为通用推挽输出;

PA5和PA7引脚接了MOSI和SCK,是由片上外设输出,所以配置为复用推挽输出;

PA6引脚接了MISO,配置为上拉输入。

然后初始化SPI外设,

最后一句使能SPI外设。

然后再给SS高电平,默认不选择从机。

然后再来完成交换字节函数。

当我们调用这个函数时,硬件的SPI外设会自动控制SCK、MOSI、MISO这三个引脚来生成时序。

通常分为4步:

1、等待TXE为1,发送寄存器为空,如果发送寄存器不为空,就先不着急写。这个循环只要SPI外设电路不损坏,基本上不会一直处于卡死状态。因为只要TDR有数据,他就会自动转到移位寄存器开始发送,过一会就会发完了,不受外部电路影响。

2、软件写入数据至SPI_DR,写入ByteSend之后,自动转入移位寄存器,一旦移位寄存器有数据了,时序波形就会自动产生,这个波形生成,不需要我们再调用额外的函数。我们只管写入数据到TDR,之后转移到移位寄存器,生成波形。然后ByteSend这个数据就会通过MOSI一位一位地移出去,在MOSI这条线上就会自动产生发送的时序波形。由于是非连续传输,所以在时序传输的过程中,不必提前将数据放在TDR里。

3、在发送的同时,还会进行接收,等接收数据完成后,意味着发送移位也完成了。接收移位完成会收到一个字节的数据,这时RXNE=1。

4、读取DR,从RDR里将交换的数据读取出来,

总共4步,交换一个字节的程序就写完了。

注意:硬件SPI必须是发送同时接收,要想接收,必须得先发送,只有给TDR写东西才会触发时序的生成。如果不发送,只调用接收函数,那时序是不会动的。

到这里程序就改完了。

标签:初始化,引脚,--,硬件,W25Q64,时序,STM32,SPI,外设
From: https://blog.csdn.net/m0_61593113/article/details/141757028

相关文章

  • STM32学习笔记,SPI通信协议(理论部分)
    SPI通信和I2C通信差不多,两个协议的目的都一样,都是实现主控芯片和各种外挂芯片之间的数据交流;有了数据交流的能力,主控芯片就可以挂载并操纵各式各样的外部芯片,来实现一个功能更强大的控制系统;课程安排与I2C通信一样,先学习SPI协议的软硬件规定;先用软件模拟的SPI,实现读写W25Q64......
  • Linux简单介绍(3)
    六、Linux的Shell脚本编程(重要)6.1shell的简介6.1shell的简介        shell其实指的是shell环境,是软件和OS之间的通信接口(软件的执行操作可以被shell翻译成OS识别的指令,从而进行调度硬件进行工作)。shell相对于os是独立的接口,linux上有多种shell接口,比如/bin/sh,/......
  • Altium Design设置原理图图纸大小
    点击原理图右下角Panels选项,选择Properties打开在Properties界面可以对图纸单位,图纸大小,方向,边缘尺寸等进行调整图纸模版包括:模型图纸:  A0_portrait~A4_portrait公制图纸:A0~A4英制图纸:A~ECAD标准图纸: A~EOrCAD标准图纸:Orcad_a~ Orcad_e其他格式......
  • 《高等代数》范德蒙德行列式的证明
    说明:此文章用于本人复习巩固,如果也能帮助到大家那就更加有意义了。注:1)利用数学归纳法证明范德蒙德行列式。    2)将范德蒙德行列式最后一列除了“1”以外都化为“0”,再按照最后一列展开。   3)为了与题目所证的公式靠拢,将连乘里面的两个x位置调换,使得用下标大的x......
  • 2024-08-31:用go语言,给定一个数组apple,包含n个元素,每个元素表示一个包裹中的苹果数量;
    2024-08-31:用go语言,给定一个数组apple,包含n个元素,每个元素表示一个包裹中的苹果数量;另一个数组capacity包含m个元素,表示m个不同箱子的容量。有n个包裹,每个包裹内装有指定数量的苹果,以及m个箱子,每个箱子的容量不同。任务是将这n个包裹中的所有苹果重新分配到箱子中,最小化所需的箱子......
  • 绳结的相对强度表
    绳结的相对强度绳结强度别名备注无张力结(No-Knot)100%TensionlessHitch八字结(Figure-8)75%-80%单八字结,FlemishKont,SavoyKnot,FigureofEightKnot布林结(Bowline)70%-80%帆索结,称人结,单套结,BolingKnot,BowlingKnot,StandingBowline蝴蝶结(Butterfly)70%-75%阿......
  • 9.1 CANYONING TECHNIQUE: SWIMMING
    Content9.1SWIMMINGOVERVIEWWATCHTHEVIDEOLESSONYoucanlaterreviewthecontentontheeBookbelow.DEFENSIVESWIMMINGPOSITIONACTIVESWIMMINGPOSITIONSUMMARY9.1SWIMMINGOVERVIEWSwimminginadeeppoolOneofthecoreskills......
  • 讲解如何用C语言实现带头单向单链表
    目录链表的结构组成:链表的常用接口:初始化带头单链表的头指针:动态申请一个结点(用于后续数据的插入):单链表打印:单链表尾插:单链表的头插:单链表的尾删:单链表头删:单链表查找符合值的第一个节点,没找到时返回NULL:单链表在pos位置之后插入x:单链表删除pos位置之后的值......
  • windows系统安装配置Apache Maven
    Date:2024.07.1709:45:10author:lijianzhan电脑环境:win10系统Java开发环境:JDK21Mvn:apache-maven-3.9.9maven下载地址:https://maven.apache.org/download.cgi点击链接进入ApacheMaven官网,选择apache-maven-3.9.9-bin.zip进行下载。下载maven安装包apac......
  • js变量命名的规则和规范
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=d......