打印
[其它应用]

SH79F6488 EEPROM问题

[复制链接]
5548|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhanghqi|  楼主 | 2021-10-10 10:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想试下EEPROM功能,显示一个数掉电后上电继续加数,但每次上电都是从0开始,有些延时

使用特权

评论回复
沙发
llljh| | 2021-10-10 10:13 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
zhanghqi|  楼主 | 2021-10-10 10:15 | 只看该作者
初始化,显示程序我就没贴出来
void Write_Data(unsigned int addr1,unsigned char dat1)
{
    CY = EA;
    EA = 0;
    FLASHCON = 0x01;                           //SSP编程需先关闭中断
    IB_DATA = dat1;                                //编程用数据寄存器
    IB_OFFSET = addr1;                        //被擦除/编程的块单元地址
    XPAGE = 0x00;                                //擦除/编程用扇区选择和地址选择寄存器
    if(gBFlashLock!=0x5A)                 //判断写操作标志位
    {
        goto Write_Err;
    }
    IB_CON1 = 0x6E;                                //SSP操作模式选择寄存器:存储单元编程
    IB_CON2 = 0x05;                                //SSP流程控制寄存器1
    IB_CON3 = 0x0A;
    IB_CON4 = 0x09;
    IB_CON5 = 0x06;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
Write_Err:
    gBFlashLock=0x00;
    XPAGE=0x00;
    FLASHCON = 0x00;                        //当不需要对类EEPROM操作时,必须将FAC位清0。
    EA = CY;
}


/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
SSP操作类EEPROM-读数据:
入口:addr = 扇区单元地址
出口:dat = 读出的数据
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
unsigned char Read_Data(unsigned int addr2)
{
    unsigned char dat2;
    CY = EA;
    EA = 0;
    FLASHCON = 0x01;
    XPAGE = 0x00;
    IB_OFFSET = addr2;
        if(gBFlashLock!=0x5A)                 // 烧写/擦除的超级抗干扰措施
    {
        goto Read_Err;
    }
    IB_CON1 = 0x6E;                                //SSP操作模式选择寄存器:存储单元编程
    IB_CON2 = 0x05;                                //SSP流程控制寄存器1
    IB_CON3 = 0x0A;
    IB_CON4 = 0x09;
    IB_CON5 = 0x06;
        
    dat2 = IB_DATA;                                //取出数据
    _nop_();
    _nop_();
    _nop_();
    _nop_();
Read_Err:
    gBFlashLock=0x00;
    XPAGE=0x00;
    FLASHCON = 0x00;                        //当不需要对类EEPROM操作时,必须将FAC位清0。
    EA = CY;
    return dat2;
}
//擦除
void cc(unsigned int addr)
{
        CY = EA;
    EA = 0;
    FLASHCON = 0x01;   
    XPAGE = addr;
        if(gBFlashLock != 0xA5)                 //判断写操作标志位
    {
        goto Erase_Err;
    }
    IB_CON1 = 0xE6;                                //SSP操作模式选择寄存器:扇形擦除
    IB_CON2 = 0x05;
    IB_CON3 = 0x0A;
    IB_CON4 = 0x09;
    IB_CON5 = 0x06;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
Erase_Err:
    gBFlashLock=0x00;
    XPAGE=0x00;
    FLASHCON = 0x00;
    EA = CY;
}
void work()
{
    T++;
    if(T == 1000)
    {
        T = 0;
        num ++;
        {
            if(num > 60)
            {
                num = 0;
            }
        }
    }
    cc(0x01);
    Write_Data(0x01,num);
}
void view()
{
    Display_DIA(0,num);
}
void main()
{
    Oscillator_Init();
    CLK32KTO24M();
    init();
    Delayms(1);
    ClearDisplay();
    gBFlashLock = 0x5A;                        //烧写/擦除的超级抗干扰措施 标志位
    num = Read_Data(0x01);
    while(1)
    {
        work();
        view();
        Delayms(1);
    }
}

使用特权

评论回复
地板
dingy| | 2021-10-10 10:19 | 只看该作者
你是如何检测掉电的呢?重要的部分没说

使用特权

评论回复
5
dengdc| | 2021-10-10 10:24 | 只看该作者
CY = EA;
EA = 0;
。。。
EA = CY;

这是在找死的节奏,中间代码很可能改变CY的,返回时EA的状态可能出错了
要这样用
#pragma disable
unsigned char Read_Data(unsigned int addr2)
{
        //......
}

或者

CY = EA;
_push_(PSW);
EA = 0;
。。。
_pop_(PSW);
EA = CY;

使用特权

评论回复
6
zhanghqi|  楼主 | 2021-10-10 10:26 | 只看该作者
拔掉电池不就掉电了吗

使用特权

评论回复
7
jiajs| | 2021-10-10 10:29 | 只看该作者
我是看到该芯片的应用手册是这样写的

使用特权

评论回复
8
zhanghqi|  楼主 | 2021-10-10 10:30 | 只看该作者
读数据参考手册程序改成这样了,还是不行,感觉写不进去
unsigned char Read_Data(unsigned int addr)
{               
        unsigned int temp;
    FLASHCON=1;
        XPAGE = 0;
    temp=*(unsigned int code *)(addr);
    FLASHCON=0;
    return(temp);
}

使用特权

评论回复
9
zhanghqi|  楼主 | 2021-10-10 10:32 | 只看该作者
我感觉是我写入的地址有问题,但改了取低八位和16位都写不进去

使用特权

评论回复
10
supernan| | 2021-10-10 10:35 | 只看该作者
这样不好,不安全,说明写手册的人水平也不咋地

使用特权

评论回复
11
zhanghqi|  楼主 | 2021-10-10 10:37 | 只看该作者
仔细看手册,这些都是很简单的操作

使用特权

评论回复
12
juventus9554| | 2021-10-10 10:38 | 只看该作者
他的EEPROM地址可能有映射,就是当成EEPROM时的地址与当成普通代码空间的地址是不一样的

使用特权

评论回复
13
zhanghqi|  楼主 | 2021-10-10 10:40 | 只看该作者
好的,谢谢,我去改掉

使用特权

评论回复
14
zhanghqi|  楼主 | 2021-10-10 10:42 | 只看该作者

还没解决,不造为啥掉电后有时候能继续加数,有时候从0开始加数,真的是找不到哪里有问题

使用特权

评论回复
15
stly| | 2021-10-10 10:46 | 只看该作者
main里面延时太短了

使用特权

评论回复
16
xxrs| | 2021-10-10 10:48 | 只看该作者
导致有可能没写完数据,把Delayms(1)改成Delayms(10)就一切正常

使用特权

评论回复
17
NJZR| | 2021-10-16 23:14 | 只看该作者
dengdc 发表于 2021-10-10 10:24
CY = EA;
EA = 0;
。。。

你这样PSW里其它位的状态也复原了,同样会覆盖中间代码造成的PSW改变,应该POP到ACC或确定可以使用的某个寄存器才安全。

使用特权

评论回复
18
数据采集存储| | 2021-11-1 15:11 | 只看该作者
掉电存储,确实很重要,还有一点,就是掉电的一瞬间该如何存储?

使用特权

评论回复
19
rankey| | 2021-11-5 21:09 | 只看该作者
楼主,还要继续修炼啊。我遇到过真正的高手,调试我司的一款产品。要用到掉电后数据**,上电后要继续完成掉电前的进程!注意是进程!
     调试时,有时发现掉电后,不会进入进程。 他想了想,大概2分钟。就知道原因了。是芯片之间通讯延迟,导致掉电后,主芯片来不及存储数据。  他马上改成主芯片的低电压检测模式。掉电信号,不是从电源板的芯片发过来再执行掉电操作。
   3分钟后,偶发性的故障马上消失。这是从事单片机编程15年的高手啊~~

使用特权

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

本版积分规则

852

主题

11757

帖子

5

粉丝