找回密码
 立即注册
查看: 57|回复: 2

数据没有写进EPROM

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2026-04-13 10:33:27

20

主题

46

回帖

215

积分

中级会员

积分
215
发表于 2026-4-13 10:33:27 | 显示全部楼层 |阅读模式
各位,请教一下。

我现在负责一个程序,使用的芯片是STC8G2K64S4,主频是24MHz。需要将一些数据写入芯片内部的EPROM。

        IapErase(200);
        IapProgram(200,77);
        IapProgram(201,88);
        TestArrC[0]=IapRead(200);
        TestArrC[1]=IapRead(201);
        MacChannel=12345;

以上是测试代码。此时代码工作正常,第4,5行读出的数据是正常的。
但如果把前面三行屏蔽掉,代码如下
//        IapErase(200);
//        IapProgram(200,77);
//        IapProgram(201,88);
        TestArrC[0]=IapRead(200);
        TestArrC[1]=IapRead(201);
        MacChannel=12345;

则读出的两个数据都是0xFF。按我的理解,数据写入EPROM后,重新加电,读出的数据应该是之前写入的。
请问这是哪里的问题,谢谢。

以下是我的代码,基本都是复制你们的例程。

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

u8 IapRead(int addr){
    u8 dat;

    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 24;                               //设置等待参数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 = 24;                               //设置等待参数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 = 24;                               //设置等待参数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功能
}




回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:334
  • 最近打卡:2026-04-28 11:53:20

85

主题

7349

回帖

1万

积分

超级版主

积分
15865
发表于 2026-4-13 11:04:42 | 显示全部楼层
你重新下载程序时,擦除了EEPROM。

1、看你程序,使用24MHz主频,下载时选择24MHz。
2、不要勾选“下次下载用户程序时擦除用户EEPROM区”
截图202604131107201850.jpg



回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:60
  • 最近打卡:2026-05-01 05:53:11
已绑定手机

3

主题

94

回帖

505

积分

高级会员

积分
505
发表于 2026-4-13 13:33:38 | 显示全部楼层
一个扇区512字节=0x0200,
各扇区首地址:0x0000、0x0200、0x0400、0x0800......

        IapErase(0x0200);
        IapProgram(0x0200,77);
        IapProgram(0x0201,88);
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-5-1 12:07 , Processed in 0.109845 second(s), 62 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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