第一单片机

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6536|回复: 18

MC96F内部FLASH模拟EEPROM参考代码

[复制链接]
发表于 2015-1-6 16:27:32 | 显示全部楼层 |阅读模式
#include "Global.h"

#define EEP_START_ADDR         0x3FA0

uchar eep_buf[32];

uchar xdata flash_buffer[32] _at_ 0x8000;

code uchar eep_buffer[32] _at_ EEP_START_ADDR;

void MC96F_Erase(uint addr)
{
        uchar i;

        FMCR = 0x01;
        NOP;
        NOP;
        NOP;
        for(i = 0; i < 32; i++)
        {
                flash_buffer[i] = 0;       
        }

        FSADRH = 0;
        FSADRM = (uchar)(addr >> 8);
        FSADRL = (uchar)(addr & 0xFF);
        FIDR = 0xA5;
        FMCR = 0x02;
        NOP;
        NOP;
        NOP;
}

void MC96F_Program(uint addr,uchar *dat_buf)
{
        uchar i;
        FMCR = 0x01;
        NOP;
        NOP;
        NOP;

        for(i = 0; i< 32; i++)
        {
                flash_buffer[i] = dat_buf[i];       
        }

        FSADRH = 0;
        FSADRM = (uchar)(addr >> 8);
        FSADRL = (uchar)(addr & 0xFF);
        FIDR = 0xA5;
        FMCR = 0x03;
        NOP;
        NOP;
        NOP;
}

uchar EEP_ReadByte(uchar index)
{
        return eep_buffer[index];
}

uint EEP_ReadWord(uchar index)
{
        uint word;
        word = eep_buffer[index];
        word <<= 8;
        index++;
        word += eep_buffer[index];
        return word;       
}

void EEP_Init(void)
{
        if(EEP_ReadWord(0) != 0xAA55)
        {
                EEP_Save();       
                //BUZ_SHORT();               
        }       
        else
        {
                work_time = EEP_ReadWord(2);
        }       
}

void EEP_Erase(void)
{
        MC96F_Erase(EEP_START_ADDR);       
}




回复

使用道具 举报

发表于 2015-1-7 14:02:28 | 显示全部楼层
你好,想问一下,这个针对MC96F6432的怎么不行呢?有没有可以的例子啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-7 20:21:24 | 显示全部楼层
EEP_START_ADDR          地址需要根据芯片型号修改 定义到末尾的最后一个扇区的起始地址
回复 支持 反对

使用道具 举报

发表于 2015-1-9 18:41:25 | 显示全部楼层
谢谢,是可以啦,但是我写了一个写一个字的,每次写低位的时候,低四位总是写成F?不知道什么原因呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-10 19:45:51 | 显示全部楼层
直接把需要写入的数据定义为一个结构体 然后整体写入比较方便
回复 支持 反对

使用道具 举报

发表于 2015-1-11 00:37:26 | 显示全部楼层
很悲催啊,我像你一样,定义的32个buffer ,但是写入的数据会出错,例如,我写入0x3A,但是写进去的是0x3B,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-12 15:56:46 | 显示全部楼层
写入前都要擦除,还有看下你的ROM是否被代码占用 还有其他型号的擦写是否与8316有差异,8316我测试是OK了的
回复 支持 反对

使用道具 举报

发表于 2015-4-9 17:24:27 | 显示全部楼层
这个功能很好,还没有动手开始写EEPROM数据,最大能写入多少个字节?KEIL的寄存器窗口能看见写入的数据吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-9 19:15:41 | 显示全部楼层
页写要看芯片内部的buffer有多大,不同的芯片不同大小,比较多的数据分页写就可以了,KEIL下不知道能不能看到,读到RAM里面应该可以观察到 ROM数据应该是编译的结果默认的数据值,应该不会动态变化
回复 支持 反对

使用道具 举报

发表于 2015-5-21 14:18:26 | 显示全部楼层
本帖最后由 hhg1688 于 2015-5-25 11:36 编辑

按主题的意思,针对MC96F6408A的地址作了调整却不能仿真读取,不知为什么?程序如下:
#include "mc96f6508a.h"
uchar eep_buf[32];
uchar xdata flash_buffer[32] _at_ 0x8000; // flash缓存初址
code uchar eep_buffer[32] _at_ 0x1Fe0;//扇区缓存地址
void   EEP _Erase( )
{
        uchar i;
        FMCR = 0x01;   //页缓存清除
        NOP;
        NOP;
        NOP;
        for(i = 0; i < 32; i++)
        {
                flash_buffer = 0;        
        }

        FSADRH = 0;
        FSADRM = 1F;
        FSADRL = eo;
        FIDR = 0xA5;
        FMCR = 0x02; //所有FLASH清除模式
        NOP;
        NOP;
        NOP;
}

void   EEP_WriteByte (u8 addr, u8 date)//写入地址、数据
{
        FMCR = 0x01;
         NOP;
        NOP;
        NOP;
        flash_buffer[addr] = 0; //先清除FLASH
        FSADRH = 0;
        FSADRM = 1f;
        FSADRL = e0;
        FIDR = 0xA5;
        FMCR = 0x02; //FLASH清除模式
NOP;
        NOP;
        NOP;
FMCR = 0x01;
NOP;
        NOP;
        NOP;
  flash_buffer[addr] = date;        
        FSADRH = 0;
       FSADRM = 1F;
        FSADRL = e0;
        FIDR = 0xA5;
        FMCR = 0x03; // FLASH写模式
        NOP;
        NOP;
        NOP;
}


uchar EEP_ReadByte(u8 addr) //写入地址、返回数据
{
        return eep_buffer[addr];
}



void   EEP_EraseByte(u8 addr) //写入地址、清除数据
{
        FMCR = 0x01;
        NOP;
        NOP;
        NOP;
        flash_buffer[addr] = 0; //先清除FLASH
        FSADRH = 0;
        FSADRM = 1F;
        FSADRL = e0;
        FIDR = 0xA5;
        FMCR = 0x02; //FLASH清除模式     
  NOP;
        NOP;
        NOP;
}

void main()
{
U8  X=0;
port_init();
NOP;
MC96F_Erase();   //清除EEP
EEP_WriteByte (0, 5);//写入地址、数据
  X=EEP_ReadByte(0); //写入地址、返回数据

}






X=EEP_ReadByte(0); //写入地址、返回数据

不管怎样弄,X就是等于0,不知哪里出了问题?

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|第一单片机 ( 粤ICP备15013562号-1 )

GMT+8, 2018-7-23 03:50 , Processed in 0.083072 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表