问题:现定义 unsigned int ledld[4]=0; 使用eeprom读取数据的时候发数组里面的数字大于900,然后发现读取的数据是错误的。后续反复试验发现数字只要大于640的话就无法读取正确的值,低于640可以正常读取。
想问问有没有遇到这种情况的,帮我解答一下,谢谢。后面又用了STC8H3K64S4这个单片机也是一样的问题 |
void IapIdle()
{
IAP_CONTR = 0; //关闭IAP功能
IAP_CMD = 0; //清除命令寄存器
IAP_TRIG = 0; //清除触发寄存器
IAP_ADDRH = 0x80; //将地址设置到非IAP区域
IAP_ADDRL = 0;
}
char ispdu(unsigned int addr)
{
char dat;
IAP_CONTR = 0x82; //使能IAP
IAP_TPS = 0x16; //22.184M晶振
IAP_CMD = 1; //设置IAP读命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_();
dat = IAP_DATA; //读IAP数据
IapIdle(); //关闭IAP功能
return dat;
}
void ispxie(unsigned int addr,unsigned char dat)
{
IAP_CONTR = 0x82; //使能IAP
IAP_TPS = 0x16;
IAP_CMD = 2; //设置IAP写命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_DATA = dat; //写IAP数据
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_();
IapIdle(); //关闭IAP功能
}
void ispca(unsigned int addr)
{
IAP_CONTR = 0x82; //使能IAP
IAP_TPS = 0x16;
IAP_CMD = 3; //设置IAP擦除命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //
IapIdle(); //关闭IAP功能
}
之前用上面的程序存的都是8位数据,从没出现过问题,现在读写16位数据就有问题了,下面就是读写16位数据的程序
ispca(0X0000); //擦除与写入16位数据
ispxie(0x0010,ledld[0]>>8);
ispxie(0x0011,ledld[0]);
ispxie(0x0012,ledld[1]>>8);
ispxie(0x0013,ledld[1]);
ispxie(0x0014,ledld[2]>>8);
ispxie(0x0015,ledld[2]);
ispxie(0x0016,ledld[3]>>8);
ispxie(0x0017,ledld[3]);
ledld[0]=(ispdu(0x0010)<<8) | ispdu(0x0011); //读取16位数据
ledld[1]=(ispdu(0x0012)<<8) | ispdu(0x0013);
ledld[2]=(ispdu(0x0014)<<8) | ispdu(0x0015);
ledld[3]=(ispdu(0x0016)<<8) | ispdu(0x0017);
现在就是数字大于640擦除写入,然后读取出来的数据是错误的;只要小于640就能读取正确的数据。望各位能帮我解答一下。
|