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

本文详细介绍了W25Q64闪存存储器的结构、容量划分、写入与读取操作的注意事项,特别是跨页处理的代码示例,以及擦除时的最小单元是扇区。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、硬件 

二、W25Q64简介与API函数 

1)

W25Q有很多系列,其区别就是存储容量不一样

以我现在使用的举例W25Q64

64指的是64Mbit,不是64M字节要区分清楚

64Mbit = 8Mbyte,所以总的容量能存储8MByte

2)

W25q64的存储分为块、扇区、页

一页:256Byte  一个扇区:16页 = 4096Byte  一块:16个扇区;总共是128块

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;
                }
            }

}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值