This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

EEPROM Read/Write AT89C51AC3

Hello,

I have the following code for writing/reading EEPROM of this device.

unsigned char eepromWrite (const unsigned int Address, unsigned char Data) {
    bit oldEA;
    unsigned char DataReadBack;

    if (Address <= 0x07ff)
    {
        oldEA = EA;
        EA = 0;

        EECON |= 0x02; // Enable EEPROM memory space
        XBYTE[Address] = Data;
        EECON &= 0xFD; // Disable EEPROM memory space
        EA = oldEA;

        EECON = 0x50; EECON = 0xA0;     // Programming...

        // wait programming...
        while(EECON & b00000001);

        // Byte re-read
        oldEA = EA;
        EA = 0;
        EECON |= 0x02; // Enable EEPROM memory space
        DataReadBack = XBYTE[Address];
        EECON &= 0xFD; // Disable EEPROM memory space
        EA = oldEA;
        if (DataReadBack != Data)
        {
            return(2);
        }
        return(0);
    }
    else
    {
        return(1);
    }
}

unsigned char eepromRead (const unsigned int Address, unsigned char* Data) {
bit oldEA;
	if (Address <= 0x07ff) {
	    oldEA = EA;
	    EA = 0;
		while(EECON & b00000001); //EEbusy
	    EECON |= 0x02; // Enable EEPROM memory space
	    *Data = XBYTE[Address];
	    EECON &= 0xFD; // Disable EEPROM memory space
	    EA = oldEA;
		return (0);
	}
    else
    {
        *Data = 0;
        return(1);
    }
}

Then I write the following code for write/read multiple byte (or structure)

void write_to_EEPROM (unsigned int EEPROM_address, void *buffer, unsigned char buffer_len) {
unsigned char *bp;
for (bp = buffer; buffer_len; buffer_len--, bp++, EEPROM_address++)
  {
	eepromWrite(EEPROM_address, *bp);
  }
  Wait20ms();
}

void read_from_EEPROM (unsigned int EEPROM_address, void *buffer, unsigned char buffer_len) {
unsigned char *bp;

for (bp=buffer; buffer_len; buffer_len--, bp++, EEPROM_address++)
  {
	eepromRead(EEPROM_address, bp);
  }
}

Most of the time it works. For example I could write/read a struct:
typedef struct    {
                     uchar       MotorMin;
		     uchar       MotorKnee;
                     uchar       MotorMax;
                  }  Blower_TYP;

//////////

write_to_EEPROM (FAN_ADDR, &BlowerNew, sizeof (Blower_TYP));

void readMotorConf (void) {
 Blower_TYP temp;
 read_from_EEPROM(FAN_ADDR, &temp, sizeof(Blower_TYP));
 Blower = temp;
}
}


Only sometime the read function give wrong reading of the blower. What could be the problem on above code? Thanks for advise!

Parents
  • Also, just as general advice, you might want to review your use of pointers here. On the '51 architecture, the use of pointers is generally fairly inefficient, and most locations are known at compile time. This is quite different from, say, programming in C on a PC.

Reply
  • Also, just as general advice, you might want to review your use of pointers here. On the '51 architecture, the use of pointers is generally fairly inefficient, and most locations are known at compile time. This is quite different from, say, programming in C on a PC.

Children
  • Hallo all,
    There were mistakes on my test. It might other bugs. So, that

    BlowerNew = Blower;
    
    Can be different from the ones stored previously in eeprom. I just tried to make another test solely just read the eeprom, and the values always correct. I am sorry for that, and thanks for all your advises. Kind Regards