这样写不对的,主程序进入:先擦出扇区,在写入然后在读出来
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地址要搞清楚,哪些是可写可以擦的,哪些不能擦写的。
写数据前,需要擦除。
另就是确定看你是不是真的写进去了。