|
发表于 2014-4-5 16:31:20
|
显示全部楼层
/****************************************Copyright (c)**************************************************
********************************************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "SST25.h"
#include "USE.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 SST25_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 =(FLASH_info.Fat_size/512); //计算扇区的个数( 1个物理扇区=4096==8个文件扇区!)
return 1;
}
//**********************************************************************************************
//读取FLASH的文件扇区数量
unsigned int FATFS_Get_DISK_Sectors(void){
return (FLASH_info.Fat_size/512);
}
//**********************************************************************************************
//文件系统操作读 传入=SECT(扇区512个字节),CNT=扇区的个数;考虑跨页读和跨快读
unsigned int SST25_FS_Rd_Sector(unsigned int sect,unsigned char *buf,unsigned int cnt){
FAT_Rd_Flash(sect<<9,buf,cnt<<9); //从芯片的物理256扇区(256*4=1M)开始读数据】】
return 0;
}
//**********************************************************************************************
extern void SaveData_To_Ram(unsigned char *buf,unsigned int sector_cnt); //写入2个地方RAM+fw25 ,标记由对方程序写入
//*******************************************************************************************************
//对指定一个扇区的写入
//sect=物理扇区地址,OFFSET=物理地址偏移量,CNT是字节数!!
//返回=文件扇区数 cnt
unsigned int SST25_ONE_Sector_Wr(unsigned int sect,unsigned offset,unsigned char *buf,unsigned int cnt){
unsigned char *p;
p=Set_RTC_RAM(); //备份数据到rtc-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。
SaveData_To_Ram(buf,sect); //写入2个地方RAM+fw25 ,标记由对方程序写入
FAT_Erase_Flash(sect); //删除对应的物理扇区 不是字节地址 4K
FAT_Wr_Flash(sect<<12,p,4096);//写一个文件扇区4096字节
//*************************************************************
//清楚标记!!!
Clr_RTC_ram_flag();
}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 SST25_FS_Wr_Sector(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=SST25_ONE_Sector_Wr(Sect,offset*512,buf,n*512);
cnt -=n;
}else{
n=SST25_ONE_Sector_Wr(Sect,offset*512,buf,cnt*512);
break;
}
}
return 0;
}
|
|