标题: STC8G2K64S4单片机IAP读写问题 [打印本页]

作者: 依然犹在    时间: 2021-7-2 17:13
标题: STC8G2K64S4单片机IAP读写问题
最经刚用了一款STC的单片机STC8G2K64S4 ,数量200片,目前发现其中有两片的EEPROM用IAP方式读写时会出问题。具体数据就是到数值超过127时,存入或者读出的数据就变了,不知道大家有没有遇到过

作者: robinsonlin    时间: 2021-7-2 18:39
8G系列的IAP读写和  15系列的不一样哦。 你的底层代码是用的8G系列专用的么?
作者: 464645465465465    时间: 2021-7-3 21:08
那就是那两片有问题呗...
作者: 依然犹在    时间: 2021-7-5 08:20
robinsonlin 发表于 2021-7-2 18:39
8G系列的IAP读写和  15系列的不一样哦。 你的底层代码是用的8G系列专用的么?

是的。底层程序,就是8G的 。这个不是用8G专用的也不会有198片成功的事。
作者: 依然犹在    时间: 2021-7-5 08:22
464645465465465 发表于 2021-7-3 21:08
那就是那两片有问题呗...

我关心的问题就是,是不是那两片一定有问题,或者说怎么通过程序来控制。我也问了我的同事,他说之前的12C5410AD就有这个问题,然后他把存入的数据控制在100以内,就行了。要是这样的话。。
作者: 依然犹在    时间: 2021-7-5 09:06
robinsonlin 发表于 2021-7-2 18:39
8G系列的IAP读写和  15系列的不一样哦。 你的底层代码是用的8G系列专用的么?

是的,不然那198片也都是不对的了。
作者: Y_G_G    时间: 2021-7-5 17:04
代码全部上传看一下就知道怎么回事了
按照你这个写入正确率,2/200,那就是1%没有正常读写
这并不代表程序就是对的,特别是延时这一块
因为,在绝大多数的情况下,单片机本身有问题的,是很少很少0.1%,都是多的,OTP单片机除外
带EEPROM的单片机出厂之前,人家是进行过很多次读写测试的,我进过他们车间看过的
所以,上传代码看一下就知道了
作者: 3486635230    时间: 2021-7-5 19:55
在写入数据的时候断电了
作者: 依然犹在    时间: 2021-7-6 09:31
Y_G_G 发表于 2021-7-5 17:04
代码全部上传看一下就知道怎么回事了
按照你这个写入正确率,2/200,那就是1%没有正常读写
这并不代表程序 ...

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_DATA=0x00;
                IAP_CONTR=0x80;                //使能IAP
                IAP_TPS = 12;                   //设置擦出等待参数 12MHz 以下               
                IAP_CMD=1;                        //设置IAP读命令
                IAP_ADDRL=addr;                //设置IAP低地址
                IAP_ADDRH=addr>>8;        //设置IAP高地址
                IAP_TRIG=0x5a;               //写触发命令
                IAP_TRIG=0xa5;                //写触发命令
                _nop_();
                dat=IAP_DATA;                        //读命令数据
                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;           //写触发命令
                IAP_TRIG=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;           //写触发命令
                IAP_TRIG=0xa5;                //写触发命令
                _nop_();
                IapIdle();                        //关闭IAP功能
}
这部分是官方例程
void WriteDATA_FLASH_START_ADDRESS1()
{       
                IapErase(0x0000);
                IapProgram(0x0000,0);
                IapProgram(0x0002,128);
                delaynms(30);
               
                IapProgram(0x0010,sc/100);
                IapProgram(0x0012,sc%100);
                delaynms(30);
               
                IapProgram(0x0020,0);
                IapProgram(0x0022,127);
                delaynms(30);
}
这是我的写入,数值我改了方便测试
void Read_dat1()
{   
                sw=IapRead(0x0000);
                sw=sw*100+IapRead(0x0002);
               
                sc=IapRead(0x0010);
                sc=sc*100+IapRead(0x0012);
               
                p =IapRead(0x0020);
                p=p*100+IapRead(0x0022);
}
这部分读,然后再到显示部分。这里就不放出来了。实际显示SW读出的值无限大,P就是正常的127
作者: 依然犹在    时间: 2021-7-9 14:43
没有大神了吗 求帮助啊 指导啊
作者: wulin    时间: 2021-7-9 16:54
依然犹在 发表于 2021-7-9 14:43
没有大神了吗 求帮助啊 指导啊

如果别的芯片正常,就这两个芯片经重复烧写仍然是这个问题,有可能是芯片不良。否则通常是程序问题。虽然这款芯片没有用过,但STC的其它型号用了上万并且使用了EEPROM读写,没有遇到类似问题。楼主仔细看看是不是数据类型使用不当或者中断干扰了EEPROM读写。
作者: shumivan    时间: 2021-7-9 17:41
是不是像EEPROM芯片一样有读写buf限制




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1