Flash芯片W25Q系列驱动注意事项以及跨页读写操作

2023-12-27 18:47:25

一、硬件?

二、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;
?? ??? ??? ??? ?}
?? ??? ??? ?}

}

文章来源:https://blog.csdn.net/qq_38295600/article/details/135251540
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。