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); } }
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); } }
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; } }
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.
Hallo all, There were mistakes on my test. It might other bugs. So, that
BlowerNew = Blower;