完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
一、序言
序言对这篇文章进行一个总体的说明: 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引脚会一直在下降沿输出数据。 4、写状态寄存器(01h) 这个地方需要读者回过头看我系列文章2,有关寄存器的内容,这里我附上链接 SPI Flash芯片W25Q32英文版数据手册解读(二)---------存储器知识,寄存器. 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的,程序正确性,规范性,可读性更好,可以快速调用,方便二次开发。 当然在程序编写过程中有些程序没能验证成功,想了很久没有解决,包括给出的程序也不敢保证能完全正确,请有经验的读者给予指导。 |
|
|
|
只有小组成员才能发言,加入小组>>
4509个成员聚集在这个小组
加入小组3334 浏览 0 评论
航顺(HK)联合电子发烧友推出“近距离体验高性能Cortex-M3,免费申请价值288元评估板
4262 浏览 1 评论
4289 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 20:08 , Processed in 0.678581 second(s), Total 74, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号