Sorry to bump but I'm still having a little bit of trouble; probably just some stupidly written code. I did get writing to the EEPROM working but ... now I can't get it to write the correct data; in this code, I'm just trying to write a counter which goes from 0 to 0x7F. When I write and then read back the data, I get all 0x7Fs... 0x43 and then repeating 0x80 and 0xC0...
Also when I try the ERASE command, I get back all 0x10s 0x10 then 0xAF and 0xEF repeating?!
Here's the code:
#define ROM_LEN 0x100
#define LED 13
#define SER 9
#define RCLK 8
#define SRCLK 7
#define WE 3
#define OE 4
#define A16 2
#define D0 11
#define D1 12
#define D2 A5
#define D3 A4
#define D4 A3
#define D5 A2
#define D6 A1
#define D7 A0
#define COMMAND_READ 1
#define COMMAND_WRITE 2
#define COMMAND_ERASE 3
void setup() {
digitalWrite(WE, HIGH);
digitalWrite(OE, HIGH);
pinMode(WE, OUTPUT);
pinMode(OE, OUTPUT);
pinMode(A16, OUTPUT);
pinMode(LED, OUTPUT);
pinMode(SER, OUTPUT);
pinMode(RCLK, OUTPUT);
pinMode(SRCLK, OUTPUT);
digitalWrite(SER, LOW);
digitalWrite(RCLK, LOW);
digitalWrite(SRCLK, LOW);
Serial.begin(38400);
while(!Serial);
}
inline void writeMode() {
pinMode(D0, OUTPUT);
pinMode(D1, OUTPUT);
pinMode(D2, OUTPUT);
pinMode(D3, OUTPUT);
pinMode(D4, OUTPUT);
pinMode(D5, OUTPUT);
pinMode(D6, OUTPUT);
pinMode(D7, OUTPUT);
}
inline void readMode() {
pinMode(D0, INPUT);
pinMode(D1, INPUT);
pinMode(D2, INPUT);
pinMode(D3, INPUT);
pinMode(D4, INPUT);
pinMode(D5, INPUT);
pinMode(D6, INPUT);
pinMode(D7, INPUT);
}
inline void updateCRC(int *crc, unsigned char b) {
*crc = *crc ^ (int) b << 8;
unsigned char i = 8;
do {
if(*crc & 0x8000)
*crc = *crc << 1 ^ 0x1021;
else
*crc = *crc << 1;
} while(--i);
}
unsigned char reverse(unsigned char b) {
b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
return b;
}
inline long read32() {
long a = 0;
a |= (Serial.read() << 24);
a |= (Serial.read() << 16);
a |= (Serial.read() << 8);
a |= Serial.read();
return a;
}
inline void setAddress(long addr) {
//shiftOut(SER, SRCLK, MSBFIRST, (addr >> 8) & 0xFF);
//shiftOut(SER, SRCLK, MSBFIRST, addr & 0xFF);
//digitalWrite(RCLK, HIGH);
//digitalWrite(RCLK, LOW);
//digitalWrite(A16, addr > 65535);
for(unsigned char i = 0; i < 16; i++) {
if(addr & (1 << (15 - i))) PORTB |= 2; else PORTB &= ~2;
PORTD |= 128;
PORTD &= ~128;
}
PORTB |= 1;
PORTB &= ~1;
if(addr & 0x1000) PORTD |= 4; else PORTD &= ~4;
}
inline unsigned char readByte() {
unsigned char a = 0;
//if(digitalRead(D0)) a |= 1;
//if(digitalRead(D1)) a |= 2;
//if(digitalRead(D2)) a |= 4;
//if(digitalRead(D3)) a |= 8;
//if(digitalRead(D4)) a |= 16;
//if(digitalRead(D5)) a |= 32;
//if(digitalRead(D6)) a |= 64;
//if(digitalRead(D7)) a |= 128;
a |= (PINB >> 3) & 3;
a |= reverse(PINC) & 0xFC;
return a;
}
inline void writeByte(unsigned char b) {
//digitalWrite(D0, b & 1);
//digitalWrite(D1, b & 2);
//digitalWrite(D2, b & 4);
//digitalWrite(D3, b & 8);
//digitalWrite(D4, b & 16);
//digitalWrite(D5, b & 32);
//digitalWrite(D6, b & 64);
//digitalWrite(D7, b & 128);
PORTB = (b & 3) << 3;
PORTC = (reverse(b >> 2) >> 2) & 0x3F;
}
inline void pulseWE() {
//digitalWrite(WE, LOW);
//digitalWrite(WE, HIGH);
PORTD &= ~8;
delayMicroseconds(1);
PORTD |= 8;
delayMicroseconds(1);
}
void loop() {
if (Serial.available() > 0) {
int command = Serial.read();
digitalWrite(LED, HIGH);
switch (command) {
case COMMAND_READ: {
readMode();
for(long i = 0; i < ROM_LEN; i++) {
setAddress(i);
while(Serial.availableForWrite() < 1);
PORTD &= ~16;
delayMicroseconds(1);
Serial.write(readByte());
delayMicroseconds(1);
PORTD |= 16;
}
setAddress(0);
break;
}
case COMMAND_WRITE: {
writeMode();
/*
int crc = 0;
for (long i = 0; i < ROM_LEN; i++) {
setAddress(i);
while (Serial.available() < 1);
int b = Serial.read();
updateCRC(&crc, b);
// TODO: write b
}
Serial.write((crc >> 8) & 0xFF);
Serial.write(crc & 0xFF);
*/
for(long i = 0; i < ROM_LEN; i += 128) {
writeByte(0xAA);
setAddress(0x5555);
pulseWE();
writeByte(0x55);
setAddress(0x2AAA);
pulseWE();
writeByte(0xA0);
setAddress(0x5555);
pulseWE();
for(long j = 0; j < 128; j++) {
long k = i + j;
writeByte(j);
setAddress(k);
pulseWE();
}
delay(12);
}
setAddress(0);
break;
}
case COMMAND_ERASE: {
writeMode();
writeByte(0xAA);
setAddress(0x5555);
pulseWE();
delayMicroseconds(1);
writeByte(0x55);
setAddress(0x2AAA);
pulseWE();
delayMicroseconds(1);
writeByte(0x80);
setAddress(0x5555);
pulseWE();
delayMicroseconds(1);
writeByte(0xAA);
pulseWE();
delayMicroseconds(1);
writeByte(0x55);
setAddress(0x2AAA);
pulseWE();
delayMicroseconds(1);
writeByte(0x10);
setAddress(0x5555);
pulseWE();
delay(50);
break;
}
}
digitalWrite(LED, LOW);
}
}