a15818662231的个人空间 https://www.eechina.com/space-uid-139581.html [收藏] [复制] [RSS]

博客

华邦FLASH

已有 783 次阅读2018-9-1 10:25 |个人分类:华邦| 华邦驱动

芯片手册关键地方是指令模块,尤其要参考时序

怎么读数据:一条指令  一个地址 一个变量buff  就可以了,没有保护

注意地址的位数

怎么写数据:写数据不许去除写保护,获得权限。

以下重点讲怎么写:

u32 secpos;
u16 secoff;
u16 secremain;    
  u16 i;    
u8 * W25QXX_BUF;   
    W25QXX_BUF=W25QXX_BUFFER;      
  secpos=WriteAddr/4096;//扇区地址  
secoff=WriteAddr%4096;//在扇区内的偏移
secremain=4096-secoff;//扇区剩余空间大小   
  //printf("ad:%X,nb:%X\r\n",WriteAddr,NumByteToWrite);//测试用
  if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//不大于4096个字节

while(1) 
{
W25QXX_Read(W25QXX_BUF,secpos*4096,4096);      //读出整个扇区的内容
for(i=0;i<secremain;i++)                                          //校验数据
{
if(W25QXX_BUF[secoff+i]!=0XFF)break ;            //需要擦除    
}
if(i<secremain)//需要擦除
{
W25QXX_Erase_Sector(secpos); //擦除这个扇区
for(i=0;i<secremain;i++)     //复制
{
W25QXX_BUF[i+secoff]=pBuffer[i]; //这条语句的目的是把buf中的小于scremain的数据复制写入芯片中  
}
W25QXX_Write_NoCheck(W25QXX_BUF,secpos*4096,4096);//写入整个扇区  


}else W25QXX_Write_NoCheck(pBuffer,WriteAddr,secremain);//写已经擦除了的,直接写入扇区剩余区间. //注意writeadrr 和secpos的区别      由于上一个是擦除了一整片所以地址从头开始  而后面的不用擦除所以地址保留不变;    
if(NumByteToWrite==secremain)break;//写入结束了
else//写入未结束
{
secpos++;//扇区地址增1
secoff=0;//偏移位置为0  


    pBuffer+=secremain;  //指针偏移
WriteAddr+=secremain; //写地址偏移    

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


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
返回顶部