社区
单片机/工控
帖子详情
单片机写内部EEPROM问题,急求!
Dreamer_LX灵
2012-02-08 10:52:17
单片机串口接收一串数据,在单片机串口中断服务程序中,先判断,之后写入单片机的EEPROM,擦出成功了,但是为什么就是写不进单片机的EEPROM呢?这是什么原因啊?
...全文
244
8
打赏
收藏
单片机写内部EEPROM问题,急求!
单片机串口接收一串数据,在单片机串口中断服务程序中,先判断,之后写入单片机的EEPROM,擦出成功了,但是为什么就是写不进单片机的EEPROM呢?这是什么原因啊?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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;
}
51
单片机
读
写
内部
EE
PRO
M详解
文档共包含三个程序。 第一个程序最简单易懂,看懂了基本就会读
写
51
单片机
内部
EE
PRO
M了。 第二个程序和第一个读
写
EE
PRO
M原理差不多,包含有LCD1602操作方法,有
写
字符串的方法。 第三个程序在原有基础上增加了外部中断功能,细心的人会发现,操作
内部
EE
PRO
M过程会将总中断关闭,实际上程序要用到中断时只需在原有的
EE
PRO
M操作后加上开总中断即可。 验证第二、第三个程序时需按程序内...
51
单片机
内部
集成
EE
PRO
M使用示例
51
单片机
内部
集成
EE
PRO
M使用示例。
pic
单片机
c语言读
ee
pro
m,PIC
单片机
读
内部
EE
PRO
M的读
写
操作子程序
我也来凑个热闹:#define ReadRomString_CALL#define WriteRomString_CALL//*************************************// 函数名称:ReadRomByte// 函数功能:从ROM的某一地址读数据// 入口参数:所读数据的地址// 出口参数:所读地址的数据//***************...
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操作
问题
日常分享
最近再用stc15f2K60s2做项目,其中用到了stc
内部
的
EE
PRO
M操作(大小1K,两个扇区,详细如上图),翻看其器件手册借鉴其例程
写
了一个测试程序。但是发现了一个
问题
,在第一次测试程序时好用,再在原地址重新
写
别的数据时就不好用了。因为之前没怎么用过
EE
PRO
M,所以使我比较迷惑。 当我改变其
写
数据的地址,再
写
数据时,发现好用,但是再次在这个地址...
单片机/工控
27,510
社区成员
28,796
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章