/*****************************************************************************************
模拟EE储存器提供针对FATFS的接口
文 件:bspm25p16.h
功 能:使用windows模拟EEPROM
环 境:VS2008
编 者:张永辉 2013年5月28日
*****************************************************************************************/
#ifndef __BSPM25P16_H_
#define __BSPM25P16_H_
#include "\embed\source\lib\basetype.h"
/*****************************************************************************************
函数声明
*****************************************************************************************/
void BspM25P16Test(void);
void BspM25P16Init(void);
u32 BspM25P16PageSizeGet(void);
u32 BspM25P16SectorSizeGet(void);
u32 BspM25P16SectorConutGet(void);
void BspM25P16Clear(u8 ch);
u32 BspM25P16SectorWrites(u8* Buffer,u32 SectorNumber,u8 SectorCount);
u32 BspM25P16SectorReads (u8* Buffer,u32 SectorNumber,u8 SectorCount);
u32 BspM25P16PageWrites256(u8* Buffer,u32 PageNumber);
//****************************************************************************************
#endif
/*****************************************************************************************
windows 模拟M25P16
文件:bspm25p16.c
环境:vs2008
M25P16 固件特点
总大小:2M*8bit = 2M字节
构成:8个扇区,每个扇区256页,每页256字节。即每个扇区512Kbit=64K字节
写入:一次写入可以是1--256字节。即不能跨页写。
擦除:一次可以擦除一个扇区,或整个器件。(所以需要64k字节缓冲器)
总结:在内存很小的机器上跑,使用文件系统,建议只读即可。 写入
经验:文件系统
M25P16_SECTOR_SIZE == _MAX_SS 才能成功
建议:使用文件系统时,在单片机上不要开启写入操作。
编者:张永辉 根据rom.c bspeeprom.c修改而来 2013年5月28日
*****************************************************************************************/
#include <windows.h>
#include <process.h>
#include "stdio.h"
#include "\embed\source\lib\basetype.h"
#include "bspm25p16.h" //#include "\embed\vs2008_ucos\bsp\bspm25p16.h"
//====低层函数====
//****************************************************************************************
//参数配置 可以根据具体芯片来设置
#define M25P16_PAGE_SIZE (256) //一个页的大小。一次写入的最大字节数。
//#define M25P16_SECTOR_SIZE (256*256) //扇区的大小 可擦除块大小
#define M25P16_SECTOR_SIZE (512) //==_MAX_SS 文件系统会成功
#define M25P16_SIZE (2*1024*1024) //总容量 4M字节 器件固定大小
#define filename "\\embed\\vs2008_ucos\\bsp\\m25p16rom.bin"
//内部函数声明
void static RomTest(void);
void static RomInit(void);
u32 static RomSizeGet(void);
u32 static RomRead (unsigned int eeaddr,unsigned char* Buffer,unsigned int len);
u32 static RomWrite(unsigned int eeaddr,unsigned char* Buffer,unsigned int len);
/*****************************************************************************************
测试函数
*****************************************************************************************/
void BspM25P16Test(void)
{
u8 a[M25P16_SECTOR_SIZE];
u8 b[M25P16_SECTOR_SIZE];
u32 i;
BspM25P16Init();
i = 0;
for(i=0;i<M25P16_SECTOR_SIZE;i++)
{
a[i] = i;
}
BspM25P16SectorWrites(a,0,1);
BspM25P16SectorReads (b,0,1); //若同时有其他软件打开有可能失败(经验)
//此时若b==a 则测试成功
}
/*****************************************************************************************
初始化
*****************************************************************************************/
void BspM25P16Init(void)
{
RomInit();
//这2个值必须相等,即容量必须相同才行
//#if EEROM_SIZE!= ROM_SIZE
// error("EEROM_SIZE != ROM_SIZE !!!!");
//#endif
}
/*****************************************************************************************
获取一些规定参数
*****************************************************************************************/
//获取一个页大小
u32 BspM25P16PageSizeGet(void)
{ return M25P16_PAGE_SIZE;
}
//获取扇区大小
u32 BspM25P16SectorSizeGet(void)
{ return M25P16_SECTOR_SIZE;
}
//获取扇区数
u32 BspM25P16SectorConutGet(void)
{ return (M25P16_SIZE/M25P16_SECTOR_SIZE);
}
/*****************************************************************************************
读写函数
*****************************************************************************************/
//使用给定值初始化整个储存区。
void BspM25P16Clear(u8 ch)
{
u8 Buffer[M25P16_SECTOR_SIZE];
u32 i;
//将整个储存器写入0 文件系统才能被识别(经验)
for(i=0;i<M25P16_SECTOR_SIZE;i++)
{
Buffer[i]=ch;
}
for(i=0;i<M25P16_SIZE/M25P16_SECTOR_SIZE;i++)
{
BspM25P16SectorWrites(Buffer,i,1);
}
}
//按扇区写入
u32 BspM25P16SectorWrites(u8* Buffer,u32 SectorNumber,u8 SectorCount)
{
u32 addr;
u32 len;
addr = M25P16_SECTOR_SIZE * SectorNumber;
len = M25P16_SECTOR_SIZE * SectorCount;
RomWrite(addr,Buffer,len);
return 0;
}
//按扇区读出
u32 BspM25P16SectorReads(u8* Buffer,u32 SectorNumber,u8 SectorCount)
{
u32 addr;
u32 len;
addr = M25P16_SECTOR_SIZE * SectorNumber;
len = M25P16_SECTOR_SIZE * SectorCount;
RomRead(addr,Buffer,len);
return 0;
}
//按页(0开始)写入 固定大小,写入256字节
//为从电脑下载EEPROM镜像恩准备的函数
u32 BspM25P16PageWrites256(u8* Buffer,u32 PageNumber)
{
u32 addr;
u32 len;
addr = 256 * PageNumber;
len = 256;
RomWrite(addr,Buffer,len);
return 0;
}
//========================================================================================
//底层直接读写函数
//========================================================================================
/*****************************************************************************************
测试
*****************************************************************************************/
void static RomTest(void)
{
char a[]="abc4567890";
char b[100];
RomInit();
RomWrite(0,a,10);
RomWrite(10,a,10);
RomRead(0,b,22);
}
/*****************************************************************************************
获取ROM大小
*****************************************************************************************/
u32 static RomSizeGet(void)
{
return M25P16_SIZE;
}
/*****************************************************************************************
rom读出数据
参数:eeaddr 0--INT_MAX
Buffer 装载数据指针
len 读出的长度
返回:成功读到的数目
*****************************************************************************************/
u32 static RomRead(unsigned int eeaddr,unsigned char* Buffer,unsigned int len)
{
FILE *fp;
//读写打开,不存在则失败
fopen_s(&fp,filename,"rb+");
if(fp==NULL)
{
return 0;
}
//超出范围则
if(eeaddr>=M25P16_SIZE)
{
return 0;
}
if((eeaddr + len) >= M25P16_SIZE)
{
len = M25P16_SIZE - eeaddr;
}
//设置位置fseek(文件,要到的文件位置,起始位置)
fseek(fp,eeaddr,0);
fread(Buffer,1,len,fp); //读出数据
fclose(fp);
return len;
}
/*****************************************************************************************
rom写入数据
参数:eeaddr 0--INT_MAX
Buffer 写入数据指针
len 要写入的长度
返回:成功写入的个数
*****************************************************************************************/
u32 static RomWrite(unsigned int eeaddr,unsigned char* Buffer,unsigned int len)
{
FILE *fp;
//读写打开,不存在则失败
fopen_s(&fp,filename,"rb+");
if(fp==NULL)
{
return 0;
}
if(eeaddr>=M25P16_SIZE) //超出范围
{
return 0;
}
if((eeaddr + len) >= M25P16_SIZE)
{
len = M25P16_SIZE - eeaddr;
}
//设置位置fseek(文件,要到的文件位置,起始位置)
fseek(fp,eeaddr,0);
fwrite(Buffer,1,len,fp); //写入数据
fclose(fp);
return len;
}
/*****************************************************************************************
rom初始化
初 始 化:若文件存在并且大小与预期相符,则直接返回。
若文件不存在,或大小不相符则新建文件,并初始化其内容。
说 明:此函数总能执行成功。
*****************************************************************************************/
void static RomInit(void)
{
FILE *fp;
u32 i;
char tmp[10];
fopen_s(&fp,filename,"rb"); //文件不存在,则打开失败
if(fp!=NULL)
{
//则判断文件大小
fseek (fp,0,SEEK_END);
i = ftell(fp);
if(i==M25P16_SIZE)
{
//大小相符,直接返回。
fclose(fp);
return;
}
//大小不等则删除文件。然后创建并初始化文件
fclose(fp);
remove(filename);
}
Sleep(10);
//不存在文件则新建二进制文件
fopen_s(&fp,filename,"wb"); //打开失败原因之一是:文件路径写法有问题
if(fp==NULL)
{
return; //文件打开失败
}
//初始化1页的数据 全写入0XFF
tmp[0]=0xFF;
//写入N页
for(i=0;i<M25P16_SIZE;i++)
{
fwrite(tmp,1,1,fp);
}
fclose(fp);
}
/****模拟4M M25P32储存器供针对FATFS的接口****/
/*****************************************************************************************
模拟EE储存器提供针对FATFS的接口
文 件:bspm25p32.h
功 能:使用windows模拟EEPROM
环 境:VS2008
编 者:张永辉 2013年5月28日
*****************************************************************************************/
#ifndef __BSPM25P32_H_
#define __BSPM25P32_H_
#include "\embed\source\lib\basetype.h"
/*****************************************************************************************
函数声明
*****************************************************************************************/
void BspM25P32Test(void);
void BspM25P32Init(void);
u32 BspM25P32PageSizeGet(void);
u32 BspM25P32SectorSizeGet(void);
u32 BspM25P32SectorConutGet(void);
void BspM25P32Clear(u8 ch);
u32 BspM25P32SectorWrites(u8* Buffer,u32 SectorNumber,u8 SectorCount);
u32 BspM25P32SectorReads (u8* Buffer,u32 SectorNumber,u8 SectorCount);
u32 BspM25P32PageWrites256(u8* Buffer,u32 PageNumber);
//****************************************************************************************
#endif
/*****************************************************************************************
windows 模拟M25P32
文件:bspm25p32.c
环境:vs2008
M25P32 固件特点
总大小:4M*8bit = 4M字节==4194304字节
构成:16个扇区,每个扇区256页,每页256字节。即每个扇区512Kbit=64K字节
写入:一次写入可以是1--256字节。即不能跨页写。
擦除:一次可以擦除一个扇区,或整个器件。(所以需要64k字节缓冲器)
总结:在内存很小的机器上跑,使用文件系统,建议只读即可。 写入
经验:文件系统
M25P32_SECTOR_SIZE == _MAX_SS 才能成功
建议:使用文件系统时,在单片机上不要开启写入操作。
编者:张永辉 根据rom.c bspeeprom.c修改而来 2013年5月28日
*****************************************************************************************/
#include <windows.h>
#include <process.h>
#include "stdio.h"
#include "\embed\source\lib\basetype.h"
#include "bspm25p32.h" //#include "\embed\vs2008_ucos\bsp\bspm25p32.h"
//====低层函数====
//****************************************************************************************
//参数配置 可以根据具体芯片来设置
#define M25P32_PAGE_SIZE (256) //一个页的大小。一次写入的最大字节数。
//#define M25P32_SECTOR_SIZE (256*256) //扇区的大小 可擦除块大小
#define M25P32_SECTOR_SIZE (512) //==_MAX_SS 文件系统会成功
#define M25P32_SIZE (4*1024*1024) //总容量 4M字节 器件固定大小
#define filename "\\embed\\vs2008_ucos\\bsp\\m25p32prom.bin"
//内部函数声明
void static RomTest(void);
void static RomInit(void);
u32 static RomSizeGet(void);
u32 static RomRead (unsigned int eeaddr,unsigned char* Buffer,unsigned int len);
u32 static RomWrite(unsigned int eeaddr,unsigned char* Buffer,unsigned int len);
/*****************************************************************************************
测试函数
*****************************************************************************************/
void BspM25P32Test(void)
{
u8 a[M25P32_SECTOR_SIZE];
u8 b[M25P32_SECTOR_SIZE];
u32 i;
BspM25P32Init();
i = 0;
for(i=0;i<M25P32_SECTOR_SIZE;i++)
{
a[i] = i;
}
BspM25P32SectorWrites(a,0,1);
BspM25P32SectorReads (b,0,1); //若同时有其他软件打开有可能失败(经验)
//此时若b==a 则测试成功
}
/*****************************************************************************************
初始化
*****************************************************************************************/
void BspM25P32Init(void)
{
RomInit();
//这2个值必须相等,即容量必须相同才行
#if EEROM_SIZE!= ROM_SIZE
error("EEROM_SIZE != ROM_SIZE !!!!");
#endif
}
/*****************************************************************************************
获取一些规定参数
*****************************************************************************************/
//获取一个页大小
u32 BspM25P32PageSizeGet(void)
{ return M25P32_PAGE_SIZE;
}
//获取扇区大小
u32 BspM25P32SectorSizeGet(void)
{ return M25P32_SECTOR_SIZE;
}
//获取扇区数
u32 BspM25P32SectorConutGet(void)
{ return (M25P32_SIZE/M25P32_SECTOR_SIZE);
}
/*****************************************************************************************
读写函数
*****************************************************************************************/
//使用给定值初始化整个储存区。
void BspM25P32Clear(u8 ch)
{
u8 Buffer[M25P32_SECTOR_SIZE];
u32 i;
//将整个储存器写入0 文件系统才能被识别(经验)
for(i=0;i<M25P32_SECTOR_SIZE;i++)
{
Buffer[i]=ch;
}
for(i=0;i<M25P32_SIZE/M25P32_SECTOR_SIZE;i++)
{
BspM25P32SectorWrites(Buffer,i,1);
}
}
//按扇区写入
u32 BspM25P32SectorWrites(u8* Buffer,u32 SectorNumber,u8 SectorCount)
{
u32 addr;
u32 len;
addr = M25P32_SECTOR_SIZE * SectorNumber;
len = M25P32_SECTOR_SIZE * SectorCount;
RomWrite(addr,Buffer,len);
return 0;
}
//按扇区读出
u32 BspM25P32SectorReads(u8* Buffer,u32 SectorNumber,u8 SectorCount)
{
u32 addr;
u32 len;
addr = M25P32_SECTOR_SIZE * SectorNumber;
len = M25P32_SECTOR_SIZE * SectorCount;
RomRead(addr,Buffer,len);
return 0;
}
//按页写入
u32 BspM25P32PageWrites256(u8* Buffer,u32 PageNumber)
{
u32 addr;
u32 len;
addr = 256 * PageNumber;
len = 256;
RomWrite(addr,Buffer,len);
return 0;
}
//========================================================================================
//底层直接读写函数
//========================================================================================
/*****************************************************************************************
测试
*****************************************************************************************/
void static RomTest(void)
{
char a[]="abc4567890";
char b[100];
RomInit();
RomWrite(0,a,10);
RomWrite(10,a,10);
RomRead(0,b,22);
}
/*****************************************************************************************
获取ROM大小
*****************************************************************************************/
u32 static RomSizeGet(void)
{
return M25P32_SIZE;
}
/*****************************************************************************************
rom读出数据
参数:eeaddr 0--INT_MAX
Buffer 装载数据指针
len 读出的长度
返回:成功读到的数目
*****************************************************************************************/
u32 static RomRead(unsigned int eeaddr,unsigned char* Buffer,unsigned int len)
{
FILE *fp;
//读写打开,不存在则失败
fopen_s(&fp,filename,"rb+");
if(fp==NULL)
{
return 0;
}
//超出范围则
if(eeaddr>=M25P32_SIZE)
{
return 0;
}
if((eeaddr + len) >= M25P32_SIZE)
{
len = M25P32_SIZE - eeaddr;
}
//设置位置fseek(文件,要到的文件位置,起始位置)
fseek(fp,eeaddr,0);
fread(Buffer,1,len,fp); //读出数据
fclose(fp);
return len;
}
/*****************************************************************************************
rom写入数据
参数:eeaddr 0--INT_MAX
Buffer 写入数据指针
len 要写入的长度
返回:成功写入的个数
*****************************************************************************************/
u32 static RomWrite(unsigned int eeaddr,unsigned char* Buffer,unsigned int len)
{
FILE *fp;
//读写打开,不存在则失败
fopen_s(&fp,filename,"rb+");
if(fp==NULL)
{
return 0;
}
if(eeaddr>=M25P32_SIZE) //超出范围
{
return 0;
}
if((eeaddr + len) >= M25P32_SIZE)
{
len = M25P32_SIZE - eeaddr;
}
//设置位置fseek(文件,要到的文件位置,起始位置)
fseek(fp,eeaddr,0);
fwrite(Buffer,1,len,fp); //写入数据
fclose(fp);
return len;
}
/*****************************************************************************************
rom初始化
初 始 化:若文件存在并且大小与预期相符,则直接返回。
若文件不存在,或大小不相符则新建文件,并初始化其内容。
说 明:此函数总能执行成功。
*****************************************************************************************/
void static RomInit(void)
{
FILE *fp;
u32 i;
char tmp[10];
fopen_s(&fp,filename,"rb"); //文件不存在,则打开失败
if(fp!=NULL)
{
//则判断文件大小
fseek (fp,0,SEEK_END);
i = ftell(fp);
if(i==M25P32_SIZE)
{
//大小相符,直接返回。
fclose(fp);
return;
}
//大小不等则删除文件。然后创建并初始化文件
fclose(fp);
remove(filename);
}
Sleep(10);
//不存在文件则新建二进制文件
fopen_s(&fp,filename,"wb"); //打开失败原因之一是:文件路径写法有问题
if(fp==NULL)
{
return; //文件打开失败
}
//初始化1页的数据 全写入0XFF
tmp[0]=0xFF;
//写入N页
for(i=0;i<M25P32_SIZE;i++)
{
fwrite(tmp,1,1,fp);
}
fclose(fp);
}