ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU

[STM8] W25 Flash数据读写错误

[复制链接]
170|10
 楼主 | 2018-11-9 18:34 | 显示全部楼层 |阅读模式
使用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. }  
复制代码


| 2018-11-9 18:58 | 显示全部楼层
擦除/写入是需要时间的,可以查询状态来检查芯片是否完成了操作。
 楼主 | 2018-11-9 19:00 | 显示全部楼层
jekey 发表于 2018-11-9 18:58
擦除/写入是需要时间的,可以查询状态来检查芯片是否完成了操作。

我上面贴的程序都有读忙检测的while(W25_Read_Busy());
 楼主 | 2018-11-10 12:27 | 显示全部楼层
有哪位大神知道,可能是哪里产生的问题么?
| 2018-11-10 17:15 | 显示全部楼层
flash 写入数据前需要擦除
| 2018-11-11 20:21 | 显示全部楼层
不是先擦除再写吗
 楼主 | 2018-11-12 12:44 | 显示全部楼层
因为定义不了4096这么大的数组,所以采用分开读取,但是读取完成修改数据之后怎么写入呢,如果分开写入,写一次之后就只能擦除再写,那分开的数据包就会被覆盖,整体写入,定义不了那么大数组,纠结啊
| 2018-11-12 12:59 | 显示全部楼层
好像是一段一段的擦除
 楼主 | 2018-11-12 13:27 | 显示全部楼层
磨砂 发表于 2018-11-12 12:59
好像是一段一段的擦除

最少擦除4K
| 2018-11-12 15:26 | 显示全部楼层
擦除 是按页擦除的
写之前 必须擦除

这个就是不如 EEROM 简单的地方了!
| 2018-11-13 11:35 | 显示全部楼层
直接写肯定不行,要擦再写。好像擦除的过程就是往里面写1.
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

快速回复 返回顶部 返回列表