找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3176|回复: 11
打印 上一主题 下一主题
收起左侧

STC8G2K64S4单片机IAP读写问题

[复制链接]
跳转到指定楼层
楼主
ID:588737 发表于 2021-7-2 17:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最经刚用了一款STC的单片机STC8G2K64S4 ,数量200片,目前发现其中有两片的EEPROM用IAP方式读写时会出问题。具体数据就是到数值超过127时,存入或者读出的数据就变了,不知道大家有没有遇到过
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:451718 发表于 2021-7-2 18:39 | 只看该作者
8G系列的IAP读写和  15系列的不一样哦。 你的底层代码是用的8G系列专用的么?
回复

使用道具 举报

板凳
ID:948738 发表于 2021-7-3 21:08 | 只看该作者
那就是那两片有问题呗...
回复

使用道具 举报

地板
ID:588737 发表于 2021-7-5 08:20 | 只看该作者
robinsonlin 发表于 2021-7-2 18:39
8G系列的IAP读写和  15系列的不一样哦。 你的底层代码是用的8G系列专用的么?

是的。底层程序,就是8G的 。这个不是用8G专用的也不会有198片成功的事。
回复

使用道具 举报

5#
ID:588737 发表于 2021-7-5 08:22 | 只看该作者
464645465465465 发表于 2021-7-3 21:08
那就是那两片有问题呗...

我关心的问题就是,是不是那两片一定有问题,或者说怎么通过程序来控制。我也问了我的同事,他说之前的12C5410AD就有这个问题,然后他把存入的数据控制在100以内,就行了。要是这样的话。。
回复

使用道具 举报

6#
ID:588737 发表于 2021-7-5 09:06 | 只看该作者
robinsonlin 发表于 2021-7-2 18:39
8G系列的IAP读写和  15系列的不一样哦。 你的底层代码是用的8G系列专用的么?

是的,不然那198片也都是不对的了。
回复

使用道具 举报

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

使用道具 举报

8#
ID:856401 发表于 2021-7-5 19:55 来自手机 | 只看该作者
在写入数据的时候断电了
回复

使用道具 举报

9#
ID:588737 发表于 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
回复

使用道具 举报

10#
ID:588737 发表于 2021-7-9 14:43 | 只看该作者
没有大神了吗 求帮助啊 指导啊
回复

使用道具 举报

11#
ID:213173 发表于 2021-7-9 16:54 | 只看该作者
依然犹在 发表于 2021-7-9 14:43
没有大神了吗 求帮助啊 指导啊

如果别的芯片正常,就这两个芯片经重复烧写仍然是这个问题,有可能是芯片不良。否则通常是程序问题。虽然这款芯片没有用过,但STC的其它型号用了上万并且使用了EEPROM读写,没有遇到类似问题。楼主仔细看看是不是数据类型使用不当或者中断干扰了EEPROM读写。
回复

使用道具 举报

12#
ID:81196 发表于 2021-7-9 17:41 | 只看该作者
是不是像EEPROM芯片一样有读写buf限制
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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