单片机内部e2prom读写问题
如下程序:/*主函数*/voidmain(){while(1){Stc89c52rcE2prom_ByteWrite(0x2000,45);//写入成功Stc89c52r...
如下程序:
/*主函数*/
void main(){
while(1){
Stc89c52rcE2prom_ByteWrite(0x2000,45); //写入成功
Stc89c52rc_SectorErase(0x2000); //擦不掉
Stc89c52rcE2prom_ByteWrite(0x21ff,56); //写入成功
tem=Stc89c52rcE2prom_ByteRead(0x21ff); //读数是56
tem=Stc89c52rcE2prom_ByteRead(0x2000); //读数还是56
}
}
///////////////////////扇区数据擦除/////////////
void Stc89c52rc_SectorErase(uint sector_addr) {
uint iSectorAddr;
iSectorAddr = (sector_addr&0xfe00); //获取扇区的地址
ISP_ADDRH = (uchar)(iSectorAddr>>8);
ISP_ADDRL = 0x00;
ISP_CMD = ISP_CMD & 0xF8; //清空低3位
ISP_CMD = ISP_CMD | EraseCommand; //擦除命令3
ISP_trigger(); //触发执行
ISPIAP_DIS(); //关闭ISPIAP功能
} 展开
/*主函数*/
void main(){
while(1){
Stc89c52rcE2prom_ByteWrite(0x2000,45); //写入成功
Stc89c52rc_SectorErase(0x2000); //擦不掉
Stc89c52rcE2prom_ByteWrite(0x21ff,56); //写入成功
tem=Stc89c52rcE2prom_ByteRead(0x21ff); //读数是56
tem=Stc89c52rcE2prom_ByteRead(0x2000); //读数还是56
}
}
///////////////////////扇区数据擦除/////////////
void Stc89c52rc_SectorErase(uint sector_addr) {
uint iSectorAddr;
iSectorAddr = (sector_addr&0xfe00); //获取扇区的地址
ISP_ADDRH = (uchar)(iSectorAddr>>8);
ISP_ADDRL = 0x00;
ISP_CMD = ISP_CMD & 0xF8; //清空低3位
ISP_CMD = ISP_CMD | EraseCommand; //擦除命令3
ISP_trigger(); //触发执行
ISPIAP_DIS(); //关闭ISPIAP功能
} 展开
展开全部
这样写不对的,主程序进入:先擦出扇区,在写入然后在读出来
while{
Stc89c52rc_SectorErase(0x2000); //擦不掉
Stc89c52rcE2prom_ByteWrite(0x2000,45); //写入成功
Stc89c52rcE2prom_ByteWrite(0x21ff,56); //写入成功
加个延时
tem=Stc89c52rcE2prom_ByteRead(0x21ff); //读数是56
num=Stc89c52rcE2prom_ByteRead(0x2000); //读数还是56
}
用两个变量来赋值,或者用数组赋值
看看我写的EEPROM擦除扇区,写入-读出
读数据
INT8U Read_Flash_Byte(INT16U addr)
{
IAP_ADDRH = (INT8U)(addr >> 8);
IAP_ADDRL = (INT8U)(addr);
EA = 0;
IAP_CONTR = 0x80;
IAP_CMD = 0x01;
IAP_TRIG = 0x46;//0x5A;
IAP_TRIG = 0xB9;//0xA5;
_nop_();
IAP_CONTR = 0x00;
IAP_CMD = 0x00;
EA = 1;
return IAP_DATA;
}
写入数据
void Write_Flash_Byte(INT8U byte, INT16U addr)
{
IAP_DATA = byte;
IAP_ADDRH = (INT8U)(addr >> 8);
IAP_ADDRL = (INT8U)(addr);
EA = 0;
IAP_CONTR = 0x80;
IAP_CMD = 0x02;
IAP_TRIG = 0x46;//0x5A;
IAP_TRIG = 0xB9;//0xA5;
_nop_();
IAP_CONTR = 0x00;
IAP_CMD = 0x00;
EA = 1;
}
擦除扇区
void Erase_Flash_Sector(INT16U addr)
{
IAP_ADDRH = (INT8U)(addr >> 8);
IAP_ADDRL = (INT8U)(addr);
EA = 0;
IAP_CONTR = 0x80;
IAP_CMD = 0x03;
IAP_TRIG = 0x46;//0x5A;
IAP_TRIG = 0xB9;//0xA5;
_nop_();
IAP_CONTR = 0x00;
IAP_CMD = 0x00;
EA = 1;
}
while{
Stc89c52rc_SectorErase(0x2000); //擦不掉
Stc89c52rcE2prom_ByteWrite(0x2000,45); //写入成功
Stc89c52rcE2prom_ByteWrite(0x21ff,56); //写入成功
加个延时
tem=Stc89c52rcE2prom_ByteRead(0x21ff); //读数是56
num=Stc89c52rcE2prom_ByteRead(0x2000); //读数还是56
}
用两个变量来赋值,或者用数组赋值
看看我写的EEPROM擦除扇区,写入-读出
读数据
INT8U Read_Flash_Byte(INT16U addr)
{
IAP_ADDRH = (INT8U)(addr >> 8);
IAP_ADDRL = (INT8U)(addr);
EA = 0;
IAP_CONTR = 0x80;
IAP_CMD = 0x01;
IAP_TRIG = 0x46;//0x5A;
IAP_TRIG = 0xB9;//0xA5;
_nop_();
IAP_CONTR = 0x00;
IAP_CMD = 0x00;
EA = 1;
return IAP_DATA;
}
写入数据
void Write_Flash_Byte(INT8U byte, INT16U addr)
{
IAP_DATA = byte;
IAP_ADDRH = (INT8U)(addr >> 8);
IAP_ADDRL = (INT8U)(addr);
EA = 0;
IAP_CONTR = 0x80;
IAP_CMD = 0x02;
IAP_TRIG = 0x46;//0x5A;
IAP_TRIG = 0xB9;//0xA5;
_nop_();
IAP_CONTR = 0x00;
IAP_CMD = 0x00;
EA = 1;
}
擦除扇区
void Erase_Flash_Sector(INT16U addr)
{
IAP_ADDRH = (INT8U)(addr >> 8);
IAP_ADDRL = (INT8U)(addr);
EA = 0;
IAP_CONTR = 0x80;
IAP_CMD = 0x03;
IAP_TRIG = 0x46;//0x5A;
IAP_TRIG = 0xB9;//0xA5;
_nop_();
IAP_CONTR = 0x00;
IAP_CMD = 0x00;
EA = 1;
}
展开全部
芯片是STC89C52吗?
内部EEPROM地址要搞清楚,哪些是可写可以擦的,哪些不能擦写的。
写数据前,需要擦除。
另就是确定看你是不是真的写进去了。
内部EEPROM地址要搞清楚,哪些是可写可以擦的,哪些不能擦写的。
写数据前,需要擦除。
另就是确定看你是不是真的写进去了。
追问
是STC89C52,写地址是0x2000,擦地址也是0x2000,另外读地址即便是0x21ff读出的数据也是我最后一次存的数据,为什么?
追答
刚开始没注意看你的擦除程序,你的擦除程序是有错误的。
给你看下我的擦除程序
void earse_one_sector_in51_ctr(uint eeprom_page_addr)
{
EA=0;
IAP_CONTR=0X83;
IAP_CMD =erase_cmd;//字节擦除命令,, IAP_CMD
IAP_ADDRH=eeprom_page_addr>>8;
IAP_ADDRL=eeprom_page_addr;
IAP_TRIG=0X5a;
IAP_TRIG=0Xa5;//
//delay_nus(2);
Nop();
Nop();
IAP_CONTR=0X00;
IAP_CMD =0X00;
IAP_TRIG=0X00;
IAP_ADDRH=0Xff;
IAP_ADDRL=0Xff;
EA=1;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询