Tôi đang làm việc trên máy tính Z80 và cần ghi dữ liệu vào EEPROM. Tôi đang sử dụng chip Xicor 28C64AP-25 (biểu dữ liệu ). Tôi đã viết một chương trình cho Arduino Uno ghi dữ liệu vào 4 địa chỉ đầu tiên và sau đó đọc lại dữ liệu. Vì tôi chỉ sử dụng ba chân địa chỉ đầu tiên, phần còn lại được buộc thấp. Đây là mã của tôi, xin lỗi nếu nó có vẻ quá lộn xộn:
#define WE 11
#define OE 12
#define CE 13
#define NUM_ADDR 3
int DP[8] = {A0, A1, A2, A3, A4, A5, 2, 3};
int AP[] = {4, 5, 6};
byte data[] = {0x3E, 0xAA, 0xD3, 0x00, 0xC3, 0x00, 0x00};
void setupDataBus(int mode) {
for (int i = 0; i < 8; i++) {
pinMode(DP[i], mode);
}
}
void setupControlPins(int mode) {
pinMode(WE, mode);
pinMode(OE, mode);
pinMode(CE, mode);
}
void setupAddressBus(int mode) {
for (int i = 0; i < NUM_ADDR; i++) {
pinMode(AP[i], mode);
}
}
void writeByte(int address, byte data) {
setupDataBus(OUTPUT);
setupAddressBus(OUTPUT);
setupControlPins(OUTPUT);
Serial.print("Write Byte: ");
for (int b = 0; b < 7; b++) {
digitalWrite(AP[b], bitRead(address, b));
}
Serial.print(address, HEX);
Serial.print(", ");
Serial.print(data, HEX);
Serial.println();
delay(1);
// Enable write
digitalWrite(OE, HIGH);
delay(1);
digitalWrite(CE, LOW);
delay(1);
delay(10);
for (int b = 0; b < 8; b++) {
digitalWrite(DP[b], bitRead(data, b));
}
unsigned long time_i, time_f;
time_i = micros();
// Start write
digitalWrite(WE, LOW);
// End write
digitalWrite(WE, HIGH);
time= micros();
Serial.println(time_f-time_i, DEC);
delay(1);
digitalWrite(OE, LOW);
delay(1);
digitalWrite(CE, HIGH);
delay(1);
}
byte readByte(int address) {
setupDataBus(INPUT);
setupAddressBus(OUTPUT);
setupControlPins(OUTPUT);
byte val;
digitalWrite(WE, HIGH);
delay(1);
digitalWrite(CE, HIGH);
delay(1);
digitalWrite(OE, HIGH);
delay(1);
Serial.print("Read Byte: ");
for (int b = 0; b < 7; b++) {
digitalWrite(AP[b], bitRead(address, b));
}
Serial.print(address, HEX);
Serial.print(", ");
delay(1);
digitalWrite(WE, HIGH);
delay(1);
digitalWrite(CE, LOW);
delay(1);
digitalWrite(OE, LOW);
delay(1);
for (int b = 0; b < 8; b++) {
bitWrite(val, b, digitalRead(DP[b]));
}
Serial.print(val, HEX);
delay(1);
digitalWrite(OE, HIGH);
delay(1);
digitalWrite(CE, HIGH);
delay(1);
digitalWrite(WE, HIGH);
Serial.println();
return val;
}
void setup() {
setupDataBus(OUTPUT);
setupAddressBus(OUTPUT);
pinMode(WE, OUTPUT);
pinMode(OE, OUTPUT);
pinMode(CE, OUTPUT);
Serial.begin(9600);
}
void loop() {
// init
digitalWrite(OE, HIGH);
digitalWrite(CE, HIGH);
digitalWrite(WE, HIGH);
Serial.println("Initializing pins for write...");
delay(1000);
for (int i = 0; i < sizeof(data); i++) {
writeByte(i, data[i]);
}
for (int i = 0; i < sizeof(data); i++) {
readByte(i);
}
while(true);
}
Tất cả những điều đó delay
chỉ để đảm bảo rằng tôi sẽ không đi quá nhanh cho EEPROM. Tôi có thể nói qua một số đèn LED rằng Arduino đang xuất dữ liệu đúng vào các chân I / O của EEPROM, nhưng khi tôi đọc lại dữ liệu, tất cả những gì tôi nhận được là 0xFF. Đây là đầu ra nối tiếp.
Initializing pins for write...
Write Byte: 0, 3E
/WE enable time: 12
Write Byte: 1, AA
/WE enable time: 12
Write Byte: 2, D3
/WE enable time: 12
Write Byte: 3, 0
/WE enable time: 12
Write Byte: 4, C3
/WE enable time: 12
Write Byte: 5, 0
/WE enable time: 12
Write Byte: 6, 0
/WE enable time: 12
Read Byte: 0, FF
Read Byte: 1, FF
Read Byte: 2, FF
Read Byte: 3, FF
Read Byte: 4, FF
Read Byte: 5, FF
Read Byte: 6, FF
Tôi đã thử nghiệm một phiên bản trước đó của chương trình trên với chip RAM tĩnh và mọi thứ đều hoạt động tốt. Nó chỉ không hoạt động với EEPROM.
Bất kì sự trợ giúp nào đều được đánh giá cao.