如何用好flash这本书?——SPI读写W25Q64逻辑解读

SPI FLASH W25Q64
小白爱32
发布时间: 2019-06-19
阅读: 3367

如何用好flash这本书?——SPI读写W25Q64逻辑解读

     各位朋友好,今天给大家讲的是读写一本书的事情,这本书的名字叫flash

     首先flash具体是什么东西呢,就是相当于你电脑的硬盘(常见容量500G-1T),手机的内存(常见32G-64G),它的作用就是用来存储MCU的一些参数。我这里把它称作一本书,是因为不管它的作用和管理方式,都像我们读写书籍一样的道理。你想记录的事情可以写入这本书中,这就叫做“写flash”,当然你哪天想查看一些事情,也可以翻开找到书中的内容,找到你想要的记录,这就叫做“读flash

     想要读写好flash,重点要做好以下两点:第一 是要读好你操作的flash的时序,即用好它的datasheet,第二 是理明白读写的逻辑,很多初学者可能会栽倒在稍微复杂的读写逻辑中

     下面先以W25Q16 (64M-BIT SERIAL FLASH MEMORY) 的一些时序图为例,帮各位梳下它的时序,我这篇文章主要介绍flash的读写,SPI基础就不再详细介绍。

     现在直接进入正题,先来看一个简单的,如何写使能,即下图中的“write enable”。   

 1.png

        注意上图英文标注的一句话,大体翻译过来就是首先将CS片选引脚拉低,然后通过DI引脚发送1个字节的指令06h,最后将CS片选拉高,代码就下面这么简单。

2.png

 

         flash基本的时序都是类似的道理,下面再看一个复杂一点的,读取FLASH Device ID

 3.png


     从前往后看,首先CS拉低,DI口给flash发送ABh指令,另外紧接着发送3个空字节+1个空字节, 写第四个空字节的同时,flash DO口返回1个字节的device ID数据,至此读取结束。对应代码如下,我们定义的是一个有返回值无入口参数的函数,函数内容直接按照上边的时序进行。

5.png

    好了,时序大体带各位了解到这里,当然这个flash还有好多个操作函数,以下的操作指令都可以通过阅读手册中类似上面的时序图来完成,包括PageProgramflash单页写入的函数,这个大家可以自己来尝试写一下,为下面我们正式的读写逻辑做准备。另外下图是W25Q64的一些指令操作函数,我们可以按照需求来写。

6.png

 

      从以下开始介绍的是我当初学习时的一个难点,读写逻辑,因为可能对初学者都不好理解,我准备以图片的形式展开介绍。

      想了解读写逻辑,要先了解flash的大体存储原理,文章开头我就把flash比喻为一本书,我们写入数据的时候和写一本书的道理是一致的。大家都知道平时阅读的书中分为好多页,每一页又分为行和列等,这一行和列标定的位置假定为flash中的地址,每一页就是flash中的页“page”,W25Q64每一页大小为256个字节,就比如书中每一页有256个方格,我们写这本书的话,肯定是先有一个写的开头位置,即起始地址,写完一页的256个方格,再写下一页的方格,一页一页的来。读的话也是同样的道理,你要知道从哪里开始读,读到第几页的具体哪个位置完成你的阅读任务。

      首先说写入的函数,根据以上逻辑,我们先定义下这个flash写入的函数,定义函数类型为void型,函数有三个入口参数,一个是要写入的数据指针,一个是要写入flash的首地址,最后一个是写入的字节大小。即void SPI_FLASH_BufferWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite)

页面分析.png

      然后定义完这个函数,我们就要准备开始写入了,写入之前先确定几个事情,以上图中页面为例,flash写入开始位置分为1,2位置这种从每页的首位置写入,这种方式叫做“地址对齐”方式写入,还有一种是非首位置写入的类似3,4,5位置的写入。

      另外我们按照上边介绍的时序已经有单页写入的函数了,我们还要确定要写入的数据有多少整数页,剩余不满一页的是多少,方便我们使用单页写入的函数一页一页的写入。

      因此我们定义了四个变量,来进行前边四种情况的判断:

     u8 NumOfPage = 0, //要写入的页数

     NumOfSingle = 0,//剩余单页的字节数

            Addr = 0, //判断是否地址对齐

            count = 0,//判断剩余多少个字节就能够地址对齐

     根据函数入口参数,以及每页256个字节,大家也能想明白上面四个变量如何计算得到了

     Addr = WriteAddr % 256;

     count = 256 - Addr;

     NumOfPage = NumByteToWrite / 256;

     NumOfSingle = NumByteToWrite % 256;

 

     下面我们这个写flash函数编写基本就是用这四个变量来判断,要写入的具体情况:开始写入的地址对齐但是数据量不满一页的如何写,超过1页以上的如何写。地址不对齐的但是写入数据不满一页的如何写......按照这个思路,我们就能写出完整的写flash的函数了。具体我以之前整理的一个程序流程图的形式给各位呈现。

 程序流程图.png

 


    对照以上流程图,如果你还不能写出这个写flash的函数,建议你对照我举例的页面图,也就是上面带有1,2,3,4,5的图示,具体分析,最终一定能够成功。

    好了,以上写flash的函数介绍完毕,那么读flash呢又是何种逻辑呢?读flash是不需要按照分页来读的,只需要知道起始地址和读取的字节数,一个字节接着一个字节的数据读出就可以了,具体参考W25Q64的数据手册,大家可以自行完成。当然今后面对逻辑稍微有些复杂一些的函数,尽量通过图形和流程图的的方式来理解,这样常常可以事半功倍。

    今天以复习的方式写这样一篇文章,方便初学者及时理解flash操作的逻辑,少走弯路,如有不足之处,请多多指教,今后我还会有更多的内容和各位电子爱好者一起分享学习,谢谢大家!


原创作品,未经权利人授权禁止转载。详情见转载须知 举报文章

点赞 (1)
打赏
当前打赏0人    
小白爱32
评论(0)

登录后可评论,请 登录注册

相关文章推荐
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回

我要举报该内容理由

×
请输入您举报的理由(50字以内)
App