社区
单片机/工控
帖子详情
单片机写内部EEPROM问题,急求!
Dreamer_LX灵
2012-02-08 10:52:17
单片机串口接收一串数据,在单片机串口中断服务程序中,先判断,之后写入单片机的EEPROM,擦出成功了,但是为什么就是写不进单片机的EEPROM呢?这是什么原因啊?
...全文
237
8
打赏
收藏
单片机写内部EEPROM问题,急求!
单片机串口接收一串数据,在单片机串口中断服务程序中,先判断,之后写入单片机的EEPROM,擦出成功了,但是为什么就是写不进单片机的EEPROM呢?这是什么原因啊?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Dreamer_LX灵
2012-05-09
打赏
举报
回复
现在也没去解决这个问题了,很可能是我程序的问题,后来我是把数据暂存到外部RAM中的。。。
sophyyoung
2012-02-13
打赏
举报
回复
你先看写 EEPROM 的程序是否正确,如果你擦除只在 串口接收程序里,而你都擦除成功了,很可能是 写 EEPROM 的程序错了。
标题都写 EEPROM 写问题了,怎么帖的是 串口程序。
Dreamer_LX灵
2012-02-10
打赏
举报
回复
[Quote=引用 5 楼 nandou 的回复:]
你先别管接收串口数据,先在上电初始化后把固定的一组数据写入EEPROM然后读出来用串口发送出去查看对不对。
对EEPROM操作的程序你可以找别人实验OK的代码来测试。
[/Quote]
这样发出来的数据是完全正确的,所以现在很纳闷啊,串口可以接收到数据,但是就是写不进EEPROM
nandou
2012-02-10
打赏
举报
回复
你先别管接收串口数据,先在上电初始化后把固定的一组数据写入EEPROM然后读出来用串口发送出去查看对不对。
对EEPROM操作的程序你可以找别人实验OK的代码来测试。
AnYidan
2012-02-09
打赏
举报
回复
每家片内的 EEPROM 写法可能不同,比如 microchip 就要求禁止中断并有特殊的顺序,查阅manual
sunwill_chen
2012-02-09
打赏
举报
回复
EEPROM不需要擦除啊。
你的SMBUS是硬件的还是模拟的,如果是硬件的最好不好再串口中断中直接操作,中断先置个标志位在外面主循环中写入EEPROM。
Dreamer_LX灵
2012-02-09
打赏
举报
回复
if (RI)
{
RI=0;
if(temp1==1)
{ //senddata(SBUF);//把数据从这里发送出来时是没有问题
byte_write(0x0000+bj,SBUF);
bj++;
if(SBUF==0x7F) {temp=0; temp1=0;bj=0;}
}
else if(temp11==1)
{ //senddata(SBUF);
byte_write(0x1600+bj,SBUF);
bj++;
if(SBUF==0x7F) {temp=0; temp11=0; bj=0;}
}
else if(temp111==1)
{ senddata(SBUF);
byte_write(0x1C00+bj,SBUF);
bj++;
if(SBUF==0x7F) {temp=0; temp111=0; bj=0;}
}
else if(temp1111==1)
{ senddata(SBUF);
byte_write(0x2000+bj,SBUF);
bj++;
if(SBUF==0x7F) {temp=0; temp1111=0; bj=0;}
}
else
{;}
if(temp==0)
{
if(GetRxLen==0)
{
if(SBUF==0x7E)
{
buff[GetRxLen]=SBUF;
GetRxLen++;
}
else
GetRxLen=0;
}
else
{
if(GetRxLen<8)
{
buff[GetRxLen]=SBUF;
GetRxLen++;
}
else
{
if(buff[0]==0x7E && buff[3]==0x10)
{
if(buff[7]==0x21)
{
SectorErase(0x0000);
byte_write(0x0000,SBUF);
bj++;
//senddata(SBUF);
temp=1;
temp1=1;
GetRxLen=0;
}
else if(buff[7]==0x22)
{
SectorErase(0x1600);
byte_write(0x1600,SBUF);
//senddata(SBUF);
bj++;
temp=1;
temp11=1;
GetRxLen=0;
}
else if(buff[7]==0x23)
{
SectorErase(0x1C00);
byte_write(0x1C00,SBUF);
//senddata(SBUF);
bj++;
temp=1;
temp111=1;
GetRxLen=0;
}
else if(buff[7]==0x24)
{
SectorErase(0x2000);
byte_write(0x2000,SBUF);
//senddata(SBUF);
bj++;
temp=1;
temp1111=1;
GetRxLen=0;
}
else
{;}
}
else
{
;//这里还有程序未写完
}
}
}
}
}
else
TI=0;
}
Dreamer_LX灵
2012-02-09
打赏
举报
回复
[Quote=引用 2 楼 anyidan 的回复:]
每家片内的 EEPROM 写法可能不同,比如 microchip 就要求禁止中断并有特殊的顺序,查阅manual
[/Quote]
以下是串口接收中断服务程序:发送的协议是:
7E 10 01 10 01 01 05 21+有效数据+校验+7F
7E 10 01 10 01 01 10 22+有效数据+校验+7F
7E 10 01 10 01 01 2F 23+有效数据+校验+7F
7E 10 01 10 01 01 3D 24+有效数据+校验+7F
(这些只是部分协议)
void serial() interrupt 4 using 3 // 串口中断服务程序
{
if (RI)
{
RI=0;
if(temp1==1)
{ //senddata(SBUF);//把数据从这里发送出来时是没有问题
byte_write(0x0000+bj,SBUF);
bj++;
if(SBUF==0x7F) {temp=0; temp1=0;bj=0;}
}
else if(temp11==1)
{ //senddata(SBUF);
byte_write(0x1600+bj,SBUF);
bj++;
if(SBUF==0x7F) {temp=0; temp11=0; bj=0;}
}
else if(temp111==1)
{ senddata(SBUF);
byte_write(0x1C00+bj,SBUF);
bj++;
if(SBUF==0x7F) {temp=0; temp111=0; bj=0;}
}
else if(temp1111==1)
{ senddata(SBUF);
byte_write(0x2000+bj,SBUF);
bj++;
if(SBUF==0x7F) {temp=0; temp1111=0; bj=0;}
}
else
{;}
if(temp==0)
{
if(GetRxLen==0)
{
if(SBUF==0x7E)
{
buff[GetRxLen]=SBUF;
GetRxLen++;
}
else
GetRxLen=0;
}
else
{
if(GetRxLen<8)
{
buff[GetRxLen]=SBUF;
GetRxLen++;
}
else
{
if(buff[0]==0x7E && buff[3]==0x10)
{
if(buff[7]==0x21)
{
SectorErase(0x0000);
byte_write(0x0000,SBUF);
bj++;
//senddata(SBUF);
temp=1;
temp1=1;
GetRxLen=0;
}
else if(buff[7]==0x22)
{
SectorErase(0x1600);
byte_write(0x1600,SBUF);
//senddata(SBUF);
bj++;
temp=1;
temp11=1;
GetRxLen=0;
}
else if(buff[7]==0x23)
{
SectorErase(0x1C00);
byte_write(0x1C00,SBUF);
//senddata(SBUF);
bj++;
temp=1;
temp111=1;
GetRxLen=0;
}
else if(buff[7]==0x24)
{
SectorErase(0x2000);
byte_write(0x2000,SBUF);
//senddata(SBUF);
bj++;
temp=1;
temp1111=1;
GetRxLen=0;
}
else
{;}
}
else
{
;//这里还有程序未写完
}
}
}
}
}
else
TI=0;
}
0基础一个月学会51
单片机
-朱有鹏老师
单片机
系列视频课程第一季
《零基础一个月学会51
单片机
》是《朱有鹏老师
单片机
完全学习系列课程》的第一部分,本课程适合所有希望入门
单片机
软件开发的同学,可谓零要求、无门槛、系统化、包学会。后续还有第2至第5季,朱老师会努力打造一个从零开始系统学习成为
单片机
开发高手的学习路线。第一季的主要内容包括:《朱有鹏老师
单片机
系列课程》的整体规划、课程设计、学习路线介绍,
单片机
学习的意义、
单片机
与物联网的关系,51
单片机
工作原理、电路原理图识别、C语言基础知识等学习
单片机
软件开发的基础知识,常用开发工具Keil uVision软件的使用、模拟单步调试方法、ISP下载方式与原理讲解,针对51
单片机
编程的零基础C语言讲解、学会
单片机
同时入门C语言,
单片机
和嵌入式系统常用基本外设(如LED、蜂鸣器、数码管、按键、DS1302实时时钟、38译码器、AD/DA转换器、串口、RS232/RS485通讯、定时器、液晶显示器、步进电机)的原理及编程控制方法。
51
单片机
读
写
内部
EE
PRO
M详解
文档共包含三个程序。 第一个程序最简单易懂,看懂了基本就会读
写
51
单片机
内部
EE
PRO
M了。 第二个程序和第一个读
写
EE
PRO
M原理差不多,包含有LCD1602操作方法,有
写
字符串的方法。 第三个程序在原有基础上增加了外部中断功能,细心的人会发现,操作
内部
EE
PRO
M过程会将总中断关闭,实际上程序要用到中断时只需在原有的
EE
PRO
M操作后加上开总中断即可。 验证第二、第三个程序时需按程序内...
51
单片机
实战教程(16 内置
EE
PRO
M读
写
)
STC
单片机
大部分
内部
集成了
EE
PRO
M,也有部分
单片机
没有专门的
EE
PRO
M,但可以将用户程序区存储用户程序后剩余的Flash当
EE
PRO
M使用,如IAP15W4K61S4,IRC15W4K63S4。
EE
PRO
M擦
写
次数在10万次以上。
EE
PRO
M擦
写
是按扇区擦
写
的,需要一次擦
写
的数据尽量放在同一扇区。停电时
EE
PRO
M不会丢失数据,可用以保存一些设置参数,或在停电关机前保存本次运行的部分参数,供下次运行时使用。本文介绍了
EE
PRO
M相关寄存器,及
EE
PRO
M函数。
STC12C5A60S2系列
单片机
内部
EE
PRO
M
文章目录
单片机
内部
EE
PRO
M介绍例程参考
单片机
内部
EE
PRO
M介绍 记得我在学习STC89系列
单片机
的时候,曾经学到一个内容是
EE
PRO
M的读
写
,当时使用的是AT2402芯片。
EE
PRO
M(Electrically Erasable
Pro
grammable read only memory)是指带电可擦可编程只读存储器 是一种掉电后数据不丢失的存储芯片 其实,STC89C51,STC89C52
内部
都自带有2Kd
EE
PRO
M。STC
单片机
是利用IAP技术实现
EE
PRO
M,
内部
Flash擦
写
次数可达1
【出坑笔记】正确使用STC
单片机
内部
EE
PRO
M
使用STC12系列
单片机
内部
EE
PRO
M时自己入的一个坑,这里记录分享一下。
单片机/工控
27,375
社区成员
28,769
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章