amobbs.com 阿莫电子技术论坛

标题: 求助,最简单的51eeprom存储竟然不成功 [打印本页]

作者: zwhzwh_11    时间: 2024-9-5 09:03
标题: 求助,最简单的51eeprom存储竟然不成功
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;}

作者: zwhzwh_11    时间: 2024-9-5 09:07
思路是给SetPushBagTime_eep这个eeprom地址写入10,然后再读出。如果是10的话,点亮一个led。被写入的是基地址0+512*3的地址,给单片机分配了4k eeprom,应该是没有超出eeprom大小。
作者: wanggoals    时间: 2024-9-5 09:15
部分单片机写入需要时间,加延时?
作者: yc2    时间: 2024-9-5 09:17
按照官方提供的例程,直接复制过来试试看,不过这些不叫eeprom ,是假冒的,eeprom 是不要擦除指令的,可以按字节直接写入。
作者: 68336016    时间: 2024-9-5 09:26
写完就能直接读取?
写函数内部有判断写完标志的么?
作者: Landmark    时间: 2024-9-5 09:34
建议先按照官方例程去操作,按照例程来操作能解决大部分的问题。
作者: zwhzwh_11    时间: 2024-9-5 09:37
本帖最后由 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功能
}
作者: lnso    时间: 2024-9-5 14:10
yc2 发表于 2024-9-5 09:17
按照官方提供的例程,直接复制过来试试看,不过这些不叫eeprom ,是假冒的,eeprom 是不要擦除指令的,可以 ...
(引用自4楼)

现在出的MCU基本都是假冒的eeprom,flash阉割出来的
作者: zwhzwh_11    时间: 2024-9-5 14:31
lnso 发表于 2024-9-5 14:10
现在出的MCU基本都是假冒的eeprom,flash阉割出来的
(引用自8楼)

avr单片机里面的是真eeprom。stc的确是虚拟出来的




欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4