声明:我是跟着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