巴黎人VR快艇开奖直播: [家电应用] 求助!!!SH79F6488 EEPROM问题(已经解决了)

开心8网址官网官方网
746|12
楼主
本帖最后由 浮忞 于 2020-5-15 09:35 编辑

想试下EEPROM功能,巴黎人VR快艇开奖直播:显示一个数掉电后上电继续加数,但每次上电都是从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
你是如何检测掉电的呢?重要的部分没说

拔掉电池不就掉电了吗
5
 楼主 | 2020-5-8 14:04 | 只看该作者
ayb_ice 发表于 2020-5-8 13:14
CY = EA;
EA = 0;
。。。

我是看到该芯片的应用手册是这样写的
6
 楼主 | 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);
}
7
 楼主 | 2020-5-8 14:08 | 只看该作者
我感觉是我写入的地址有问题,但改了取低八位和16位都写不进去
8
| 2020-5-8 14:18 | 只看该作者
浮忞 发表于 2020-5-8 14:04
我是看到该芯片的应用手册是这样写的

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

仔细看手册,这些都是很简单的操作
9
| 2020-5-8 14:20 | 只看该作者
浮忞 发表于 2020-5-8 14:08
我感觉是我写入的地址有问题,但改了取低八位和16位都写不进去

他的EEPROM地址可能有映射,就是当成EEPROM时的地址与当成普通代码空间的地址是不一样的
10
 楼主 | 2020-5-8 14:39 | 只看该作者
ayb_ice 发表于 2020-5-8 14:20
他的EEPROM地址可能有映射,就是当成EEPROM时的地址与当成普通代码空间的地址是不一样的 ...

好的,谢谢,我去改掉
11
 楼主 | 2020-5-12 14:43 | 只看该作者
还没解决,不造为啥掉电后有时候能继续加数,有时候从0开始加数,真的是找不到哪里有问题
12
 楼主 | 2020-5-15 09:33 | 只看该作者
已解决,原因是main里面延时太短了,导致有可能没写完数据,把Delayms(1)改成Delayms(10)就一切正常
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

快速回复

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

论坛热帖

开心8网址官网官方网 永利游戏开户直营 返回顶部 返回列表
百家乐VR彩票彩票官网 菲律宾申博天津快乐十分助赢软件 开心8网址官网官方网 银泰VR彩票百家乐时时彩计划软件 开心8网址官网官方网
葡京广东快乐十分走势 网络赌钱庄家被抓网上娱乐场 澳门大赌场网上娱乐场 鸿博开户 金冠湖南快乐十分官方网
永利SUNBET申博时时彩软件 澳门银河酒店第二期网上娱乐场 沙龙国际第一品牌游戏 老虎游戏平台网上娱乐场 葡京上海时时乐开奖
365备用网址 申博真人澳门赌场 银河游戏现金直营登入 www.99sbc.com 上申博网登入 大三巴怎么去威尼斯人网上娱乐场