STM32--硬件读写W25Q64

声明:我是跟着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写东西才会触发时序的生成。如果不发送,只调用接收函数,那时序是不会动的。

到这里程序就改完了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值