Dear All,
I've developed a firmware that makes use of the internal S12XEP100 EEEPROM.
Everything works 99% of the time, but sometimes, after a power cycle, the EEEPROM is set to random values.
Here there is the init procedure, that is called without interrupt enable, after having set the clock:
void E3PROM_setup() { e3prom_query(); if (erpart == 0xffff || dfpart == 0xffff) { e3prom_dflash_partition(); } e3prom_enable(); }
Where:
e3prom_query is used to retrive parameters from the e3prom
void e3prom_query() { FSTAT = 0x30; e3prom_wait(); FCCOBIX = 0; FCCOBHI = 0x15; FCCOBLO = 0x00; FSTAT = 0x80; e3prom_wait(); FCCOBIX = 1; dfpart = FCCOB; FCCOBIX = 2; erpart = FCCOB; FCCOBIX = 3; ecount = FCCOB; FCCOBIX = 4; deadcnt = FCCOBHI; rdycnt = FCCOBLO; }
e3prom_wait is used to wait for e3prom operations complete
void e3prom_wait() { while((ETAG > 0) || (FSTAT_MGBUSY == 1) || FSTAT_CCIF == 0); }
e3prom_dflash_partition is used to partition the dflash
void e3prom_dflash_partition() { FSTAT = 0x30; e3prom_wait(); FCCOBIX = 0; FCCOBHI = 0x20; FCCOBLO = 0x00; FCCOBIX = 1; FCCOB = 0x0040; FCCOBIX = 2; FCCOB = 0x0004; FSTAT = 0x80; e3prom_wait(); }
void e3prom_enable() { FSTAT = 0x30; e3prom_wait(); FCCOBIX = 0; FCCOBHI = 0x13; FCCOBLO = 0x00; FSTAT = 0x80; e3prom_wait(); }
And these are the routines to read and write:
void E3PROM_set_byte(unsigned long addr, byte val) { byte * __far ptr = (byte * __far)addr; *ptr = val; } byte E3PROM_get_byte(unsigned long addr) { byte * __far ptr = (byte * __far)addr; return *ptr; }
Unfortunately the problem is happening very rarely and it cannot be reproduced sistematically.
Any hint or suggestion on the code above?
Am I wrong in something?
Many thanks in advance,
Ale
Hello
On early versions of this device there was an errata with symptoms similar to this.
Are you using the maskset 5M48H?
If not, this could well be associated with the errata listed as MUCts03976 in the Mask Set Errata:
The errata details also include workaround measures that may be useful.