commit 0ca6818a67fd980d56d4a39250fc33bd194a2c80 Author: maddiebaka Date: Tue Feb 13 17:46:16 2024 -0500 Initial commit with proof of concept diff --git a/NORFlasherFirmware.ino b/NORFlasherFirmware.ino new file mode 100644 index 0000000..6505d08 --- /dev/null +++ b/NORFlasherFirmware.ino @@ -0,0 +1,131 @@ +#define OE 3 +// PGM is also WE# according to data sheet +#define PGM 2 + +// 18 pin address line +#define Addr0 22 +#define Addr18 40 + +// 8 pin data line +#define Data0 44 +#define Data7 51 + +void setCtrlPins() { + pinMode(OE, OUTPUT); + pinMode(PGM, OUTPUT); +} + +void setAddrPinsOut() { + for(int a = Addr0; a <= Addr18; a++) { + pinMode(a, OUTPUT); + digitalWrite(a, LOW); + } +} + +void setDataPinsOut() { + for(int d = Data0; d <= Data7; d++) { + pinMode(d, OUTPUT); + digitalWrite(Data0 + d, LOW); + } +} + +void setDataPinsIn() { + for(int d = Data0; d <= Data7; d++) { + pinMode(Data0 + d, INPUT); + } +} + +void setByte(byte out) { + for(int i = 0; i < 8; i++) { + digitalWrite(Data0 + i, bitRead(out,i)); + } +} + +void setAddress(unsigned long addr) { + for(int i = 0; i < 19; i++) { + digitalWrite(Addr0 + i, bitRead(addr, i) ); + } +} + +byte readByte() { + byte temp_in = 0; + for(int i = 0; i < 8; i++) { + if(digitalRead(Data0 + i)) { + bitSet(temp_in, i); + } + } + + return temp_in; +} + +byte readData(unsigned long address) { + byte temp_read; + setDataPinsIn(); + + digitalWrite(PGM, HIGH); + digitalWrite(OE, HIGH); + + setAddress(address); + + digitalWrite(OE, LOW); + delayMicroseconds(1); + + temp_read = readByte(); + + return temp_read; +} + +void writeByte(byte data, unsigned long address) { + setAddress(address); + setByte(data); + + digitalWrite(OE, HIGH); + digitalWrite(PGM, HIGH); + + delayMicroseconds(2); + + digitalWrite(PGM, LOW); + delayMicroseconds(1); + digitalWrite(PGM, HIGH); +} + +void programData(byte data, unsigned long address) { + setDataPinsOut(); + + writeByte(0xAA, 0x5555); + writeByte(0x55, 0x2AAA); + writeByte(0xA0, 0x5555); + writeByte(data, address); + + delayMicroseconds(30); + + Serial.println(data, HEX); + Serial.println(address, HEX); +} + +void setup() { + // Debug trigger + pinMode(10, OUTPUT); + digitalWrite(10, LOW); + // put your setup code here, to run once: + setCtrlPins(); + + setAddrPinsOut(); + setDataPinsOut(); + + Serial.begin(9600); + delay(2); + Serial.println("Started Serial COM."); +} + +void loop() { + // put your main code here, to run repeatedly: + programData(0x3F, 0x0000); + + byte data = readData(0x0000); + // Serial.print("data: "); + Serial.print("Data returned: "); + Serial.println(data, HEX); + // Serial.println("\n"); + delay(1); +}