Last active
June 8, 2020 17:00
-
-
Save houmei/7ce0aef4632cebb38876423c84b843cb to your computer and use it in GitHub Desktop.
readROM27512 / Read PROM W27C512 by ArduinoMEGA2560
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// read 2764-27512 ROM / ArduinoMEGA2650 | |
// 20200607 by @houmei | |
// | |
// pin assign | |
unsigned char Data[8] = {46,48,50,53,51,49,47,45}; // D0,D1,...D7 | |
unsigned char Addr[16] = {44,42,40,38, 36,34,32,30, 33,35,41,37, 28,31,29,26}; // A0,A1,...A15 | |
unsigned char OE = 39 ; | |
unsigned char CS = 43 ; | |
unsigned char TMM2364_Vpp = Addr[15]; | |
unsigned char TMM2364_CS1 = Addr[14]; | |
unsigned char TMM2364_CS2 = Addr[13]; | |
unsigned int rombit = 13 ; // 13..2764[12:0] 14..27128[13:0] 15..27256[14:0] 16..27512[15:0] | |
unsigned long int romsize = 1 ; | |
// start button | |
unsigned int btnA=52; | |
void setup() { | |
for(int i=0;i<8;i++) pinMode(Data[i],INPUT); | |
for(int i=0;i<=15;i++) { pinMode(Addr[i],OUTPUT); digitalWrite(Addr[i],HIGH); } | |
pinMode(OE,OUTPUT); digitalWrite(OE,HIGH); | |
pinMode(CS,OUTPUT); digitalWrite(CS,HIGH); | |
pinMode(btnA,INPUT_PULLUP); | |
for(int i=0;i<rombit;i++) romsize *=2 ; | |
Serial.begin(9600); | |
Serial.println(); | |
digitalWrite(TMM2364_Vpp,HIGH); | |
digitalWrite(TMM2364_CS1,HIGH); | |
digitalWrite(TMM2364_CS2,HIGH); | |
digitalWrite(OE,LOW); | |
digitalWrite(CS,HIGH); | |
} | |
void loop() { | |
while(digitalRead(btnA)) ; | |
dump_ihex4(romsize); | |
// dump_hex(romsize); | |
// dump_verilog(romsize); | |
delay(1000); | |
} | |
void dump_ihex4(unsigned long int romsize) { | |
unsigned char d,sum; | |
Serial.print(":020000040000FA"); // ELA=0000 | |
for (unsigned long int aloop=0; aloop<romsize; aloop++) { | |
d=readROM(aloop,rombit); | |
if (aloop%16==0) { | |
if (aloop>0) sprinthex((unsigned char)(-sum),2); | |
Serial.println(); | |
Serial.print(":10");sprinthex(aloop,4);Serial.print("00"); | |
sum=0x10+(aloop&0xff)+((aloop>>8)&0xff); | |
} | |
sprinthex(d,2); | |
sum += d; | |
} | |
sprinthex((unsigned char)(-sum),2); Serial.println(); | |
Serial.print(":00000001FF"); Serial.println(); | |
} | |
void dump_hex(unsigned long int romsize) { | |
unsigned char d; | |
for (unsigned long int aloop=0; aloop<romsize; aloop++) { | |
d=readROM(aloop,rombit); | |
if (aloop%16==0) { | |
Serial.println(); | |
sprinthex(aloop,4);Serial.print(" : "); | |
} | |
sprinthex(d,2); | |
} | |
Serial.println(); | |
} | |
void dump_verilog(unsigned long int romsize) { | |
unsigned char d; | |
Serial.println(); | |
Serial.print("@00000000"); | |
for (unsigned long int aloop=0; aloop<romsize; aloop++) { | |
d=readROM(aloop,rombit); | |
if (aloop%16==0) { | |
Serial.println(); | |
} else { | |
Serial.print(" "); | |
} | |
sprinthex(d,2); | |
} | |
Serial.println(); | |
} | |
/// --- | |
unsigned char readROM(unsigned long int address, unsigned int size) { | |
unsigned long int t=1; | |
unsigned char s=0 ; | |
if (size==0) return; | |
for (int i=0; i<=size-1; i++) { | |
digitalWrite(Addr[i], (address & t)?HIGH:LOW); | |
t *=2 ; | |
} | |
digitalWrite(CS,LOW); | |
for(int i=7; i>=0; i--) { | |
s *= 2 ; | |
if (digitalRead(Data[i])!=LOW) s |= 1 ; | |
} | |
digitalWrite(CS,HIGH); | |
return s; | |
} | |
void sprinthex(unsigned long int x, int dg) { | |
if (dg>=8) if (x<0x10000000) Serial.print("0"); | |
if (dg>=7) if (x<0x1000000) Serial.print("0"); | |
if (dg>=6) if (x<0x100000) Serial.print("0"); | |
if (dg>=5) if (x<0x10000) Serial.print("0"); | |
if (dg>=4) if (x<0x1000) Serial.print("0"); | |
if (dg>=3) if (x<0x100) Serial.print("0"); | |
if (dg>=2) if (x<0x10) Serial.print("0"); | |
Serial.print(x,HEX); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment