打印
[51单片机]

关于STC8A8H64D4单片机eeprom读写问题

[复制链接]
1210|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
风凌天|  楼主 | 2023-11-16 14:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
       问题:现定义  unsigned  int  ledld[4]=0;    使用eeprom读取数据的时候发数组里面的数字大于900,然后发现读取的数据是错误的。后续反复试验发现数字只要大于640的话就无法读取正确的值,低于640可以正常读取。
       想问问有没有遇到这种情况的,帮我解答一下,谢谢。后面又用了STC8H3K64S4这个单片机也是一样的问题

void IapIdle()
{
    IAP_CONTR = 0;                              //关闭IAP功能
    IAP_CMD = 0;                                //清除命令寄存器
    IAP_TRIG = 0;                               //清除触发寄存器
    IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域
    IAP_ADDRL = 0;

}

char ispdu(unsigned int addr)
{
    char dat;

    IAP_CONTR = 0x82;                         //使能IAP
          IAP_TPS = 0x16;                           //22.184M晶振
    IAP_CMD = 1;                                //设置IAP读命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();
    dat = IAP_DATA;                             //读IAP数据
    IapIdle();                                  //关闭IAP功能

    return dat;
}

void ispxie(unsigned int addr,unsigned char dat)
{
    IAP_CONTR = 0x82;                         //使能IAP
          IAP_TPS = 0x16;
    IAP_CMD = 2;                                //设置IAP写命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_DATA = dat;                             //写IAP数据
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();
    IapIdle();                                  //关闭IAP功能
}

void ispca(unsigned int addr)
{
    IAP_CONTR = 0x82;                         //使能IAP
          IAP_TPS = 0x16;
    IAP_CMD = 3;                                //设置IAP擦除命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();                                    //
    IapIdle();                                  //关闭IAP功能
}


之前用上面的程序存的都是8位数据,从没出现过问题,现在读写16位数据就有问题了,下面就是读写16位数据的程序

        ispca(0X0000);                           //擦除与写入16位数据
        ispxie(0x0010,ledld[0]>>8);
        ispxie(0x0011,ledld[0]);
        ispxie(0x0012,ledld[1]>>8);
        ispxie(0x0013,ledld[1]);
        ispxie(0x0014,ledld[2]>>8);
        ispxie(0x0015,ledld[2]);
        ispxie(0x0016,ledld[3]>>8);
        ispxie(0x0017,ledld[3]);       



        ledld[0]=(ispdu(0x0010)<<8) | ispdu(0x0011);    //读取16位数据
        ledld[1]=(ispdu(0x0012)<<8) | ispdu(0x0013);
        ledld[2]=(ispdu(0x0014)<<8) | ispdu(0x0015);
        ledld[3]=(ispdu(0x0016)<<8) | ispdu(0x0017);


现在就是数字大于640擦除写入,然后读取出来的数据是错误的;只要小于640就能读取正确的数据。望各位能帮我解答一下。







使用特权

评论回复

相关帖子

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

本版积分规则

6

主题

63

帖子

1

粉丝