Kevin_007 发表于 2025-2-16 18:00:18

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:}

DebugLab 发表于 2025-2-16 22:41:03

#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]
查看完整版本: 8H8K64U的EEPROM可以写入地址,但是掉电插拔后值丢失