- 打卡等级:初来乍到
- 打卡总天数:2
- 最近打卡:2023-12-06 11:43:41
新手上路
- 积分
- 29
|
本帖最后由 tangzy0202 于 2023-12-4 15:34 编辑
请教各位老师,我在使用STC8H8K64U读写EEPROM遇到个问题:写入一个字节数据,马上读取没问题,如果写入2个字节,再分别读取这2个字节,读取到的数据都是最后写入的字节数据,读取其他未写入地址(包括不同扇区),读取的也是最后写入的数据,感觉最后一个数据把EEPROM覆盖了似的,请教各位老师这是什么情况?原来在STC15芯片上使用一切正常,程序如下
/********************************************************************
* 函数名 : IapEraseSector(扇区擦除、addr:擦除扇区起始地址)
/***************************************************************|***/
void IapEraseSector(unsigned int addr) //指定扇区擦除
{
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 35; //设置等待参数35MHz
IAP_CMD = 3; //设置IAP扇区擦除命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
IapIdle();
}
/********************************************************************
* 函数名 : IapProgramByte(写一字节数据到ISP/IAP/EEPROM指定地址、addr:地址,dat:数据)
/***************************************************************|***/
void IapProgramByte(unsigned int addr, unsigned char dat) //写一字节数据到EEPROM指定地址
{
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 35; //设置等待参数35MHz
IAP_CMD = 2; //设置IAP字节编程命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_DATA = dat; //写ISP/IAP/EEPROM数据
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
IapIdle();
}
/********************************************************************
* 函数名 : IapReadByte(从ISP/IAP/EEPROM指定地址读取一字节)
/***************************************************************|***/
unsigned char IapReadByte(unsigned int addr) //从EEPROM指定地址读取一字节
{
unsigned char dat; //数据缓冲区
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 35; //设置等待参数35MHz
IAP_CMD = 1; //设置IAP字节读命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
dat = IAP_DATA; //读ISP/IAP/EEPROM数据
IapIdle(); //关闭IAP功能
return dat; //返回
}
/********************************************************************
* 函数名 : IapIdle(关闭IAP)
/***************************************************************|***/
void IapIdle() //关闭IAP
{
IAP_CONTR = 0; //关闭IAP功能
IAP_CMD = 0; //清除命令寄存器
IAP_TRIG = 0; //清除触发寄存器
IAP_ADDRH = 0x80; //将地址设置到非IAP区域
IAP_ADDRL = 0;
}
/********************************************************************
* 函数名 : IapWriteSetup(从指定地址写入设置参数、1扇区512字节)
/***************************************************************|***/
void IapWriteSetup() //从指定地址写入设置参数:IapWRa,IapWRb,IapWRc,IapWRd
{
IapEraseSector(0xE800);
IapWRa = 23;
IapWRb = 45;
IapWRc = 0;
IapWRd = 0;
IapProgramByte(0xE800,IapWRa); //写一个字节
Delay_1ms(1);
IapProgramByte(0xE802,IapWRb); //写一个字节
Delay_1ms(1);
IapWRc = IapReadByte(0xE800); //读一个字节
Delay_1ms(1);
IapWRd = IapReadByte(0xE802); //读一个字节
Delay_1ms(1);
}
|
|