w25n01g 代码_W25N01

//WriteAddr:开始写入的地址(24bit)

//NumByteToWrite:要写入的字节数(最大65535)

u8 W25QXX_BUFFER[4096];

void W25QXX_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)

{

u32 secpos;  //定义要擦除的删区

u32 secoff;

u32 secremain;

u32 i;

u8 * W25QXX_BUF;

W25QXX_BUF=W25QXX_BUFFER;

secpos=WriteAddr/4096*16*2;//扇区地址

secoff=WriteAddr%4096*16*2;//在扇区内的偏移

secremain=4096*16*2-secoff;//扇区剩余空间大小

printf("ad:%X,nb:%X\r\n",WriteAddr,NumByteToWrite);//测试用

if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//不大于4096个字节

while(1)

{

W25QXX_Read(W25QXX_BUF,secpos*4096*16*2,4096*16*2);//读出整个扇区的内容

for(i=0;i

{

if(W25QXX_BUF[secoff+i]!=0XFF)break;//需要擦除

}

if(i

{

W25QXX_Erase_Sector(secpos);                //擦除这个扇区

for(i=0;i

{

W25QXX_BUF[i+secoff]=pBuffer[i];

}

W25QXX_Write_NoCheck(W25QXX_BUF,secpos*4096*16*2,4096*16*2);//写入整个扇区

}else W25QXX_Write_NoCheck(pBuffer,WriteAddr,secremain);//写已经擦除了的,直接写入扇区剩余区间.

if(NumByteToWrite==secremain)break;//写入结束了

else//写入未结束

{

secpos++;//扇区地址增1

secoff=0;//偏移位置为0

pBuffer+=secremain;                                  //指针偏移

WriteAddr+=secremain;                                //写地址偏移

NumByteToWrite-=secremain;                        //字节数递减

if(NumByteToWrite>4096*16*2)secremain=4096*16*2;//下一个扇区还是写不完

else secremain=NumByteToWrite;                //下一个扇区可以写完了

}

};

}

2018-5-24 15:30 上传

点击文件名下载附件

1.14 MB, 下载次数: 109

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值