打印

SH88F4051的EEPROM操作程序,已经调试通过,放心使用

[复制链接]
5786|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linlh11|  楼主 | 2012-11-28 13:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//***********************************************************
///读EEPROM的指定单元模块
// 入口参数:addr:待读取数据的地址
// 返回值类型:UCHAR
//***********************************************************
UCHAR Byte_Read(UINT addr)
{
        UCHAR TEMPB;
      

        FLASHCON=1;
        XPAGE = 0;
        TEMPB=*(unsigned char code *)(addr);
        FLASHCON=0;
        return(TEMPB;  // return data
}

//*********************************************************
// 从EEPROM中读出若干数据子程序
// 入口参数:dest:读出后数据的临时存放地址(在RAM中开辟)
//            src: 待读取数据的地址
//            numbytes:待读取数据的个数
//返回值类型:字节
//*********************************************************
char * FLASH_Read (char *dest, UINT src, unsigned int numbytes)
{
   UINT i;

   for (i = 0; i < numbytes; i++) {
      *dest++ = Byte_Read (src+i);
   }
   return dest;
}

//**********************************************************
//向EEPROM的指定地址单元写入一个字节模块
//字节编程
//入口参数:addr = 待写入字节地址, byte= 须编程字节的数据
//**********************************************************
void Byte_Write(UINT addr, UCHAR byte)
{
        Ssp_Flag=0x5A;
        CY=EA;
        EA=0;                        // disable Interrupts during write
        FLASHCON=1;
        XPAGE = 0;                 //选择类EEPROM扇区0
        IB_OFFSET = addr&0xff;
        IB_DATA = byte;
        if(Ssp_Flag!=0x5A)
  {
          IB_CON2=0;
          goto Write_Err;
        }
        IB_CON1 = 0x6E;
        IB_CON2 = 0x05;
        IB_CON3 = 0x0A;
        IB_CON4 = 0x09;
        IB_CON5 = 0x06;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
Write_Err:
        Ssp_Flag=0;
        FLASHCON=0;
        XPAGE=0;
        EA = CY;
}

//*********************************************************
// 向EEPROM中写入若干待存数据子程序
// 入口参数:dest:写入后数据的存放地址
//            src: 待写数据的临时存放地址(在RAM中开辟)
//            numbytes:待写入数据的个数:
//*********************************************************
void FLASH_Write (UINT dest, char *src, unsigned int numbytes)
{
   UINT i;

   for (i = dest; i < dest+numbytes; i++) {
      Byte_Write (i, *src++);
   }
}

//**********************************************************
// 檫除指定的EEPROM页(256字节/每页)子程序
// 擦除扇区, 入口:addr = 扇区地址
//**********************************************************
void Sector_Erase(UCHAR addr)
{
        Ssp_Flag=0xA5;
  CY=EA;
        EA=0;
        FLASHCON=1;
        XPAGE = addr;          //addr=0-->表示檫除第0页

        if(Ssp_Flag!=0xA5)
                {
                        IB_CON2=0;
                        goto Erase_Err;
                }
        IB_CON1 = 0xE6;
        IB_CON2 = 0x05;
        IB_CON3 = 0x0A;
        IB_CON4 = 0x09;
        IB_CON5 = 0x06;
        _nop_();
        _nop_();
        _nop_();
Erase_Err:
        Ssp_Flag=0;      

        FLASHCON=0;
        XPAGE=0;
        EA = CY;
}
以上例程可以用来写多个整型参数到EEPROM,当然写字节数据肯定也没有问题,写入后读出都正确,重新下载也不会冲掉EEPROM里原有的参数,我已经测试通过,大家可以放心使用。
注意:如果重复写数据到一个扇区里的同一个地址,必须先檫除整个扇区,然后才可以写新数据进去,切记,切记。顺序写多个数据到一个扇区的不同地址,则不需要檫除扇区(前提是这些地址处都没有数据,否则也得先檫除扇区)



后话:刚开始调试老是不成功
,看了中颖的数据手册和使用指南都不行,把我搞得头疼。中颖的数据手册说明不是很清楚很到位,中颖人的语文水平太差,哎,搞技术的,英文学的不怎么样,国语怎么也这么差呢。手册里说类EEPROM操作流程有问题啊,比如手册流程如下:
1.关闭中断;
2.按相应的待编程扇区号设置XPAGE,IB_OFFSET;
3.按编程需要,设置IB_DATA;
4.按照顺序,设置IB_CON1-5;
5.添加4个NOP指令;
6.开始编程,CPU进入IDLE模式,编程完成后自动退出IDLE模式;
7.如需继续写入数据,跳转至第3步;
8.XPAGE寄存器清0,恢复中断设置。
其中第7步的说法有问题,如果要继续写入数据,怎么能直接跳转至第3步呢,你连继续要写入的地址都没有更新指明,要跳也应该是跳转至第2步。此类问题还有很多,比如还是8.4节的SSP部分的说明:一旦该扇区被编程,则在该扇区被檫除之前不能被再次编程。这句话说法也有问题:如果我要写入5个整型参数到EEPROM,写了第一个,再写后面的,难道也要先檫除整个扇区,才能继续写后面4个参数吗?我的理解应该是这样:一旦该扇区中的某个地址被编程,想继续在同一个地址编程,必须先檫除整个扇区,才可以在原来的地址编程新数据,如果是在后续地址编程,则不必先檫除整个扇区(前提是后续地址都没有被编程);或者是一旦该扇区256个字节都被编程,想重新在该扇区编程,也必须先檫除该扇区才可以。希望中颖能重新写一下EEPROM流程,我理解的框架思路如下:
1.重复编程数据到同一个地址处,必须先檫除整个扇区,才可以编程;
2.编程多个参数到同一扇区的不同地址,只需更改IB_OFFSET地址即可,不需要檫除整个扇区,除非该扇区都写满了。
沙发
ArKiao| | 2012-11-29 09:45 | 只看该作者
顶啊,正好用上

使用特权

评论回复
板凳
linlh11|  楼主 | 2012-12-3 11:44 | 只看该作者
结贴

使用特权

评论回复
地板
明月小厨| | 2012-12-5 23:36 | 只看该作者
EEPROM?现在还有人在用这个吗?

使用特权

评论回复
5
linlh11|  楼主 | 2012-12-6 16:50 | 只看该作者
不知道4楼什么意思,怎么没有人使用EEPROM啊,存储参数难道不要EEPROM吗?我用的是单片机内部的类EEPROM,也就是用FLASH实现的,不知道你有什么别的高招存储参数,掉电后还能保持住。

使用特权

评论回复
6
a327570879| | 2013-1-24 18:29 | 只看该作者
楼主好人。。。。

使用特权

评论回复
7
guduniao16| | 2013-4-19 15:37 | 只看该作者
绝对的好人。谢谢,正需要呢

使用特权

评论回复
8
zhangchaoguai| | 2014-3-5 09:56 | 只看该作者
本帖最后由 zhangchaoguai 于 2014-3-5 11:25 编辑

请问Ssp_Flag=0x5a这句为何是5a

使用特权

评论回复
9
amw1688| | 2014-3-5 14:03 | 只看该作者
我司为中颖华东88,79系列一级代理商。黄生:15112661137  QQ:370138333

使用特权

评论回复
10
keith888| | 2014-3-5 16:06 | 只看该作者
好东西,顶起

使用特权

评论回复
11
mengdq2012| | 2014-7-15 14:58 | 只看该作者
好东西啊,顶起来,不要让他沉了

使用特权

评论回复
12
michaeljiang| | 2014-9-7 17:23 | 只看该作者
中颖专职代理 姜生  QQ 2628536188  电话13242940546

使用特权

评论回复
13
793162484| | 2014-9-9 11:29 | 只看该作者
好贴啊,楼主辛苦了!

使用特权

评论回复
14
793162484| | 2014-9-11 09:27 | 只看该作者
楼主能不能把完整的函数传上来看看

使用特权

评论回复
15
energy1| | 2015-1-30 00:44 | 只看该作者
可以读EEPROM的指定单元模块

使用特权

评论回复
16
datouyuan| | 2015-2-6 14:28 | 只看该作者
谢谢楼主了。
我前段时间有个项目,也打算用88F54的内部EEPROM,可测试很多问题。
当时时间紧,也不放心内部EEPROM,最终还是使用了24C04。

有空测试一下你总结的要点。

使用特权

评论回复
17
datouyuan| | 2015-2-6 14:32 | 只看该作者
本帖最后由 datouyuan 于 2015-2-6 14:34 编辑

请版主核实下,假如楼主的总结是正确的,请求加精。

使用特权

评论回复
18
jpxjpxjpx| | 2015-3-17 19:44 | 只看该作者
中颖4位8位MCU, 锂电池管理IC,一级代理商,姜先生 QQ256278599 电话13242940546

使用特权

评论回复
19
liguohong327| | 2015-7-1 22:57 | 只看该作者
正好用上,明天验证一下

使用特权

评论回复
20
浮忞| | 2020-5-12 14:40 | 只看该作者
楼主你好,最近我也在学习中颖的EEPROM部分,看了你的帖子学到很多,但有个小问题就是掉电后有时能保存数据有时不行,能帮我看下程序哪里有问题吗?(程序放楼下)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

323

帖子

2

粉丝