找回密码
 立即注册
查看: 957|回复: 8

STC32G12K128的EEPROM读写问题 |已解决

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-12-02 07:00:35
已绑定手机

1

主题

4

回帖

21

积分

新手上路

积分
21
发表于 2025-12-1 17:36:08 | 显示全部楼层 |阅读模式
这是我用官方例程修改后的代码,为什么串口两次输出的结果不一样呢,按理说写入后再读出数据应该是一样的啊。有没有哪位大神解答一下。128k内部eeprom。写入之前该区域已经擦除,0xE00地址前的数据都是正确的,就只有E00地址开始的53个字节有错,我每次写入128个字节。一共写入15978个字节,写入前,0x0000-0xC800已经擦除
int EEPROM_write_n(u32 EE_address,u8 *DataAddress,u16 number)
{
        uint8_t flagh=0,buf[100];
        int ret;
        u8 i=0;
        IAP_ENABLE();                       //设置等待时间,允许IAP操作,送一次就够
        IAP_WRITE();                        //宏调用, 送字节写命令
        //测试代码
                if(EE_address==0XE00)
                {
                        flagh=1;
                        PrintString2(DataAddress,number);//test               
                }
        //测试代码end
        do
        {
                IAP_ADDRE = (u8)(EE_address >> 16); //送地址高字节(地址需要改变时才需重新送地址)
                IAP_ADDRH = (u8)(EE_address >> 8);  //送地址中字节(地址需要改变时才需重新送地址)
                IAP_ADDRL = (u8)EE_address;         //送地址低字节(地址需要改变时才需重新送地址)
                IAP_DATA  = *DataAddress;         //送数据到IAP_DATA,只有数据改变时才需重新送
                EEPROM_Trig();                    //触发EEPROM操作
                EE_address++;                     //下一个地址
                DataAddress++;                    //下一个数据
        }while(--number);                   //直到结束
        DisableEEPROM();

        ret=memcmp(DataAddress,(uint8_t *)EE_address,number);
        //测试代码
        if(flagh==1)
        {
                for(i=0;i<100;i++)//3E6A
                {
                        EEPROM_read_n(0xE00,buf,100);
                }
                PrintString2(buf,100);
        }
        //测试代码end
        return ret;
}


截图202512011735493206.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:390
  • 最近打卡:2025-12-17 08:54:40
已绑定手机

97

主题

3863

回帖

8332

积分

荣誉版主

无情的代码机器

积分
8332
发表于 2025-12-1 22:14:28 | 显示全部楼层
红框里对应日志两次打印?看不到擦除的地方?写之前未擦除

截图202512012214258459.jpg
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:641
  • 最近打卡:2025-12-17 10:15:23
已绑定手机
已实名认证

123

主题

3278

回帖

8316

积分

版主

积分
8316
发表于 2025-12-1 23:03:09 | 显示全部楼层
DataAddress在运行后已经被改变了,如果想要使用memcmp,需要在函数开始前保存一下
你的buf是一个局部变量数组,在调用其他函数的时候,传过去的只是一个地址,不能保证数组还在,需要将buf调整到全局变量再尝试一下
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-12-02 07:00:35
已绑定手机

1

主题

4

回帖

21

积分

新手上路

积分
21
发表于 2025-12-2 07:00:35 来自手机 | 显示全部楼层
ercircle 发表于 2025-12-1 22:14
红框里对应日志两次打印?看不到擦除的地方?写之前未擦除

您好,感谢您的回复。我在进入这个写函数之前就已经擦除了,已经验证全是FF。两次串口打印第一次打印的是传入数据,number(128)个。第二次打印的是读出的eeprom数据100个(读100个出来比较)。这100个数据前53个和传入的数据不一致。按道理应该是一样的才对
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-12-02 07:00:35
已绑定手机

1

主题

4

回帖

21

积分

新手上路

积分
21
发表于 2025-12-2 09:16:24 | 显示全部楼层
王*** 发表于 2025-12-1 23:03
DataAddress在运行后已经被改变了,如果想要使用memcmp,需要在函数开始前保存一下
你的buf是一个局部变量 ...

感谢您的回复。我把buf替换成全局变量结果也是一样的。memcmp返回结果是0,目前是可以验证通过。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:390
  • 最近打卡:2025-12-17 08:54:40
已绑定手机

97

主题

3863

回帖

8332

积分

荣誉版主

无情的代码机器

积分
8332
发表于 2025-12-2 09:18:30 | 显示全部楼层
因为按扇区擦除,检查下写入时最好也是按扇区大小512字节

还有就是ISP软件上设置的EEPROM大小要满足写入大小
还不行的话可以发现可复现工程看看
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-12-02 07:00:35
已绑定手机

1

主题

4

回帖

21

积分

新手上路

积分
21
发表于 2025-12-2 09:27:40 | 显示全部楼层
erci*** 发表于 2025-12-2 09:18
因为按扇区擦除,检查下写入时最好也是按扇区大小512字节

还有就是ISP软件上设置的EEPROM大小要满足写入大 ...

我是直接调用库函数擦除50K,(0000-C800)然后按字节写入的 。我理解应该是可以这样操作的。只是写道E00地址就开始不正常了,E00前和E35地址后都是正常的
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:585
  • 最近打卡:2025-12-17 09:13:09
已绑定手机

49

主题

2368

回帖

8418

积分

论坛元老

积分
8418
发表于 2025-12-2 09:33:23 | 显示全部楼层
先用例子测试,功能验证正常后再进行修改或者移植。

按键触发EEPROM读写测试程序-通过串口1输出-32G.zip

17.6 KB, 下载次数: 76

读写EEPROM测试程序-通过串口1输出-0x400.zip

17.07 KB, 下载次数: 59

读写EEPROM测试程序-通过串口1输出-Huge模式.zip

17.51 KB, 下载次数: 62

读写EEPROM测试程序-通过串口1输出-超64K.zip

17.67 KB, 下载次数: 72

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-12-02 07:00:35
已绑定手机

1

主题

4

回帖

21

积分

新手上路

积分
21
发表于 2025-12-2 11:25:27 | 显示全部楼层
问题已解决,由于我的每帧数据是128个,但中间某一帧数据因为上位机的原因来了178个,所以写入的时候超范围了 跑到E00后面去了,再次往E00开始写入下一帧数据时,E00地址已经有数据了  造成了读出数据不一致。
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-12-17 14:54 , Processed in 0.135001 second(s), 86 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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