embed\vs2008_ucos\bsp\bspm25p16.h.c bspm25p32.h.c--模拟M25P16\32读写

/****模拟2M M25P16储存器供针对FATFS的接口****/
/*****************************************************************************************
                            模拟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);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值