找回密码
 立即注册
查看: 718|回复: 12

EEPROM写一个数据变成全扇区都同时这个数据,这是什么原因引起的?

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-02-08 00:46:28
已绑定手机

3

主题

7

回帖

96

积分

注册会员

积分
96
发表于 2025-1-4 01:26:45 | 显示全部楼层 |阅读模式
环境:
      单片机: ai8h2k32u
      频率:   24mhz

现象: 写数据时, 最后一次写的一个字节值会把全部扇区的值覆盖。


问题发现: 下单不久的这个芯片, 原来用stc8h1k28的项目读写eeprom没有问题, 但移植到这个芯片后,发现写数据区后,每个数据都变成最后一个写的数据了,很怪异。折腾一番,一直没有发现代码有明显的bug.  最后采用了最小代码法,用串口输出,发现的确是这种现象。
发上来求助大佬们

上代码和运行结果图:
屏幕截图 2025-01-04 011058.jpg
屏幕截图 2025-01-04 011206.jpg
屏幕截图 2025-01-04 012618.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:568
  • 最近打卡:2025-06-30 22:16:38

21

主题

564

回帖

2928

积分

金牌会员

积分
2928
发表于 2025-1-4 08:48:04 | 显示全部楼层
D等高手来解答
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:112
  • 最近打卡:2025-06-10 10:45:07
已绑定手机

5

主题

118

回帖

694

积分

高级会员

积分
694
发表于 2025-1-4 08:52:00 | 显示全部楼层
看不懂
高级软件工程师-唐工
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-02-08 00:46:28
已绑定手机

3

主题

7

回帖

96

积分

注册会员

积分
96
发表于 2025-1-4 10:33:52 | 显示全部楼层

只是一个简化了的测试程序
这个输出理论上是: FF FF FF 0A  01 FF FF 0A 01 02 FF 0A 01 02 03 0A
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:482
  • 最近打卡:2025-06-30 09:00:25
已绑定手机

81

主题

5229

回帖

9357

积分

超级版主

DebugLab

积分
9357
发表于 2025-1-4 13:04:05 | 显示全部楼层
没看到IAPREAD函数
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:482
  • 最近打卡:2025-06-30 09:00:25
已绑定手机

81

主题

5229

回帖

9357

积分

超级版主

DebugLab

积分
9357
发表于 2025-1-4 13:06:54 | 显示全部楼层
  1. void Iap_Idle(void)
  2. {
  3.         IAP_CONTR&=~IAPEN;
  4.         IAP_CMD=IAP_IDL;
  5.         IAP_TRIG=0x00;
  6.         IAP_ADDRH=0x80;
  7.         IAP_ADDRL=0x00;
  8. }
复制代码
  1. unsigned char Iap_Read_Byte(unsigned char sector,unsigned int addr)
  2. {
  3.         return *(CBYTE+IAP_OFFSET+sector*0x0200+addr);
  4. }
复制代码
  1. void Iap_Program_Byte(unsigned char sector,unsigned int addr,unsigned char dat)
  2. {
  3.         unsigned int add;
  4.         add=sector*0x0200+addr;
  5.         IAP_CONTR|=IAPEN;
  6.         IAP_TPS=IAP_TPS_;
  7.         IAP_CMD=IAP_WRITE;
  8.         IAP_ADDRL=add;
  9.         IAP_ADDRH=add>>8;
  10.         IAP_DATA=dat;
  11.         IAP_TRIG=0x5A;
  12.         IAP_TRIG=0xA5;
  13.         _nop_();
  14.         Iap_Idle();
  15. }
复制代码
  1. void Iap_Erase_Sector(unsigned char sector)
  2. {
  3.         unsigned int add;
  4.         add=sector*0x0200;
  5.         IAP_CONTR|=IAPEN;
  6.         IAP_TPS=IAP_TPS_;
  7.         IAP_CMD=IAP_ERASE;
  8.         IAP_ADDRL=add;
  9.         IAP_ADDRH=add>>8;
  10.         IAP_TRIG=0x5A;
  11.         IAP_TRIG=0xA5;
  12.         _nop_();
  13.         Iap_Idle();
  14. }
复制代码


DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-02-08 00:46:28
已绑定手机

3

主题

7

回帖

96

积分

注册会员

积分
96
发表于 2025-1-4 13:15:14 | 显示全部楼层
我采用的是例程库的的read和write,所以没有贴。 我也贴出来这几个方法。 等下我用版主的函数方法来测试一下。
void IapIdle()
{
    IAP_CONTR = 0;                              //¹Ø±ÕIAP¹¦ÄÜ
    IAP_CMD = 0;                                //Çå³ýÃüÁî¼Ä´æÆ÷
    IAP_TRIG = 0;                               //Çå³ý´¥·¢¼Ä´æÆ÷
    IAP_ADDRH = 0x80;                           //½«µØÖ·ÉèÖõ½·ÇIAPÇøÓò
    IAP_ADDRL = 0;
}

char IapRead(int addr)
{
    char dat;

    IAP_CONTR = 0x80;                           //ʹÄÜIAP
    IAP_TPS = TPS;                               //ÉèÖõȴý²ÎÊý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 = TPS;                               //ÉèÖõȴý²ÎÊý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 = TPS;                               //ÉèÖõȴý²ÎÊý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
  • 打卡总天数:10
  • 最近打卡:2025-02-08 00:46:28
已绑定手机

3

主题

7

回帖

96

积分

注册会员

积分
96
发表于 2025-1-4 14:28:33 | 显示全部楼层

测试了代码,结果不是预想的。以下是我根据代码定义的一些值, 看有没有问题
1.png

注: CBYTE和IAP_OFFSET看会不会定义有问题? 地址初始值直接用扇区来转化了,所以这个offset我设定为0

这个打印的结果图
2.png


这是测试打印代码:
3.png

点评

CBYTE是libc ABSACC.H中的定义,#include 即可 IAP_OFFSET是MOVC读的基地址,就是code区的大小 所以应为 #define IAP_OFFSET 0x8000  详情 回复 发表于 2025-1-5 10:25
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-02-08 00:46:28
已绑定手机

3

主题

7

回帖

96

积分

注册会员

积分
96
发表于 2025-1-4 14:37:52 | 显示全部楼层
因为了编译通过, 改了几个宏。 干脆我把main.c发上来让大家排错

Main.c

8.41 KB, 下载次数: 27

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:482
  • 最近打卡:2025-06-30 09:00:25
已绑定手机

81

主题

5229

回帖

9357

积分

超级版主

DebugLab

积分
9357
发表于 2025-1-5 10:25:20 | 显示全部楼层
marchw*** 发表于 2025-1-4 14:28
测试了代码,结果不是预想的。以下是我根据代码定义的一些值, 看有没有问题

CBYTE是libc ABSACC.H中的定义,是一个指针,不是数值0,#include <absacc.h>即可
1.png
IAP_OFFSET是MOVC读的基地址,就是code区的大小
2.png
该型号为IAP,EEPROM大小可自定义
1.png
3.png
4.png
最大为0x8000
IAP_OFFSET=0x8000-用户设置的EEPROM大小x
所以应为
#define IAP_OFFSET (0x8000-x)
假设只使用1个扇区
1.png
就是
#define IAP_OFFSET (0x8000-0x0200)
DebugLab
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-30 23:41 , Processed in 0.138231 second(s), 104 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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