1.背景
前面刚刚分析了EEPROM,那就顺带把SPIFLASH写了吧,器件性质,SPI的通信过程我就不过多分析了,网上讲的都非常详细了。这次我以W25Q32来介绍了
2.读取器件信息
对于FLASH来说读取器件地址是0x90,我们先发送0x90
之后的三个数据是没用的。
而最后两位是有用信息
其中EF代表制造商是华邦,15代表容量32Mb
3.擦除扇区
芯片一共有三种擦除方式:擦除扇区,擦整块,擦两块和全片擦除,而flash最明显的特点就是在写入前必须先擦除对应扇区。下面我就介绍擦除扇区,也是最常用的擦除,其他几种擦除也大同小异。
这是实际擦除扇区的波形
想进行擦除先发送0x20,表示擦除扇区
后面是三个地址。
这里地址是怎么分配的,和芯片内部原理有关系,我就过多赘述了,大家想找可以去网上找。
4.擦除扇区等待
与EEPROM一样擦除扇区也是需要时间的,同样有两种方法,这里我也都介绍一下
4.1方法一
读取寄存器
在flash芯片内部有一个状态寄存器,其中s0是判忙寄存器,当芯片处于写入和读取未完成时这一位会变1。
向芯片发送0x05即可读取
实际波形如下
4.2方法二
等!
数据手册上给出的擦除一个扇区的典型时间是45ms,最长是400ms
这里我等待了50ms
4.3总结
我在实际使用的时候是两种方案结合,即在等待50ms后再读取一次状态寄存器如果芯片不忙再进行下一步。
5.扇区写入
在写入前我还是重申一下请一定保证已经擦除扇区了,这时flash的特性决定的
首先我们需要先进行写入使能即写入0x06
之后是扇区写入了
先发送0x02写入命令,然后是三位地址,后面接数据。这里不要写超了,flash内部如一本书一样,每本书上由很多页纸组成,当写入数据量超过一页纸就会又从纸顶部开始写起,这样数据就会产生覆盖的情况。这里我就不再过多赘述了,想了解的还是请上网搜索。
最后注意一下,扇区写入后也需要时间
手册上给出的时间是0.4ms到3ms
我还是建议延迟加读状态寄存器结合来判忙
6.读取
读取和写入的过程差不多,不过不用写入使能了。
先发送0x03,然后三位地址,后面就是从机发送的数据
7.总结
总的来说spiflash的操作比eeprom复杂的多,不过spiflash的用途比eeprom用的多的多,从嵌入式到电脑都有应用,在高端的场景还有qspiflash甚至直接挂载到总线上,还是非常建议大家充分理解上述的过程。