STM8L W25Q16Flash数据读取错误

2019-07-14 16:06发布

使用STM8L芯片、W25Q16Flash,先将要存储的扇区1数据读出放入备用扇区0,将数据修改后,再讲修改的数据和备用扇区0的数据,存回扇区1,但是存储的过程中,要么数据存不进去,要么存入的数据有问题,请各位帮忙看下是什么问题?
  1. void Write_Admin_Passord(uc *p,uc passordNum)
  2. {

  3.         ui i,n;

  4.         uc flashBuffer[256];
  5.         
  6.         W25q16_Erasure(0);
  7.         
  8.         for(n = 0;n < 16;n++)
  9.         {
  10.                 W25Q16_Read(4096+n*256,flashBuffer,256);
  11.                
  12.                 W25Q16_Write(n*256,flashBuffer,256);
  13.         }

  14.         W25q16_Erasure(1);

  15.         W25Q16_Read(4096,flashBuffer,256);
  16.         
  17.         for(i = 0;i < passordNum;i++)
  18.                 flashBuffer[i] = p[i];
  19.                
  20.         W25Q16_Write(4096,flashBuffer,256);
  21.         
  22.         for(n = 1;n < 16;n++)
  23.         {
  24.                 W25Q16_Read(n*256,flashBuffer,256);
  25.                
  26.                 W25Q16_Write(4096+n*256,flashBuffer,256);               
  27.         }

  28. }
复制代码
  1. void W25Q16_Write(ul address,uc *data,ui j)
  2. {
  3.     ui i;
  4.     while(W25_Read_Busy());        

  5.         W25_Write_Enable();
  6.         
  7.     W25_CS_ENABLE();
  8.         
  9.     W25_SPI_Write(0x02);
  10.     W25_SPI_Write(address>>16);
  11.     W25_SPI_Write(address>>8);
  12.     W25_SPI_Write(address);
  13.         
  14.     for(i = 0;i < j;i++)
  15.     {
  16.         W25_SPI_Write(*(data+i));
  17.     }
  18.         
  19.     W25_CS_DISABLE();
  20. }
  21. /*===============================================================
  22.         *功能说明:W25 读数据
  23.         *传入参数:地址、数据、个数
  24.         *返回参数:无
  25. =================================================================*/
  26. void W25Q16_Read(ul address,uc *data,ui j)
  27. {
  28.     ui i;
  29.         
  30.     while(W25_Read_Busy());
  31.         
  32.     W25_Write_Enable();

  33.         W25_CS_ENABLE();
  34.         
  35.     W25_SPI_Write(0x03);
  36.     W25_SPI_Write(address>>16);
  37.     W25_SPI_Write(address>>8);
  38.     W25_SPI_Write(address);
  39.         
  40.     for(i = 0;i < j;i++)
  41.     {
  42.         *(data+i) = W25_SPI_Read();
  43.     }
  44.         
  45.     W25_CS_DISABLE();
  46. }

  47. void W25q16_Erasure(ul Dst_Addr)
  48. {
  49.         Dst_Addr *= 4096;
  50.         
  51.         W25_Write_Enable();        
  52.         
  53.         while(W25_Read_Busy());
  54.         
  55.         W25_CS_ENABLE();
  56.         
  57.         W25_SPI_Write(0x20);                 
  58.         
  59.         W25_SPI_Write((uc)((Dst_Addr)>>16));
  60.         W25_SPI_Write((uc)((Dst_Addr)>>8));         
  61.         W25_SPI_Write((uc)Dst_Addr);        
  62.         
  63.         W25_CS_DISABLE();
  64.                  
  65.         while(W25_Read_Busy());
  66. }


  67. ui SPI_Flash_ReadID(void)
  68. {
  69.         ui Temp = 0;  

  70.         W25_Write_Enable();

  71.         W25_CS_ENABLE();
  72.         
  73.         W25_SPI_Write(0x90);//发送读取ID命令   
  74.         
  75.         W25_SPI_Write(0x00);   
  76.         W25_SPI_Write(0x00);   
  77.         W25_SPI_Write(0x00);
  78.         
  79.         Temp |= W25_SPI_Read()<<8;  
  80.         Temp |= W25_SPI_Read();   
  81.         
  82.         W25_CS_DISABLE();
  83.         
  84.         return Temp;
  85. }  
复制代码


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
新星之火12138
1楼-- · 2019-07-14 19:14
我上面贴的程序都有读忙检测的while(W25_Read_Busy());
新星之火12138
2楼-- · 2019-07-14 22:58
有哪位大神知道,可能是哪里产生的问题么?
riverdj
3楼-- · 2019-07-15 01:51
flash 写入数据前需要擦除
阿兵888824
4楼-- · 2019-07-15 02:41
 精彩回答 2  元偷偷看……
kingnet_520890
5楼-- · 2019-07-15 07:04
因为定义不了4096这么大的数组,所以采用分开读取,但是读取完成修改数据之后怎么写入呢,如果分开写入,写一次之后就只能擦除再写,那分开的数据包就会被覆盖,整体写入,定义不了那么大数组,纠结啊
asgfafa
6楼-- · 2019-07-15 07:49
好像是一段一段的擦除

一周热门 更多>