搜索

[家电应用] 求助!!!SH79F6488 EEPROM问题(已经解决了)

[复制链接]
352|12
 楼主 | 2020-5-7 16:18 | 显示全部楼层 |阅读模式
本帖最后由 浮忞 于 2020-5-15 09:35 编辑

想试下EEPROM功能,显示一个数掉电后上电继续加数,但每次上电都是从0开始,有些延时,初始化,显示程序我就没贴出来
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);
    }
}

使用特权

评论回复
| 2020-5-7 19:21 | 显示全部楼层
你是如何检测掉电的呢?重要的部分没说

使用特权

评论回复
| 2020-5-8 13:14 | 显示全部楼层
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;

使用特权

评论回复

评论

changshs2018 2020-5-13 11:24 回复TA
担心CY值变化,可以使用PSW中的F0或者F1位。 最好的办法是嵌入汇编。 这样不用担心编译时候出现打包现象。 
 楼主 | 2020-5-8 13:57 | 显示全部楼层
xyz549040622 发表于 2020-5-7 19:21
你是如何检测掉电的呢?重要的部分没说

拔掉电池不就掉电了吗

使用特权

评论回复
 楼主 | 2020-5-8 14:04 | 显示全部楼层
ayb_ice 发表于 2020-5-8 13:14
CY = EA;
EA = 0;
。。。

我是看到该芯片的应用手册是这样写的

使用特权

评论回复
 楼主 | 2020-5-8 14:07 | 显示全部楼层
读数据参考手册程序改成这样了,还是不行,感觉写不进去
unsigned char Read_Data(unsigned int addr)
{               
        unsigned int temp;
    FLASHCON=1;
        XPAGE = 0;
    temp=*(unsigned int code *)(addr);
    FLASHCON=0;
    return(temp);
}

使用特权

评论回复
 楼主 | 2020-5-8 14:08 | 显示全部楼层
我感觉是我写入的地址有问题,但改了取低八位和16位都写不进去

使用特权

评论回复
| 2020-5-8 14:18 | 显示全部楼层
浮忞 发表于 2020-5-8 14:04
我是看到该芯片的应用手册是这样写的

这样不好,不安全,说明写手册的人水平也不咋地

仔细看手册,这些都是很简单的操作

使用特权

评论回复
| 2020-5-8 14:20 | 显示全部楼层
浮忞 发表于 2020-5-8 14:08
我感觉是我写入的地址有问题,但改了取低八位和16位都写不进去

他的EEPROM地址可能有映射,就是当成EEPROM时的地址与当成普通代码空间的地址是不一样的

使用特权

评论回复
 楼主 | 2020-5-8 14:39 | 显示全部楼层
ayb_ice 发表于 2020-5-8 14:20
他的EEPROM地址可能有映射,就是当成EEPROM时的地址与当成普通代码空间的地址是不一样的 ...

好的,谢谢,我去改掉

使用特权

评论回复
 楼主 | 2020-5-12 14:43 | 显示全部楼层
还没解决,不造为啥掉电后有时候能继续加数,有时候从0开始加数,真的是找不到哪里有问题

使用特权

评论回复
 楼主 | 2020-5-15 09:33 | 显示全部楼层
已解决,原因是main里面延时太短了,导致有可能没写完数据,把Delayms(1)改成Delayms(10)就一切正常

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表