一、硬件
二、W25Q64简介与API函数
1)
W25Q有很多系列,其区别就是存储容量不一样
以我现在使用的举例W25Q64
64指的是64Mbit,不是64M字节要区分清楚
64Mbit = 8Mbyte,所以总的容量能存储8MByte
2)
W25q64的存储分为块、扇区、页
一页:256Byte 一个扇区:16页 = 4096Byte 一块:16个扇区;总共是32块
3)写注意事项
Flash的写的有个特性跟EEPROM一样,就是它的一页是256个Byte,也就是在写入的时候,一次最多可以写入256个字节的数据,超过了需要自行在代码中处理,一次最多编程256字节,写超的话会对当前页的前面数据进行覆盖。
4)读
读有没有像写这样我没去研究过,我直接使用跟写一样的方法,一旦跨页进行判断处理
5)檫除注意事项
由图片可知,檫除最小单位是扇区檫除,不能单独檫除页,所以你在使用时要合理分配空间,将相同数据分配在同一个扇区,如果跨扇区你在檫除就比较麻烦,因为它不能以页檫除
综上就是我使用遇到值得注意的问题,至于驱动代码时序我没记录了,很多博主开源了很多
下面是我在读写中做的跨页代码
#define PAGE_SIZE 256u//页空间256Byte
void WriteParamBlock(uint32_t pBlock,uint8_t *pData,uint16_t Len)
{
uint16_t j,temp;
int num = (pBlock%PAGE_SIZE)+Len;
num = num - PAGE_SIZE;//是否需要“跨”页写
if(num<1) //当页可以写完
{
FlashSpiPageProgram(pBlock,pData,Len);
}
else //跨页
{
while(Len)
{
temp = PAGE_SIZE-(pBlock%PAGE_SIZE);//确定当页可写的数量,最大256字节
if(Len>=temp)
{
FlashSpiPageProgram(pBlock,pData,temp);
pData += temp;
Len -= temp;
pBlock += temp;
}
else if(Len<temp)
{
FlashSpiPageProgram(pBlock,pData,Len);
pData += Len;
Len -= Len;
pBlock += Len;
}
}
}
}void ReadParamBlock(uint32_t pBlock,uint8_t *pData,uint16_t Len)
{
uint16_t j,temp;
int num = (pBlock%PAGE_SIZE)+Len;
num = num - PAGE_SIZE;//是否需要“跨”页读
if(num<1) //当页可以读取完
{
FlashSpiRead(pBlock,pData,Len);
pData += Len;
}
else //跨页
{
while(Len)
{
temp = PAGE_SIZE-(pBlock%PAGE_SIZE);//确定当页可读的数量,最大256字节
if(Len>=temp)
{
FlashSpiRead(pBlock,pData,temp);//将此页读取完
pData += temp;
Len -= temp;
pBlock += temp;
}
else if(Len<temp)
{
FlashSpiRead(pBlock,pData,Len);//将此页读取完
pData += Len;
Len -= Len;
pBlock += Len;
}
}}