读写双字节时,是先写入8位,读出,然后改地址,再写入8位,读出,还是写入两个8单字节后,再读出(即 写-读-写-读模式还是写-写-读-读)。我现在遇到的问题是:我用分别写入高低8位后,再分别读这两个地方的值的时候(写-写-读-读),读出来的值是我最后一次写入的值。。。a 和c 都是unsigned int 型a=totaltime();//假设这条语句执行以后a的值为0x0001; ah=a/256;//0x00; al=a%256;//0x01; sector_erase(); byte_program(ah,0x28,0x00);//写入0x00; byte_program(al,0x28,0x01);//写入0x01; c=byte_read(0x28,0x00) ;//这里读出的值为什么会是0x0001 c=c*256+byte_read(0x28,0x01);//这里读出的最后的值变成0x0101;c读出以后的值是0x0101;这是为什么。。。假设a执行后第一条后的值是0xabcd;到最后c的值尽然是0xcdcd;为什么呢???感觉我的地址参数写的没用啊。。。 |
RE:关于STC89c52单片机eeprom的双字节读写问题
union double_byte
{
uint long_data;
uchar single[2];
}segment;
uchar Byte_Read(uint addr); //读一字节,调用前需打开ISP 功能
void Byte_Program(uint addr ,uchar Write_data); //字节编程,调用前需打开ISP 功能
void Sector_Erase(uint add); //擦除扇区
void Isp_disable(void)
{ ISP_CONTR = 0; //禁止ISP/IAP 操作
ISP_CMD = 0; //去除ISP/IAP 命令
ISP_TRIG = 0; //防止 ISP/IAP 命令误触发
ISP_ADDRH = 0xff; //地址指向非EEPROM地址区,防止误操作
ISP_ADDRL = 0xff; //地址指向非EEPROM地址区,防止误操作
}
//读一字节,调用前需打开ISP 功能,入口PTR = 字节地址,返回:A = 读出字节
uchar Byte_Read(uint addr)
{
uchar Read_ISP_DATA;
ISP_ADDRL = addr; //地址低位
ISP_ADDRH = addr>>8; //送地址高位
EA = 0; /* 关中断 */
ISP_CONTR = 0x81; /*20M,是0x80 orl 1 */
ISP_CMD = 1; // 1表示字节读
ISP_TRIG = 0x46; //先送0x46再送 0xb9 ISP/IAP 触发寄存器,每次都需要如此
ISP_TRIG = 0xb9; //送完0xb9后 ISP/IAP 立即被触发启动
_nop_(); //空指令
_nop_(); //空指令
Isp_disable();
EA = 1; /* 开中断 */
Read_ISP_DATA=ISP_DATA;
return(Read_ISP_DATA);
}
uint double_byte_Read(uint addr)
{ uchar byte_h, byte_l;
byte_h=Byte_Read(addr);
byte_l=Byte_Read(addr+1);
segment.single[0]=byte_h;
segment.single[1]=byte_l;
return(segment.long_data);
}
//字节编程,调用前需打开IAP 功能,入口PTR = 字节地址, A= 须编程字节的数据
void Byte_Program(uint addr ,uchar Write_data)
{ ISP_DATA = Write_data;
ISP_ADDRL = addr; //地址低位
ISP_ADDRH = addr>>8; //送地址高位
EA = 0; /* 关中断 */
ISP_CONTR = 0x81;
ISP_CMD = 2; //送扇区命令
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
_nop_();
_nop_();
Isp_disable();
EA = 1; /* 开中断 */
}
void double_byte_write(uint addr ,uint Write_data)
{ uchar byte_h, byte_l;
segment.long_data=Write_data;
byte_h = segment.single[0];
byte_l = segment.single[1];
Byte_Program(addr,byte_h);
Byte_Program(addr+1,byte_l);
}