Initial commit with proof of concept
This commit is contained in:
131
NORFlasherFirmware.ino
Normal file
131
NORFlasherFirmware.ino
Normal file
@@ -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);
|
||||
}
|
Reference in New Issue
Block a user