Created
September 29, 2015 12:18
-
-
Save krisha/fcaaf01534fa0ad9d3da to your computer and use it in GitHub Desktop.
Arduino code for reading/writing Microchip EEPROM 93LC66
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//#include <SPI.h> | |
/* Arduino code to read out and write EEPROM 93LC66 | |
which is used in an AEG 55GAD84AE induction hob. | |
Some bits were flipped depending on temperature. | |
Writing it back solved this problem. | |
*/ | |
/* pin defines eliminated during SPI lib testing... | |
arduino - 93LC66 | |
10 - CS | |
11 - DI | |
12 - DO | |
13 - CLK | |
VCC - ORG (16 bit mode) | |
*/ | |
void spi_bit_tx ( uint8_t bit ) | |
{ | |
digitalWrite ( 11, bit ? HIGH : LOW); | |
digitalWrite ( 13, HIGH ); | |
delayMicroseconds ( 10 ); | |
digitalWrite ( 13, LOW ); | |
digitalWrite ( 11, 0 ); | |
delayMicroseconds ( 10 ); | |
} | |
uint8_t spi_bit_rx () | |
{ | |
uint8_t d; | |
digitalWrite ( 13, HIGH ); | |
delayMicroseconds ( 10 ); | |
d = digitalRead ( 12 ); | |
digitalWrite ( 13, LOW ); | |
delayMicroseconds ( 10 ); | |
return d ? 1 : 0; | |
} | |
uint16_t data_read_bitbang ( uint8_t addr ) | |
{ | |
int i; | |
uint16_t rx = 0; | |
digitalWrite ( 10, HIGH ); | |
spi_bit_tx ( 1 ); | |
spi_bit_tx ( 1 ); | |
spi_bit_tx ( 0 ); | |
for ( i = 7; i >= 0; i-- ) | |
spi_bit_tx ( (addr >> i ) & 1 ); | |
for ( i = 0; i < 16; i++ ) | |
{ | |
rx <<= 1; | |
rx |= spi_bit_rx (); | |
} | |
digitalWrite ( 10, LOW ); | |
return rx; | |
} | |
/* enable erase/write */ | |
void ewen_set_bitbang () | |
{ | |
int i; | |
digitalWrite ( 10, HIGH ); | |
spi_bit_tx ( 1 ); | |
spi_bit_tx ( 0 ); | |
spi_bit_tx ( 0 ); | |
for ( i = 0; i < 8; i++ ) | |
spi_bit_tx ( 1 ); | |
digitalWrite ( 10, LOW ); | |
delay ( 10 ); | |
} | |
void data_write_bitbang ( uint8_t addr, uint16_t data ) | |
{ | |
int i; | |
digitalWrite ( 10, HIGH ); | |
spi_bit_tx ( 1 ); | |
spi_bit_tx ( 0 ); | |
spi_bit_tx ( 1 ); | |
for ( i = 7; i >= 0; i-- ) | |
spi_bit_tx ( (addr >> i ) & 1 ); | |
for ( i = 15; i >= 0; i-- ) | |
spi_bit_tx ( (data >> i ) & 1 ); | |
digitalWrite ( 10, LOW ); | |
/* one fake clock */ | |
digitalWrite ( 13, HIGH ); | |
delayMicroseconds ( 10 ); | |
digitalWrite ( 13, LOW ); | |
delayMicroseconds ( 10 ); | |
digitalWrite ( 10, HIGH ); | |
/* clock 'til ready */ | |
digitalWrite ( 13, HIGH ); | |
delayMicroseconds ( 10 ); | |
while ( !digitalRead ( 12 ) ) | |
{ | |
digitalWrite ( 13, HIGH ); | |
delayMicroseconds ( 10 ); | |
digitalWrite ( 13, LOW ); | |
delayMicroseconds ( 10 ); | |
} | |
digitalWrite ( 10, LOW ); | |
} | |
/* E:\backspace\induktion\output_2015-09-29_01-55-36 bitbang fön3.log (29.09.2015 01:56:46) | |
StartOffset: 00000000, EndeOffset: 000001FF, Laenge: 00000200 */ | |
unsigned char rawData[512] = { | |
0x45, 0x47, 0x4F, 0x2D, 0x03, 0x98, 0x00, 0x07, 0x59, 0x13, 0x75, 0x00, | |
//'d', 'e', 'a', 'd', ' ', 0xbe, 0xef, 0x07, 0x59, 0x13, 0x75, 0x00, //writing test | |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
0x00, 0x00, 0x00, 0x00, 0x0A, 0x1E, 0x23, 0x28, 0x00, 0x00, 0x00, 0x00, | |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0xA2, 0x76, 0x79, | |
0x92, 0x92, 0x92, 0x92, 0x95, 0x95, 0x95, 0x95, 0x97, 0x97, 0x97, 0x97, | |
0x16, 0xEB, 0x9C, 0x92, 0x7C, 0x56, 0x4E, 0x46, 0x5C, 0x85, 0x00, 0x00, | |
0x00, 0x02, 0x7B, 0x66, 0x15, 0x19, 0x15, 0x19, 0x00, 0x02, 0x03, 0x01, | |
0x64, 0x64, 0x64, 0x64, 0x0A, 0x0A, 0x0A, 0x0A, 0x08, 0x07, 0x09, 0x05, | |
0x23, 0x47, 0x6A, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0x4D, | |
0x83, 0x00, 0x00, 0x00, 0x83, 0x00, 0x7B, 0xA3, 0x83, 0x06, 0x7B, 0xA3, | |
0x83, 0x4B, 0x7B, 0xA3, 0x83, 0x8C, 0x7B, 0xA3, 0x83, 0xF5, 0x7B, 0xA3, | |
0x8F, 0x22, 0x85, 0xAB, 0xAA, 0x3B, 0x92, 0xBC, 0xB7, 0x45, 0x9A, 0xBC, | |
0xD7, 0x03, 0xA9, 0xCA, 0x83, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, | |
0x83, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, | |
0x83, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, | |
0x83, 0x00, 0x00, 0x00, 0xF6, 0x00, 0xB1, 0xDA, 0x94, 0x00, 0x00, 0x00, | |
0x94, 0x00, 0x79, 0x9E, 0x94, 0x06, 0x79, 0x9E, 0x94, 0x4B, 0x79, 0x9E, | |
0x94, 0x8C, 0x79, 0x9E, 0x94, 0xF5, 0x79, 0x9E, 0xA0, 0x22, 0x7E, 0xA4, | |
0xBF, 0x3B, 0x87, 0xB1, 0xCF, 0x45, 0x8B, 0xB9, 0xF8, 0x03, 0x95, 0xCE, | |
0x94, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, | |
0x94, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, | |
0x94, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, | |
0x94, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x87, 0x00, 0x7E, 0xA7, | |
0x87, 0x06, 0x7E, 0xA7, 0x87, 0x4B, 0x7E, 0xA7, 0x87, 0x8C, 0x7E, 0xA7, | |
0x87, 0xF5, 0x7E, 0xA7, 0x91, 0x22, 0x87, 0xAB, 0xAB, 0x3B, 0x96, 0xB7, | |
0xB9, 0x45, 0x9E, 0xBD, 0xD8, 0x03, 0xA7, 0xCF, 0x87, 0x00, 0x00, 0x00, | |
0x87, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, | |
0x87, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, | |
0x87, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0xEE, 0x00, 0xB1, 0xDB, | |
0x8F, 0x00, 0x00, 0x00, 0x8F, 0x00, 0x7E, 0xA7, 0x8F, 0x06, 0x7E, 0xA7, | |
0x8F, 0x4B, 0x7E, 0xA7, 0x8F, 0x8C, 0x7E, 0xA7, 0x8F, 0xF5, 0x7E, 0xA7, | |
0x9C, 0x22, 0x87, 0xAB, 0xB9, 0x3B, 0x96, 0xB7, 0xC9, 0x45, 0x9E, 0xBD, | |
0xF0, 0x03, 0xA7, 0xCF, 0x8F, 0x00, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x00, | |
0x8F, 0x00, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x00, | |
0x8F, 0x00, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x00, | |
0x8F, 0x00, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x00 | |
}; | |
void setup () | |
{ | |
pinMode ( 10, OUTPUT ); /* has to be used for SPI as SS ?!?! */ | |
pinMode ( 11, OUTPUT ); /* has to be set to output for SPI... ?!?! */ | |
pinMode ( 13, OUTPUT ); | |
/* clock phase rising (CPHA=0), clock idle at GND (CPOL=0) -> SPI_MODE0 */ | |
//SPI.beginTransaction ( SPISettings( 1000, MSBFIRST, SPI_MODE0 ) ); | |
//digitalWrite ( CS, HIGH ); | |
Serial.begin ( 115200 ); | |
} | |
void loop () | |
{ | |
int s; | |
uint16_t d; | |
int i; | |
if ( Serial.available() > 0 ) | |
{ | |
s = Serial.read(); | |
switch ( s ) | |
{ | |
case -1: | |
break; | |
case 't': | |
Serial.println ( "test" ); | |
break; | |
case 'r': | |
for ( i = 0; i < 256; i++ ) | |
{ | |
d = data_read_bitbang ( i ); | |
//d = 0x1234; | |
Serial.write ( d >> 8 ); | |
Serial.write ( d & 0xFF ); | |
} | |
break; | |
case '1': | |
for ( i = 0; i < 1; i++ ) | |
{ | |
d = data_read_bitbang ( i ); | |
//d = 0x1234; | |
Serial.write ( d >> 8 ); | |
Serial.write ( d & 0xFF ); | |
} | |
break; | |
case 'w': | |
ewen_set_bitbang (); | |
delay ( 16 ); | |
for ( i = 0; i < sizeof ( rawData ); i += 2 ) | |
{ | |
data_write_bitbang ( i/2, (rawData[i] << 8) | rawData[i+1] ); | |
Serial.write ( '.' ); | |
} | |
Serial.println ( "done" ); | |
break; | |
case 'x': | |
ewen_set_bitbang (); | |
delay ( 16 ); | |
data_write_bitbang ( 0, 0x55AA ); | |
Serial.println ( "done" ); | |
break; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment