SPI Flash芯片W25Q32英文版数据手册解读(三)---------程序编写,电路应用

一、序言

序言对这篇文章进行一个总体的说明:

1、这部分是根据手册写程序,因此采用手册截图+程序截图的形式,对图片不进行标号,而且对重点部分进行颜色标注。

2、考虑到很多读者(包括我),使用手机看文章方便,因此程序部分我采用截图的形式,需要完整的全部程序私信我。

3、这是我自己根据手册写的程序,力求程序的规范和可读性,但是难免有错误之处,不敢完全保证程序都是正确的,因此请读者批评指正,找到问题及时和我交流。而且针对芯片比较偏的应用没有给出程序,只是具备基础的函数模块,方便对芯片进行扩展应用时调用。其中芯片模式这块,受已有电路的限制,不给出Quad SPI的模式有关的程序。

4、此程序适用于STC单片机模拟SPI的情况,对于硬件SPI的程序,以及其他单片机,可参考编写思路,后续可能会针对STM32或者DSP进行硬件SPI的研究。

5、针对一些程序编写的技巧和优化,有机会会给出相关总结的文章,这里程序有关读写的部分,大部分写成单字节的操作,多字节的扩展程序没有给出的,读者可自行编写。

6、这里对芯片的电气特性不做考虑,只对实际电路给出参考,后续有机会自制电路板成功以后给出详细的介绍。

二、模拟SPI通信程序

SPI时序很简单,这部分直接给出程序。下面指令相关的程序,涉及到SPI的读写的,只需要调用这部分函数即可。

SPI.h文件

在这里插入图片描述

SPI.c文件

在这里插入图片描述
在这里插入图片描述

三、指令

指令简介

在这里插入图片描述

指令共同的特点是:在 /CS=0后,再开始传输数据,只有当8位的数据都传输完成以后,让 /CS=1,该指令才有效。此外,如果在进行”编程”、“擦除”、 “写状态寄存器”时,除了读状态寄存器指令,其他指令只有当上述操作完成以后才能进行。

指令表

先给出2章指令表,结合表格,根据每一个指令的具体操作给出详细解释和对应的程序编写。
在这里插入图片描述

在这里插入图片描述

W25Q32.c包含以下指令的函数:
1、 写使能-----Write Enable (06h)

在这里插入图片描述

写使能指令,是控制状态寄存器的WEL位(写使能位)自动置1,必须在“页编程”、“扇区擦除” 、“块擦除”、 “芯片擦除”、 “写状态寄存器”这些指令之前写该指令,该指令在 /CS = 0时开始等待指令的写入,数据在 CLK上升沿锁存,数据传输完成以后, /CS = 1,这样写使能指令写入,允许写。关于 /CS的时序问题,后面指令跟这个一样,就不赘述了。

在这里插入图片描述

2、写禁止-----Write Disable (04h)

在这里插入图片描述

写禁止指令,是控制状态寄存器的WEL位(写使能位)复位为0。在“芯片启动”、“页编程”、“扇区擦除” 、“块擦除”、 “芯片擦除”、 “写状态寄存器”这些操作完成后,WEL位自动复位为0,禁止写。因此,下面的程序最开始保险起见都加一个写使能,我没加的地方读者可以自行添加。

在这里插入图片描述

3、读状态寄存器 (05h,35h)

在这里插入图片描述

读状态寄存器一次只能读8位,因此有两个指令分别读两个寄存器。当读指令写完之后,数据立马会在DO上输出,在 CLK下降沿的时候输出。该指令,可以在任何时候都可以使用,即使在”编程”、“擦除”、 “写状态寄存器”指令在执行过程中,这样就可以随时读状态寄存器,根据BUSY(忙位)来判断上述指令有没有执行完,可不可以读取下一个指令。而且只要 /CS没有被拉高,DO引脚会一直在下降沿输出数据。
这个地方我个人觉得读状态寄存器应用不是很多,由于我个人写的程序是模块化的,严格按照时序,所以不存在在一个指令写入的时候插入这个指令的情况,唯一能想到应用的地方就是用读写寄存器函数做一个自收发的验证,确保读写程序是正确的。可以编写下面这个语句,在程序的最后等待指令执行完成,或者是排除干扰写入:
while(W25Q32_Read_Status()&0x01)

在这里插入图片描述

4、写状态寄存器(01h)

在这里插入图片描述

这个地方需要读者回过头看我系列文章2,有关寄存器的内容,这里我附上链接 SPI Flash芯片W25Q32英文版数据手册解读(二)---------存储器知识,寄存器.
由此不难知道哪几个引脚可以进行写,之前也说了,我买的模块 /WP引脚直接接VCC了,而且状态寄存器保护位也基本用不着,因此,整个状态寄存器的写入这块,只有5位涉及块保护需要配置,分别为SECTBBP2BP1BP0,也就是只需要写状态寄存器1的值就行,具体写入什么数值,参考上面链接,有关真值表有详细介绍。
根据手册截图:当给寄存器1写入数值以后,对应块保护的地方,只能读数据,不能写数据。

在这里插入图片描述

5、读数据/快速读----- (03h,0Bh)

在这里插入图片描述

读数据指令允许从内存中再按顺序读取一个数据字节。/CS=0,读指令通“03h”写入后,接着写入数据的24位地址(这个地方要对字节执行拆分程序),根据指令表,快速读就是多了一条空指令,接着在时钟下降沿输出数据,如果输出一个数据以后 /CS没有被拉高,会自动读取下一个地址的数据,这意味着可以用一条指令访问整个内存。
读数据指令不是读状态寄存器指令,因此不可以插入进其他指令。

在这里插入图片描述

6、页编程(02h)

在这里插入图片描述

页编程,也就是对一页写入数据,在写入之前需要执行擦除操作(擦除程序见下面)并且要在开头执行写使能程序,再写入指令、24位地址,再写入数据。写完一页以后,最后一个地址需要写成0。如果写入字节小于一页的字节,即256,时钟长度不能超过后面剩余页的字节的数量。如果写入字节大于256,会自动跳转到一页的最开头覆盖数据。最后拉高 /CS
如果写入的页已经受保护了,该页写指令无效。

在这里插入图片描述

7、擦除(D8,52,20,C7/60)

这部分程序跟前面的指令类似,参考指令无非就是先 /CS=0,写入指令和地址 /CS=1,直接给出程序,以指令D8为例。

在这里插入图片描述

8、芯片ID读取(AB,90,9F,4B)

在这里插入图片描述

该芯片的ID号和生产号如上图,根据指令表,共有四种读取ID的方式,而且对应读取的ID长度不一样,程序依然跟前面写过的程序一样,先 /CS=0,写入指令,读出数据 /CS=1。这里以指令AB为例,给出程序。其他读者自行编写。

在这里插入图片描述

W25Q32.h

在这里插入图片描述

测试程序

在这里插入图片描述

指令程序总结:

1、对于其他未给出的指令程序,读者可自行根据需要,参考上面的程序思路,编写其他指令,比较关键的点就是多字节的读取。

2、关于测试程序,可以采用LED,数码管显示,串口显示等方法验证程序,比如读取ID,可以采用自写自读的方法测试。

3、如果发现程序没问题但达不到效果,可以考虑删除或添加写使能函数,或者是用while函数对BUSY位进行判断,也可以单步调试。当然还有可能是硬件连接的问题。

4、针对STC的52系列的单片机,使用串口验证读写程序的时候,设定的数据长度不能太大,不然会超过内部RAM的大小。使用指针的时候,最好自己给指针赋地址,最好赋在用户区,避免和一些寄存器混在一起,我赋的地址是30H开头的。

以上是我在测试程序的时候用到的方法和一些问题,可能每个人情况不一样,仅供参考。

四、电路连接

电路连接可以参考该系列第一篇文章的原理图,不过需要注意的是,该芯片电源是3.3V,STC89C52是5V的,中间需要电平转换电路,IO口需要漏极开路,因此我采用的是P0口,常见的是上拉电阻,见下图参考电路及参数。3.3V的电源需要有一个三端稳压器件输出直流3.3V。

在这里插入图片描述

五、结尾

这一个系列的文章到这里算是差不多结束了,学习一个新的芯片,经历了很多,收获了很多:

1、如何找相关的有用的文章:首先要掌握这个系列芯片的命名,知道自己用的是哪一个芯片,是W25Q32,还是W25Q16,还是W25Q128;是基于什么处理器的,STC89C52,还是STM32,还是STC8,还是FPGA,还是DSP。因为在索引文章的时候,这些关键字很重要,有的时候就搜W25Q32,基于51单片机,可能就搜不到W25Q16,基于STC8单片机的文章了,导致覆盖面小,找不到那些隐藏的好文章,其实什么型号不重要,重要的是能找到关于这一类的一篇对自己有用的文章。

2、这次基本上完全自主研究了一种芯片,以后学其他芯片,可以直接调用底层的一些函数,结合文档看,学的更快,但需要这一次的经历,来掌握学习的方法,明确更多的东西。如果是需要整个芯片的详细配套程序,最好还是用STM32单片机,淘宝和主流的程序大多是STM32的,程序正确性,规范性,可读性更好,可以快速调用,方便二次开发。

当然在程序编写过程中有些程序没能验证成功,想了很久没有解决,包括给出的程序也不敢保证能完全正确,请有经验的读者给予指导。

最后附上该系列的前两篇文章。
SPI Flash芯片W25Q32英文版数据手册解读(一)---------引脚功能,工作模式

SPI Flash芯片W25Q32英文版数据手册解读(二)---------存储器知识,寄存器

  • 18
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值