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
  • hi,

    Only sometime the read function give wrong reading.

    How do you determine this? Do you find difference between twice reading or between writting and reading?

    By the way, the datasheet says:

    Note: The sequence 5xh and Axh must be executed without instructions between then otherwise the programming is aborted.

    So I think you should keep interrupts disabled during launching programming by writing the control sequence.

    Regards,
    Oleg

Reply
  • hi,

    Only sometime the read function give wrong reading.

    How do you determine this? Do you find difference between twice reading or between writting and reading?

    By the way, the datasheet says:

    Note: The sequence 5xh and Axh must be executed without instructions between then otherwise the programming is aborted.

    So I think you should keep interrupts disabled during launching programming by writing the control sequence.

    Regards,
    Oleg

Children