Skip to content

Instantly share code, notes, and snippets.

@krisha
Created September 29, 2015 12:18
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 6 You must be signed in to fork a gist
  • Save krisha/fcaaf01534fa0ad9d3da to your computer and use it in GitHub Desktop.
Save krisha/fcaaf01534fa0ad9d3da to your computer and use it in GitHub Desktop.
Arduino code for reading/writing Microchip EEPROM 93LC66
//#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