|
本帖最后由 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的整倍数
写入数据
- //写SPI FLASH
- //在指定地址开始写入指定长度的数据
- //该函数带擦除操作!
- //pBuffer:数据存储区
- //WriteAddr:开始写入的地址(24bit)
- //NumByteToWrite:要写入的字节数(最大65535)
- void HRSP_W25_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
- {
- u32 secpos;
- u16 secoff;
- u16 secremain;
- u16 i;
- u8 * W25QXX_BUF;
- W25QXX_BUF=HRSP_W25_BUFFER;
- secpos=WriteAddr/4096;//扇区地址
- secoff=WriteAddr%4096;//在扇区内的偏移
- secremain=4096-secoff;//扇区剩余空间大小
- printf("addr:%X\r\n",WriteAddr);//测试用
- if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//不大于4096个字节
- while(1)
- {
- HRSP_W25_Read(W25QXX_BUF,secpos*4096,4096);//读出整个扇区的内容
- for(i=0;i<secremain;i++)//校验数据
- {
- if(W25QXX_BUF[secoff+i]!=0XFF)break;//需要擦除
- }
- if(i<secremain)//需要擦除
- {
- HRSP_W25_Erase_Sector(secpos); //擦除这个扇区
- for(i=0;i<secremain;i++) //复制
- {
- W25QXX_BUF[i+secoff]=pBuffer[i];
- }
- HRSP_W25_Write_NoCheck(W25QXX_BUF,secpos*4096,4096);//写入整个扇区
- }else HRSP_W25_Write_NoCheck(pBuffer,WriteAddr,secremain);//写已经擦除了的,直接写入扇区剩余区间.
- if(NumByteToWrite==secremain)break;//写入结束了
- else//写入未结束
- {
- secpos++;//扇区地址增1
- secoff=0;//偏移位置为0
- pBuffer+=secremain; //指针偏移
- WriteAddr+=secremain; //写地址偏移
- NumByteToWrite-=secremain; //字节数递减
- if(NumByteToWrite>4096)secremain=4096;//下一个扇区还是写不完
- else secremain=NumByteToWrite; //下一个扇区可以写完了
- }
- };
- }
复制代码
读出数据
- //读取SPI FLASH
- //在指定地址开始读取指定长度的数据
- //pBuffer:数据存储区
- //ReadAddr:开始读取的地址(24bit)
- //NumByteToRead:要读取的字节数(最大65535)
- void HRSP_W25_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)
- {
- u16 i;
- HRSP_W25_CS(0); //使能器件
- SD_SPIx_ReadWriteByte(W25X_ReadData); //发送读取命令
- SD_SPIx_ReadWriteByte((u8)((ReadAddr)>>16)); //发送24bit地址
- SD_SPIx_ReadWriteByte((u8)((ReadAddr)>>8));
- SD_SPIx_ReadWriteByte((u8)ReadAddr);
- for(i=0;i<NumByteToRead;i++)
- {
- pBuffer[i]=SD_SPIx_ReadWriteByte(0XFF); //循环读数
- }
- HRSP_W25_CS(1);
- }
复制代码 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|