8H8K64U的EEPROM可以写入地址,但是掉电插拔后值丢失
这是我的EEPROM设置,招贴后看了大神们说尝试了增加TRIG,并且再执行IAP_TRIG前关闭总中断,都尝试了之后还是在重新插拔usb后值丢失//清除寄存器指令void Iapclearcommand()
{
IAP_CONTR = 0;
IAP_CMD = 0;
IAP_TRIG= 0;
IAP_ADDRH = 0X80;
IAP_ADDRL = 0;
}
//读操作
char Iapread(int address)
{
char dat = 0;
IAP_CONTR = 0x80;
IAP_TPS = 24;
IAP_CMD = 1;
IAP_ADDRL = address;
IAP_ADDRH = address >> 8;
//EA = 0;
IAP_TRIG= 0X5A;
IAP_TRIG= 0XA5;
IAP_TRIG= 0X5A;
IAP_TRIG= 0XA5;
//EA = 1;
dat = IAP_DATA;
Iapclearcommand();
return dat;
}
//写操作
void Iapwrite(int addr , char dat)
{
IAP_CONTR = 0X80;
IAP_TPS = 24;
IAP_CMD = 2;
IAP_ADDRL = addr;
IAP_ADDRH = addr >> 8;
IAP_DATA = dat;
//EA = 0;
IAP_TRIG = 0X5A;
IAP_TRIG = 0XA5;
IAP_TRIG= 0X5A;
IAP_TRIG= 0XA5;
//EA = 1;
Iapclearcommand();
}
//擦除操作
void IapErase(int addr)
{
IAP_CONTR = 0X80;
IAP_TPS = 24;
IAP_CMD = 3;
IAP_ADDRL = addr;
IAP_ADDRH = addr >> 8;
EA = 0;
IAP_TRIG= 0X5A;
IAP_TRIG= 0XA5;
EA = 1;
Iapclearcommand();
}下面的是我用usb hound捕捉的输入报告
上面的后两位是对应不同扇区的两个eeprom地址的值,再官方的上位机我设置的是FF
在我自己做的上位机可以改变对应存储的eeprom地址的值,再usb hound中也会显示出来
这是我的stc8h下位机部分代码,是在收到对应上位机的按钮时执行的 操作,通过bus hound可以看到已经更改了对应的值,为什么在重新上电之后,对应eeprom地址的值就回到默认的0xff了呢?
switch (command)
{
case 0x31 :
usb_write_reg(OUTCSR1, 0);
eepmin = UsbOutBuffer;
//mindrive = (float)eepmin / 100 ;
IapErase(0x20);
Iapwrite(0x20 ,eepmin);
break;
case 0x32:
usb_write_reg(OUTCSR1, 0);
eepmax = UsbOutBuffer;
//
IapErase(0x02C8);
Iapwrite(0x02C8 ,eepmax);
//maxdrive = (float)UsbOutBuffer / 100;
break;
default:
break;
}
求各位大神指点小弟!{:4_201:}{:2_33:}
#include <absacc.h>
#define IAP_TPS_ 24 //等待参数
#define IAP_OFFSET 0xFE00 //EEPROM地址
void Iap_Idle(void)
{
IAP_CONTR&=~IAPEN;
IAP_CMD=IAP_IDL;
IAP_TRIG=0x00;
IAP_ADDRH=0x80;
IAP_ADDRL=0x00;
}
unsigned char Iap_Read_Byte(unsigned char sector,unsigned int addr)
{
return *(CBYTE+IAP_OFFSET+sector*0x0200+addr);
}
//unsigned char Iap_Read_Byte(unsigned char sector,unsigned int addr)
//{
// unsigned char dat;
// unsigned int add;
// add=sector*0x0200+addr;
// IAP_CONTR|=IAPEN;
// IAP_TPS=IAP_TPS_;
// IAP_CMD=IAP_READ;
// IAP_ADDRL=add;
// IAP_ADDRH=add>>8;
// IAP_TRIG=0x5A;
// IAP_TRIG=0xA5;
// _nop_();
// dat=IAP_DATA;
// Iap_Idle();
// return dat;
//}
void Iap_Program_Byte(unsigned char sector,unsigned int addr,unsigned char dat)
{
unsigned int add;
add=sector*0x0200+addr;
IAP_CONTR|=IAPEN;
IAP_TPS=IAP_TPS_;
IAP_CMD=IAP_WRITE;
IAP_ADDRL=add;
IAP_ADDRH=add>>8;
IAP_DATA=dat;
IAP_TRIG=0x5A;
IAP_TRIG=0xA5;
_nop_();
Iap_Idle();
}
void Iap_Erase_Sector(unsigned char sector)
{
unsigned int add;
add=sector*0x0200;
IAP_CONTR|=IAPEN;
IAP_TPS=IAP_TPS_;
IAP_CMD=IAP_ERASE;
IAP_ADDRL=add;
IAP_ADDRH=add>>8;
IAP_TRIG=0x5A;
IAP_TRIG=0xA5;
_nop_();
Iap_Idle();
}
页:
[1]