单片机写内部EEPROM问题,急求!

Dreamer_LX灵 2012-02-08 10:52:17
单片机串口接收一串数据,在单片机串口中断服务程序中,先判断,之后写入单片机的EEPROM,擦出成功了,但是为什么就是写不进单片机的EEPROM呢?这是什么原因啊?
...全文
237 8 打赏 收藏 转发到动态 举报
写回复
用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;
}

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧