|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2017-2-18 14:11:57
|
显示全部楼层
/****************************************Copyright (c)**************************************************
********************************************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include <USE.h>
#include "W25Q256.h"
#include <string.h>
//**********************************************************************************************
#define Nf0 0xffffffff
#define Nf1 Nf0,Nf0,Nf0,Nf0,Nf0,Nf0,Nf0,Nf0,Nf0,Nf0,Nf0,Nf0,Nf0,Nf0,Nf0,Nf0 //16个=16*4=64个字节
#define Nf2 Nf1,Nf1,Nf1,Nf1,Nf1,Nf1,Nf1,Nf1,Nf1,Nf1,Nf1,Nf1,Nf1,Nf1,Nf1,Nf1 //16*(16*4)=1024 字节
#define BYTE_1K (1024)
#define BYTE_4K (1024*4)
#define BYTE_512 (1024/2)
//**********************************************************************************************
extern unsigned int FAT_Wr_Flash(unsigned int byteAddr,unsigned char *p,unsigned int byteCnt);
extern unsigned int FAT_Rd_Flash(unsigned int byteAddr,unsigned char *p,unsigned int byteCnt);
extern unsigned int FAT_Erase_Flash(unsigned int sectorAddr);
extern void Clr_RTC_ram_flag(void);
//extern FLASH_INFO FLASH_info;
//**********************************************************************************************
//设置一个4K的0XFF空间
const unsigned int MASK_FF[]={
Nf2,Nf2,Nf2,Nf2
};
//-------------------------------------------------------------------------------------------------------
//磁盘的信息读出!
unsigned int W25Q256_FS_Read_MSG(unsigned int *ser,unsigned int *rd_len,unsigned int *wr_len,unsigned int *sectCnt ){
*ser =0x01222 ;
*rd_len =512; //固定不变
*wr_len =512; //固定不变
*sectCnt =(W25Q256_MAX_SECTORS-SST_OFFSET_SECTOR)*8; //计算扇区的个数; //计算扇区的个数( 1个物理扇区=4096==8个文件扇区!)
return 1;
}
//**********************************************************************************************
//文件系统操作读 传入=SECT(扇区512个字节),CNT=扇区的个数;考虑跨页读和跨快读
unsigned int W25Q256_FS_Rd_Sect(unsigned int sect,unsigned char *buf,unsigned int cnt){
FAT_Rd_Flash(sect<<9,buf,cnt<<9); //从芯片的物理256扇区(256*4=1M)开始读数据】】
return 0;
}
//**********************************************************************************************
static unsigned char st25_buf[4096];// 缓存!
//*******************************************************************************************************
//对指定一个扇区的写入
//sect=物理扇区地址,OFFSET=物理地址偏移量,CNT是字节数!!
//返回=文件扇区数 cnt
unsigned int W25Q256_ONE_Sector_Wr(unsigned int sect,unsigned offset,unsigned char *buf,unsigned int cnt){
unsigned char *p;
p=st25_buf; //备份数据到ram
FAT_Rd_Flash(sect<<12,p,4096); //全部读出来。
if(memcmp(&p[offset],buf,cnt)){ //数据不相等就要比较是否为0XFF!
if(memcmp(&p[offset],(unsigned char *)MASK_FF,cnt)){ //数据不是0XFF!
memcpy(&p[offset],buf,cnt); //写入数据到BUFF。
FAT_Erase_Flash(sect); //删除对应的物理扇区 不是字节地址 4K
FAT_Wr_Flash(sect<<12,p,4096);//写一个文件扇区4096字节
}else{//扇区里的内容是0xff可以直接写。
FAT_Wr_Flash((sect*4096 + offset),buf,cnt);//写一个文件扇区512字节
}
}
return cnt/512; //返回文件扇区数量!
}
//**********************************************************************************************
//文件系统操作写 传入=SECT(文件扇区512个字节),CNT=扇区的个数;//从芯片的物理256扇区(256*4=1M)开始读数据】】
//=1 有错误;=0 OK
unsigned int W25Q256_FS_Wr_Sect(unsigned int sect,unsigned char *buf,unsigned int cnt){
unsigned int n,Sect,offset; //Sect=物理地址4K扇区;sect=文件扇区512字节
n=0;//文件扇区的个数
while(1){
buf +=n*512; //缓存地址增加
Sect =(n+sect)/8; //确定地址,除以8 ,是4K一个扇区! //从芯片的物理256扇区(256*4=1M)开始读数据】】
offset=(n+sect) % 8; //物理扇区内的文件扇区偏移量!
n=8-offset; //单物理扇区内的剩余文件扇区的个数:0-8
if(cnt>n){
n=W25Q256_ONE_Sector_Wr(Sect,offset*512,buf,n*512);
cnt -=n;
}else{
n=W25Q256_ONE_Sector_Wr(Sect,offset*512,buf,cnt*512);
break;
}
}
return 0;
}
/*
static unsigned char buft[4096];
//测试FLASH
void TestFlash_OK(void){
unsigned int i,err=0;
memset(buft,0xa5,4096);
for(i=0;i<W25Q256_MAX_SECTORS;i++){
W25Q256_Erase_Sector(i);
W25Q256_Page_Read(i*4096,st25_buf,4096);
if(memcmp(st25_buf,(unsigned char *)MASK_FF,4096)){
err++;
}else{
W25Q256_Page_Program(i*4096,buft,4096);
W25Q256_Page_Read(i*4096,st25_buf,4096);
if(memcmp(st25_buf,buft,4096)){
err++;
}
}
}
}
*/
|
|