搜索
bottom↓
回复: 8

求助,最简单的51eeprom存储竟然不成功

[复制链接]

出85入85汤圆

发表于 2024-9-5 09:03:25 | 显示全部楼层 |阅读模式
stc8g1k17单片机,我怎么用一个非常简单的函数,数据都没有保存上?用了封装的write_eep_byte以及系统自带的IapErase、IapProgram都没有成功。

                        IapErase(SetPushBagTime_eep+18);
                        IapProgram(SetPushBagTime_eep+18, 10);

//                        write_eep_byte(10,SetPushBagTime_eep+18); //这句生效时,保存也不成功。
                        if(read_eep_byte(SetPushBagTime_eep+18)==10)
                        {LED1 = 0;}

阿莫论坛20周年了!感谢大家的支持与爱护!!

有一句段子是这样说的,身家过亿的只关心自己的身体,身家千万的,在担心传承,勉强糊口度日才天天看国际新闻,关心国家大事。

出85入85汤圆

 楼主| 发表于 2024-9-5 09:07:06 | 显示全部楼层
思路是给SetPushBagTime_eep这个eeprom地址写入10,然后再读出。如果是10的话,点亮一个led。被写入的是基地址0+512*3的地址,给单片机分配了4k eeprom,应该是没有超出eeprom大小。

出0入9汤圆

发表于 2024-9-5 09:15:22 来自手机 | 显示全部楼层
部分单片机写入需要时间,加延时?

出0入0汤圆

发表于 2024-9-5 09:17:25 | 显示全部楼层
按照官方提供的例程,直接复制过来试试看,不过这些不叫eeprom ,是假冒的,eeprom 是不要擦除指令的,可以按字节直接写入。

出130入129汤圆

发表于 2024-9-5 09:26:32 | 显示全部楼层
写完就能直接读取?
写函数内部有判断写完标志的么?

出0入4汤圆

发表于 2024-9-5 09:34:27 | 显示全部楼层
建议先按照官方例程去操作,按照例程来操作能解决大部分的问题。

出85入85汤圆

 楼主| 发表于 2024-9-5 09:37:57 | 显示全部楼层
本帖最后由 zwhzwh_11 于 2024-9-5 09:44 编辑

谢谢各位大佬的指点 :发现是库函数有问题,函数里少些一行寄存器配置。下面是错误的库函数。
char IapRead(int addr)
{
    char dat;

    IAP_CONTR = WT_12M;                         //使能IAP
    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 IapProgram(int addr, char dat)
{
    IAP_CONTR = WT_12M;                         //使能IAP
    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 IapErase(int addr)
{
    IAP_CONTR = WT_12M;                         //使能IAP
    IAP_CMD = 3;                                //设置IAP擦除命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();                                    //
    IapIdle();                                  //关闭IAP功能
}





★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
下面是正确的库函数,来自stc isp烧写软件的例程
char IapRead(int addr)
{
    char dat;

    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 12;                               //设置等待参数12MHz
    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 IapProgram(int addr, char dat)
{
    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 12;                               //设置等待参数12MHz
    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 IapErase(int addr)
{
    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 12;                               //设置等待参数12MHz
    IAP_CMD = 3;                                //设置IAP擦除命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();                                    //
    IapIdle();                                  //关闭IAP功能
}

出0入0汤圆

发表于 2024-9-5 14:10:52 | 显示全部楼层
yc2 发表于 2024-9-5 09:17
按照官方提供的例程,直接复制过来试试看,不过这些不叫eeprom ,是假冒的,eeprom 是不要擦除指令的,可以 ...
(引用自4楼)

现在出的MCU基本都是假冒的eeprom,flash阉割出来的

出85入85汤圆

 楼主| 发表于 2024-9-5 14:31:25 | 显示全部楼层
lnso 发表于 2024-9-5 14:10
现在出的MCU基本都是假冒的eeprom,flash阉割出来的
(引用自8楼)

avr单片机里面的是真eeprom。stc的确是虚拟出来的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-12-2 04:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表