Testing, reading and writing bytes
This commit is contained in:
@@ -1,106 +1,27 @@
|
|||||||
#define OE 3
|
#include "ROMWireProtocol.h"
|
||||||
// PGM is also WE# according to data sheet
|
|
||||||
#define PGM 2
|
|
||||||
|
|
||||||
// 18 pin address line
|
#include "XModem.h"
|
||||||
#define Addr0 22
|
|
||||||
#define Addr18 40
|
|
||||||
|
|
||||||
// 8 pin data line
|
enum {
|
||||||
#define Data0 44
|
CMD_INVALID,
|
||||||
#define Data7 51
|
CMD_WRITE,
|
||||||
|
CMD_TEST,
|
||||||
|
CMD_DUMP
|
||||||
|
};
|
||||||
|
|
||||||
void setCtrlPins() {
|
char line[120];
|
||||||
pinMode(OE, OUTPUT);
|
byte cmd = NULL;
|
||||||
pinMode(PGM, OUTPUT);
|
|
||||||
|
XModem xmodem;
|
||||||
|
|
||||||
|
bool receiveBlockHandler(void *blk_id, size_t idSize, byte *data, size_t dataSize) {
|
||||||
|
for (int i = 0; i < dataSize; i++) {
|
||||||
|
programData(data[i], i);
|
||||||
}
|
}
|
||||||
|
Serial.println(".");
|
||||||
|
|
||||||
void setAddrPinsOut() {
|
cmd = NULL;
|
||||||
for(int a = Addr0; a <= Addr18; a++) {
|
return true;
|
||||||
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() {
|
void setup() {
|
||||||
@@ -111,21 +32,126 @@ void setup() {
|
|||||||
setCtrlPins();
|
setCtrlPins();
|
||||||
|
|
||||||
setAddrPinsOut();
|
setAddrPinsOut();
|
||||||
setDataPinsOut();
|
setDataPinsIn();
|
||||||
|
//setDataPinsOut();
|
||||||
|
|
||||||
Serial.begin(9600);
|
Serial.begin(9600, SERIAL_8N1);
|
||||||
|
xmodem.begin(Serial, XModem::ProtocolType::XMODEM);
|
||||||
|
xmodem.setRecieveBlockHandler(receiveBlockHandler);
|
||||||
delay(2);
|
delay(2);
|
||||||
Serial.println("Started Serial COM.");
|
Serial.println("Started Serial COM.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Function grabbed from TommyPROM library
|
||||||
|
* Copyright Tom Nisbet
|
||||||
|
*/
|
||||||
|
char *readLine(char *buffer, int len) {
|
||||||
|
for (int ix = 0; ix < len; ix++) {
|
||||||
|
buffer[ix] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char c = ' ';
|
||||||
|
int ix = 0;
|
||||||
|
do {
|
||||||
|
if (Serial.available()) {
|
||||||
|
c = Serial.read();
|
||||||
|
if ((c == '\b') && (ix > 0)) {
|
||||||
|
--ix;
|
||||||
|
}
|
||||||
|
buffer[ix++] = c;
|
||||||
|
Serial.write(c);
|
||||||
|
}
|
||||||
|
} while ((c != '\n') && (c != '\r') && (ix < len));
|
||||||
|
|
||||||
|
buffer[ix - 1] = 0;
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Function modified from TommyPROM library
|
||||||
|
* Copyright Tom Nisbet
|
||||||
|
*/
|
||||||
|
byte parseCommand(char c) {
|
||||||
|
byte cmd = CMD_INVALID;
|
||||||
|
|
||||||
|
if ((c >= 'A') && (c <= 'Z')) {
|
||||||
|
c |= 0x20;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (c) {
|
||||||
|
case 'w': cmd = CMD_WRITE; break;
|
||||||
|
case 't': cmd = CMD_TEST; break;
|
||||||
|
case 'd': cmd = CMD_DUMP; break;
|
||||||
|
default: cmd = CMD_INVALID; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return cmd;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
// put your main code here, to run repeatedly:
|
// put your main code here, to run repeatedly:
|
||||||
programData(0x3F, 0x0000);
|
//programData(0x3F, 0x0000);
|
||||||
|
|
||||||
byte data = readData(0x0000);
|
//byte data = readData(0x0000);
|
||||||
// Serial.print("data: ");
|
// Serial.print("data: ");
|
||||||
Serial.print("Data returned: ");
|
//Serial.print("Data returned: ");
|
||||||
Serial.println(data, HEX);
|
//Serial.println(data, HEX);
|
||||||
// Serial.println("\n");
|
// Serial.println("\n");
|
||||||
delay(1);
|
//delay(1);
|
||||||
|
|
||||||
|
Serial.print("\n>");
|
||||||
|
readLine(line, sizeof(line));
|
||||||
|
Serial.flush();
|
||||||
|
|
||||||
|
//if(cmd == NULL) {
|
||||||
|
cmd = parseCommand(line[0]);
|
||||||
|
//}
|
||||||
|
|
||||||
|
switch (cmd) {
|
||||||
|
case CMD_WRITE:
|
||||||
|
Serial.println("Burn new ROM: Waiting for an xmodem transfer..");
|
||||||
|
xmodem.receive();
|
||||||
|
break;
|
||||||
|
case CMD_TEST:
|
||||||
|
Serial.println("Testing with a read/write cycle");
|
||||||
|
programData(0x3F, 0x0000);
|
||||||
|
Serial.println("Wrote: 0x3F");
|
||||||
|
setDataPinsIn();
|
||||||
|
delay(500);
|
||||||
|
Serial.println("Received: ");
|
||||||
|
Serial.println(readData(0x0000), HEX);
|
||||||
|
cmd = NULL;
|
||||||
|
break;
|
||||||
|
case CMD_DUMP:
|
||||||
|
setDataPinsIn();
|
||||||
|
delay(500);
|
||||||
|
Serial.println("Dumping ROM...");
|
||||||
|
dumpROM();
|
||||||
|
// for(int i = 0; i < 20; i++) {
|
||||||
|
// Serial.println(readData(0x1000), HEX);
|
||||||
|
// }
|
||||||
|
cmd = NULL;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CMD_INVALID:
|
||||||
|
default:
|
||||||
|
Serial.println("NOR Flasher v1.0 Alpha");
|
||||||
|
Serial.println();
|
||||||
|
Serial.println("Commands: ");
|
||||||
|
Serial.println("w\twrite new firmware");
|
||||||
|
Serial.println("d\tdump firmware");
|
||||||
|
Serial.println();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void dumpROM() {
|
||||||
|
for(int i = 0; i < 10; i++) {
|
||||||
|
byte data = readData(0x0000 | i);
|
||||||
|
Serial.println(data, HEX);
|
||||||
|
}
|
||||||
}
|
}
|
99
ROMWireProtocol.cpp
Normal file
99
ROMWireProtocol.cpp
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
#include "ROMWireProtocol.h"
|
||||||
|
|
||||||
|
//#include <Arduino.h>
|
||||||
|
|
||||||
|
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(d, LOW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setDataPinsIn() {
|
||||||
|
for(int d = Data0; d <= Data7; d++) {
|
||||||
|
digitalWrite(d, LOW);
|
||||||
|
pinMode(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;
|
||||||
|
setByte(0);
|
||||||
|
setDataPinsIn();
|
||||||
|
|
||||||
|
digitalWrite(PGM, HIGH);
|
||||||
|
digitalWrite(OE, HIGH);
|
||||||
|
|
||||||
|
setAddress(address);
|
||||||
|
delayMicroseconds(3);
|
||||||
|
|
||||||
|
digitalWrite(OE, LOW);
|
||||||
|
delayMicroseconds(3);
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
33
ROMWireProtocol.h
Normal file
33
ROMWireProtocol.h
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
#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();
|
||||||
|
|
||||||
|
void setAddrPinsOut();
|
||||||
|
|
||||||
|
void setDataPinsOut();
|
||||||
|
|
||||||
|
void setDataPinsIn();
|
||||||
|
|
||||||
|
void setByte(byte out);
|
||||||
|
|
||||||
|
void setAddress(unsigned long addr);
|
||||||
|
|
||||||
|
byte readByte();
|
||||||
|
|
||||||
|
byte readData(unsigned long address);
|
||||||
|
|
||||||
|
void writeByte(byte data, unsigned long address);
|
||||||
|
|
||||||
|
void programData(byte data, unsigned long address);
|
Reference in New Issue
Block a user