Lập trình EEPROM 28C64 bằng Arduino


7

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 đó delaychỉ để đả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.


Một điều còn thiếu là ở trang 7 của biểu dữ liệu, nó nói rằng bạn cần phải viết một chuỗi mã để vô hiệu hóa chức năng chống ghi.

Câu trả lời:


4

Thiết bị có 13 chân địa chỉ, sẽ chỉ định một địa chỉ ở dạng nhị phân từ 0x0000 đến 0x1FFF. Bạn đã không chỉ ra rằng bạn đang làm bất cứ điều gì với họ?

Ngoài ra, tôi khuyên bạn nên viết một writebytequy trình đặt tất cả các dây địa chỉ và dữ liệu thành đầu ra và đặt các giá trị phù hợp lên chúng, đảm bảo WE và OE được xác nhận lại, xác nhận CE, xác nhận và giải phóng WE, và phát hành CE và một readbytequy trình đặt tất cả các dây địa chỉ thành đầu ra và đặt các giá trị phù hợp vào chúng, đặt tất cả các dây dữ liệu thành đầu vào, khẳng định CE và OE, lấy mẫu tất cả các dây dữ liệu và phát hành CE và OE. Điều đó sẽ làm cho phần còn lại của mã của bạn dễ đọc hơn nhiều.


Cảm ơn đã phản hồi, @supercat. Tôi đã buộc 10 bit địa chỉ hàng đầu thấp và hiện chỉ sử dụng 3 bit đầu tiên. Tôi đã chỉnh sửa câu hỏi của tôi. Tôi hiểu lợi ích của việc tách mã thành các chương trình con và có thể sẽ làm điều này, nhưng bây giờ tôi chỉ đang cố gắng để làm cho việc ghi byte hoạt động.
Matthew R.

1

Nhìn vào biểu dữ liệu ở trang 12, nó hiển thị sơ đồ thời gian và Thời gian cho phép truy cập Chip có thể lên tới 250nS. Nếu sử dụng một AVR có xung nhịp> = 4 MHz, bạn có thể ở dưới thời gian này và cần một vài độ trễ nhỏ trong mã đọc của mình, để bắt đầu thậm chí có thể thử độ trễ dài như bạn đã thực hiện với mã ghi cho đến khi bạn biết nó hoạt động.

Biểu đồ tương tự cho thấy CE được khẳng định theo sau bởi OE cho một chu kỳ đọc. Tôi khuyên bạn nên làm theo trình tự tương tự và cũng thay đổi trình tự viết của bạn để theo sơ đồ trên trang sau.


Tôi đã thêm độ trễ 500ms giữa mỗi lần thay đổi pin điều khiển và đảm bảo thứ tự phù hợp với biểu dữ liệu, nhưng vẫn không gặp may. Do EEPROM yêu cầu thời gian chính xác, có nghĩa là bây giờ tôi có thể sẽ chậm cho chip? Cảm ơn.
Matthew R.

@MatthewR.: Thời gian cho EEPROM cụ thể này không quá quan trọng, nhưng nó có một bộ đếm thời gian bắt đầu khi byte đầu tiên được ghi và được đặt lại nếu một byte khác được viết trước khi hết hạn. Khi hết giờ, một chu trình ghi nội bộ được kích hoạt và ghi bổ sung trước khi hoàn thành. Có thể thiết bị sẽ "không vui" nếu / WE xuống thấp và duy trì ở mức thấp trong toàn bộ thời gian của bộ hẹn giờ. Tôi không thực sự thích thiết kế này, nhưng tôi đoán là nó đã cố gắng tương thích với phần trước đó, nơi người ta có thể viết từng vị trí một và chỉ chờ từng cái một.
supercat

@MatthewR.: BTW, nếu chip là thiết bị kéo trái ngược với các bộ phận mới, có thể tính năng "bảo vệ phần mềm" đã được bật trước đó. Nếu có, bạn sẽ cần nối tất cả các dây địa chỉ của mình để tắt nó.
supercat

@supercat: Cảm ơn thông tin. Các chip là mới, và tôi thực sự có hai từ hai nhà sản xuất khác nhau. Tất cả cư xử như nhau.
Matthew R.

@MatthewR.: Tôi khuyên bạn nên kiểm tra xem điều gì sẽ xảy ra nếu bạn không để dòng / WE được xác nhận trong hơn một vài micro giây mỗi lần. Điều đó có thể giúp mọi thứ.
supercat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.