搜索
bottom↓
回复: 4

w25q128间隔128地址写数据,发现超过0x4000,数据会重复多次写,什么原因?(已解决)

[复制链接]

出0入53汤圆

发表于 2020-7-8 13:12:18 | 显示全部楼层 |阅读模式
本帖最后由 zhcj66 于 2020-7-8 16:31 编辑

小弟焊接搞成了W25Q16   应该焊接Q128  答案在5楼

如题<w25q128间隔128地址写数据,发现超过0x4000,数据会重复多次写,什么原因?>

使用w25q128做了一个环形存储, 每组数据不超128个字节,因此每组的地址间隔是128,整个环形存储,设定容量为10w组数据, 因此地址是0-99,999共10w个地址,

为什么这样做呢,因为存储的数据,如果10w+1条数据时,就要把最早的那组数据覆盖成最新的,最早想用文件系统的.txt做了,经过了解,文件系统做起来效率很低,无法直接删除最早的数据(想实现需要拷贝整个文件新建再一个,删除老的,再就是w25容量不足)

存储数据部分-移植了原子的stm32f1 读写w25q128的程序, 存放在w25中的数据,存储数据地址大于0x4000 就会在大于地址-0x4000位置存储同样的数据(存储在0x4001位置 1位置也会出现相同的一组数据),不知道什么情况造成的,还特有规律

如果数据写在0x8001,会在0x4001 和0x1位置写入同样的数据,就是重复写入次数会是0x4000的整倍数

写入数据
  1. //写SPI FLASH  
  2. //在指定地址开始写入指定长度的数据
  3. //该函数带擦除操作!
  4. //pBuffer:数据存储区
  5. //WriteAddr:开始写入的地址(24bit)                                               
  6. //NumByteToWrite:要写入的字节数(最大65535)            
  7. void HRSP_W25_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)   
  8. {
  9. u32 secpos;
  10. u16 secoff;
  11. u16 secremain;          
  12. u16 i;   
  13. u8 * W25QXX_BUF;          
  14.            W25QXX_BUF=HRSP_W25_BUFFER;             
  15.         secpos=WriteAddr/4096;//扇区地址  
  16.         secoff=WriteAddr%4096;//在扇区内的偏移
  17.         secremain=4096-secoff;//扇区剩余空间大小   
  18.         printf("addr:%X\r\n",WriteAddr);//测试用
  19.         if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//不大于4096个字节
  20.         while(1)
  21.         {       
  22.                 HRSP_W25_Read(W25QXX_BUF,secpos*4096,4096);//读出整个扇区的内容
  23.                 for(i=0;i<secremain;i++)//校验数据
  24.                 {
  25.                         if(W25QXX_BUF[secoff+i]!=0XFF)break;//需要擦除            
  26.                 }
  27.                 if(i<secremain)//需要擦除
  28.                 {
  29.                         HRSP_W25_Erase_Sector(secpos);                //擦除这个扇区
  30.                         for(i=0;i<secremain;i++)                           //复制
  31.                         {
  32.                                 W25QXX_BUF[i+secoff]=pBuffer[i];               
  33.                         }
  34.                         HRSP_W25_Write_NoCheck(W25QXX_BUF,secpos*4096,4096);//写入整个扇区  

  35.                 }else HRSP_W25_Write_NoCheck(pBuffer,WriteAddr,secremain);//写已经擦除了的,直接写入扇区剩余区间.                                   
  36.                 if(NumByteToWrite==secremain)break;//写入结束了
  37.                 else//写入未结束
  38.                 {
  39.                         secpos++;//扇区地址增1
  40.                         secoff=0;//偏移位置为0          

  41.                            pBuffer+=secremain;                                  //指针偏移
  42.                         WriteAddr+=secremain;                                //写地址偏移          
  43.                            NumByteToWrite-=secremain;                        //字节数递减
  44.                         if(NumByteToWrite>4096)secremain=4096;//下一个扇区还是写不完
  45.                         else secremain=NumByteToWrite;                //下一个扇区可以写完了
  46.                 }         
  47.         };         
  48. }
复制代码


读出数据
  1. //读取SPI FLASH  
  2. //在指定地址开始读取指定长度的数据
  3. //pBuffer:数据存储区
  4. //ReadAddr:开始读取的地址(24bit)
  5. //NumByteToRead:要读取的字节数(最大65535)
  6. void HRSP_W25_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)   
  7. {
  8.         u16 i;                                                                                       
  9.         HRSP_W25_CS(0);                                    //使能器件   
  10.     SD_SPIx_ReadWriteByte(W25X_ReadData);                 //发送读取命令   
  11.     SD_SPIx_ReadWriteByte((u8)((ReadAddr)>>16));          //发送24bit地址   
  12.     SD_SPIx_ReadWriteByte((u8)((ReadAddr)>>8));   
  13.     SD_SPIx_ReadWriteByte((u8)ReadAddr);   
  14.     for(i=0;i<NumByteToRead;i++)
  15.         {
  16.         pBuffer[i]=SD_SPIx_ReadWriteByte(0XFF);           //循环读数  
  17.     }
  18.         HRSP_W25_CS(1);                                                   
  19. }
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出16170入6148汤圆

发表于 2020-7-8 13:53:50 来自手机 | 显示全部楼层
打赏!

庆祝论坛“打赏”功能实施, 现在开始发技术主题,可以获得打赏
https://www.amobbs.com/thread-5735948-1-1.html

出0入442汤圆

发表于 2020-7-8 14:32:21 来自手机 | 显示全部楼层
确定你用的是正品的w25q128?如果只有0x4000有效,那你的片子是w25q32兼容的,不是128。

出0入0汤圆

发表于 2020-7-8 15:06:34 | 显示全部楼层
spi nor flash 写的时候要注意跨页写操作  比如从地址255开始写2个字节  第二个字节会跑到地址0  而不是256

出0入53汤圆

 楼主| 发表于 2020-7-8 16:16:14 | 显示全部楼层
本帖最后由 zhcj66 于 2020-7-8 16:32 编辑
wye11083 发表于 2020-7-8 14:32
确定你用的是正品的w25q128?如果只有0x4000有效,那你的片子是w25q32兼容的,不是128。 ...


谢谢你的提醒,焊接pcb的小帅哥竟然给我焊接成了W25Q16  

w25q16  16*1024*1024/8/128=16384=0x4000 得到了完美的解释
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 01:05

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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