mbed EPROM 27256 Vpp 12.5V Writter Functions Blank Check(SW = 0): Check blank(all 1) erased EPROM Write(SW = 1): Write Hex file(TEST1.HEX) to EPROM Read(SW = 2): Read from EPROM and dump to local file(TEST1.DMP) Copy(SW = 3): Read from dump image file(TEST1.DMP) and write to EPROM

Dependencies:   TextLCD mbed

Files at this revision

API Documentation at this revision

Comitter:
jf1vrr
Date:
Wed Jun 22 12:39:03 2011 +0000
Commit message:
Rev 0.01A 2011/06/22 new!

Changed in this revision

TextLCD.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextLCD.lib	Wed Jun 22 12:39:03 2011 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/simon/code/TextLCD/#e4cb7ddee0d3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Jun 22 12:39:03 2011 +0000
@@ -0,0 +1,471 @@
+/*mbed EPROM 27256 Vpp 12.5V Writter
+Functions
+Blank Check(SW = 0): Check blank(all 1) erased EPROM
+Write(SW = 1): Write Hex file(TEST1.HEX) to EPROM
+Read: Read from EPROM and dump to local file(TEST1.DMP)
+Copy: Read from dump image file(TEST1.DMP) and write to EPROM
+*/
+#include "mbed.h"
+#include "TextLCD.h"
+
+LocalFileSystem local("mbed");
+BusInOut DATA(p5, p6, p7, p8, p9, p10, p11, p12);
+BusOut ADRS(p13, p14);
+DigitalOut RD(p15);
+DigitalOut WR(p16);
+DigitalOut RESET(p17);
+DigitalOut CE(p18);
+DigitalOut OE(p19);
+DigitalOut VCP_0V(p20);
+DigitalOut VCP_5V(p21);
+DigitalIn  BTN(p22);
+BusIn SW(p23, p24);
+TextLCD lcd(p25, p26, p27, p28, p29, p30);
+
+DigitalOut LED_BUSY(LED1);
+DigitalOut LED_5V(LED2);
+DigitalOut LED_12V(LED3);
+DigitalOut LED_RETRY(LED4);
+
+#define _HIGH    1
+#define _LOW     0
+
+#define SET_READ   DATA.input()
+#define SET_WRITE  DATA.output()
+
+#define PORT_A  0
+#define PORT_B  1
+#define PORT_C  2
+#define CONTRL  3
+
+#define MAX_ADDRESS 1024
+
+union UNION1{
+    struct HEX{
+        uint8_t marker;
+        uint8_t length[2];
+        uint8_t offset[4];
+        uint8_t rectype[2];
+        uint8_t data[64]; 
+    } h;
+    char    hex_line[137];
+} u;
+
+union UNION2{
+    uint16_t    address;
+    uint8_t     hl_address[2];
+} a;
+
+FILE *fp;
+char hex_filename[] = "/mbed/test1.hex";
+char out_filename[] = "/mbed/test1.dmp";
+char in_filename[] = "/mbed/test1.dmp";
+
+short ROM_write(uint8_t address_h, uint8_t address_l, short data_byte){
+    short   read_byte;
+
+    LED_BUSY = _HIGH;
+    wait_us(1000);
+    SET_WRITE;
+    ADRS = CONTRL;
+    DATA = 0x80;
+    WR = _LOW;
+    wait_us(100);
+    WR = _HIGH;
+    
+    ADRS = PORT_A;
+    DATA = address_l;
+    WR = _LOW;
+    wait_us(100);
+    WR = _HIGH;
+
+    ADRS = PORT_B;
+    DATA = address_h;
+    WR = _LOW;
+    wait_us(100);
+    WR = _HIGH;
+    
+    ADRS = PORT_C;
+    DATA = data_byte;
+    WR = _LOW;
+    wait_us(100);
+    WR = _HIGH;
+    
+    CE = _LOW;
+    wait_us(100);
+    CE = _HIGH;
+
+    wait_us(10);
+ 
+    ADRS = CONTRL;
+    DATA = 0x89;
+    WR = _LOW;
+    wait_us(100);
+    WR = _HIGH;
+       
+    ADRS = PORT_A;
+    DATA = address_l;
+    WR = _LOW;
+    wait_us(100);
+    WR = _HIGH;
+    
+    ADRS = PORT_B;
+    DATA = address_h;
+    WR = _LOW;
+    wait_us(100);
+    WR = _HIGH;
+
+    SET_READ;
+    ADRS = PORT_C;
+    OE = _LOW;
+    wait_us(100);
+    RD = _LOW;
+    wait_us(100);
+    read_byte = DATA;
+    wait_us(50);
+    RD = _HIGH;
+    OE = _HIGH;
+    SET_WRITE;
+    LED_BUSY = _LOW;
+
+    return read_byte;  
+}
+
+uint8_t ROM_read(uint8_t address_h, uint8_t address_l){
+    uint8_t   read_byte;
+
+    LED_BUSY = _HIGH;
+    SET_WRITE;
+    ADRS = CONTRL;
+    DATA = 0x89;
+    WR = _LOW;
+    wait_us(10);
+    WR = _HIGH;
+       
+    ADRS = PORT_A;
+    DATA = address_l;
+    WR = _LOW;
+    wait_us(10);
+    WR = _HIGH;
+    
+    ADRS = PORT_B;
+    DATA = address_h;
+    WR = _LOW;
+    wait_us(10);
+    WR = _HIGH;
+    
+    SET_READ;
+    ADRS = PORT_C;
+    CE = _LOW;
+    wait_us(10);    
+    OE = _LOW;
+    wait_us(10);
+    RD = _LOW;
+    wait_us(100);
+    read_byte = DATA;
+    wait_us(10);
+    RD = _HIGH;
+    OE = _HIGH;
+    CE = _HIGH;
+    
+    SET_WRITE;
+    LED_BUSY = _LOW;
+    return read_byte;  
+}
+
+char h2d(char h_data){
+    char d_data;
+
+    d_data = 0;
+    if(h_data <= '9') d_data = h_data - '0';
+    else if(h_data >= 'A') d_data = h_data - 'A' + 10;
+    return d_data;
+}
+
+void Vcc_5V_Vpp_5V(){
+    LED_12V = _LOW;
+    LED_5V = _HIGH;
+    VCP_0V = _LOW;
+    VCP_5V = _HIGH;
+}
+
+void Vcc_6V_Vpp_12V(){
+    LED_5V = _LOW;
+    LED_12V = _HIGH;
+    VCP_0V = _LOW;
+    VCP_5V = _LOW;
+}
+
+void Vcc_0V_Vpp_0V(){
+    LED_5V = _LOW;
+    LED_12V = _LOW;
+    VCP_0V = _HIGH;
+    VCP_5V = _LOW;
+}
+
+void get_btn(){
+    int cnt;
+    
+    cnt = 0;
+    lcd.locate(0, 1);
+    lcd.printf("Push BTN to Cont");
+    while(cnt < 30){
+        if(BTN == _HIGH) cnt++;
+    }
+}
+
+void blank_check(){
+    uint8_t read_data;
+        
+    lcd.locate(0,0);
+    lcd.printf("Blank Chk Mode  ");
+    get_btn();
+    
+    Vcc_5V_Vpp_5V();
+    for(a.address = 0; a.address < MAX_ADDRESS; a.address++){
+        read_data = ROM_read(a.hl_address[1], a.hl_address[0]);
+        lcd.locate(0,1);
+        lcd.printf("%04X %02X         ", a.address, read_data);
+        if( read_data != 0xFF) goto __BLNK_ERROR;
+    }
+    lcd.locate(0,0);
+    lcd.printf("Success!        ");
+    return;
+
+__BLNK_ERROR:
+    lcd.locate(0,1);
+    lcd.printf("Blnk Check Error");
+    return;      
+} //blank_check()
+
+void write_rom(){
+    int i, len, line;
+    int  sum, cs;
+    short length, high_byte, low_byte;
+    uint8_t write_data, read_data, rty_cnt;
+    
+    lcd.locate(0,0);
+    lcd.printf("HEX WRITE to ROM");
+    lcd.locate(0,1);
+    lcd.printf(hex_filename);
+    get_btn();
+             
+    if ( NULL == (fp = fopen( hex_filename, "r" )) )
+        goto __HEX_FILE_OPEN_ERROR;
+
+    line = 0;
+    while(1){
+        for(len = 0; len < 137; len++){
+            u.hex_line[len] = fgetc(fp);
+            if(feof(fp) != NULL) goto __EOF;
+            if(u.hex_line[len] == 0x0A) goto __EXIT_FOR;
+        }
+
+__EXIT_FOR:    
+        u.hex_line[len - 1] = NULL; //Remove CRLF and terminate
+        line++;
+        if(u.h.marker != ':') goto __MARKER_ERROR;
+    
+        length = 0;
+        high_byte = h2d(u.h.length[0]) * 16;
+        low_byte = h2d(u.h.length[1]);
+        length = high_byte + low_byte; 
+      
+        a.hl_address[0] = (h2d(u.h.offset[2]) * 16) + h2d(u.h.offset[3]);
+        a.hl_address[1] = (h2d(u.h.offset[0]) * 16) + h2d(u.h.offset[1]);
+        Vcc_6V_Vpp_12V();
+        for ( i = 0; i < length * 2; i= i + 2){
+            high_byte = h2d(u.h.data[i]) * 16;
+            low_byte = h2d(u.h.data[i + 1]);
+            write_data = high_byte + low_byte; 
+            for(rty_cnt = 0; rty_cnt <= 25; rty_cnt++){
+                if(rty_cnt > 0) LED_RETRY = _HIGH;
+                read_data = ROM_write(a.hl_address[1], a.hl_address[0], write_data);
+                lcd.locate(0,0);
+                lcd.printf(" %03d %04X %02X %02X", line, a.address, write_data, read_data);
+                lcd.locate(0,1);
+                lcd.printf("              %02D", rty_cnt);
+                if(read_data == write_data) goto __NEXT_ADDRS;
+            }
+            goto __RTY_ERROR;
+            
+__NEXT_ADDRS:
+            LED_RETRY = _LOW;
+            a.address++;
+        }
+        Vcc_5V_Vpp_5V();    
+        cs = 0; 
+        i--;
+        high_byte = h2d(u.h.data[i + 1]) * 16;    
+        low_byte = h2d(u.h.data[i + 2]);
+        cs = high_byte + low_byte; 
+
+        //calc check sum
+        sum = 0;
+        for( i = 1; i < len - 3; i = i + 2){
+            high_byte = h2d(u.hex_line[i]);
+            high_byte = high_byte * 16;  
+            low_byte = h2d(u.hex_line[i + 1]);
+            sum = sum + high_byte + low_byte;      
+        }
+
+        if(((0x100 - (sum & 0xFF)) - cs) != 0) goto __CS_ERROR;
+
+    } //while(1)
+    lcd.locate(0,0);
+    lcd.printf("Success!        ");
+    return; 
+
+__HEX_FILE_OPEN_ERROR:
+    lcd.locate(0,1);
+    lcd.printf("HEX File Open Er");
+    return;
+         
+__MARKER_ERROR:
+    lcd.locate(0,1);
+    lcd.printf("Marker Error!");
+    return;
+    
+__CS_ERROR:
+    lcd.locate(0,1);
+    lcd.printf("Check Sum Error!");
+    return;
+    
+__EOF:
+    lcd.locate(0,1);
+    lcd.printf("End Of File     ");
+    return;
+          
+__RTY_ERROR:
+    lcd.locate(0,1);
+    lcd.printf("Retry Error ");
+    return;
+} //write_rom()
+
+void read_rom(){
+    uint8_t read_data;
+    
+    lcd.locate(0,0);
+    lcd.printf("READ from ROM   ");
+    get_btn();
+
+    if ( NULL == (fp = fopen( out_filename, "w" )) )
+        goto __OUT_FILE_OPEN_ERROR;
+            
+    Vcc_5V_Vpp_5V();
+    for(a.address = 0; a.address < MAX_ADDRESS; a.address++){
+        read_data = ROM_read(a.hl_address[1], a.hl_address[0]);
+        fprintf(fp, "%02X", read_data);
+        lcd.locate(0,1);
+        lcd.printf("%04X %02X         ", a.address, read_data);
+        //wait(2);
+    }
+    lcd.locate(0,0);
+    lcd.printf("Success!        ");
+    return;
+    
+__OUT_FILE_OPEN_ERROR:
+    lcd.locate(0,1);
+    lcd.printf("Out File Open Er");
+    return;
+        
+} //read_rom
+
+void copy_rom(){
+    int rty_cnt;
+    char h_data, l_data;
+    uint8_t read_data, write_data;
+    
+    lcd.locate(0,0);
+    lcd.printf("COPY to ROM     ");
+    get_btn();
+ 
+    if ( NULL == (fp = fopen( in_filename, "r" )) )
+        goto __IN_FILE_OPEN_ERROR;
+            
+    Vcc_6V_Vpp_12V();
+    for(a.address = 0; a.address < MAX_ADDRESS; a.address++){
+        h_data = fgetc(fp);
+        l_data = fgetc(fp);
+        write_data = h2d(h_data) * 16 + h2d(l_data);
+        for(rty_cnt = 0; rty_cnt <= 25; rty_cnt++){
+            if(rty_cnt > 0) LED_RETRY = _HIGH;
+            read_data = ROM_write(a.hl_address[1], a.hl_address[0], write_data);
+            lcd.locate(0,1);
+            lcd.printf("%04X  %02X %02X   %2D", a.address, write_data, read_data, rty_cnt);
+            if(read_data == write_data) goto __NEXT_ADDRS;
+        }
+        goto __RTY_ERROR;        
+ 
+ __NEXT_ADDRS:    
+    }
+    lcd.locate(0,0);
+    lcd.printf("Success!        ");
+    return;
+
+__RTY_ERROR:
+    lcd.locate(0,1);
+    lcd.printf("Retry Error");
+    return;
+        
+__IN_FILE_OPEN_ERROR:
+    lcd.locate(0,1);
+    lcd.printf("File Open Error ");
+    return;
+} //copy_rom
+
+void init(){
+    CE = _HIGH;
+    OE = _HIGH;
+    RD = _HIGH;
+    WR = _HIGH;
+    SET_WRITE;
+    DATA = 0;
+    ADRS = 0;
+    
+    Vcc_0V_Vpp_0V();
+        
+    LED_BUSY = _LOW;
+    LED_5V = _LOW;
+    LED_12V = _LOW;
+    LED_RETRY = _LOW;
+    
+    RESET = _LOW;
+    RESET = _HIGH;
+    wait_us(100);
+    RESET = _LOW;
+} //init()
+
+int main() {
+
+    init();
+    lcd.cls();
+    lcd.locate(0,0);
+    lcd.printf("EPROM Writter   ");
+    lcd.locate(0,1);
+    lcd.printf("MAX ADRS: %5d ", MAX_ADDRESS);
+    wait(3);
+    while(1){
+        switch(SW) {
+            case(0):
+                blank_check();
+                break;
+            case(1):
+                write_rom();
+                fclose( fp );
+                break;
+            case(2):
+                read_rom();
+                fclose( fp );
+                break;
+            case(3):
+                copy_rom();
+                fclose( fp );                
+                break;                  
+            default:
+                break;
+        } //switch(SW)
+        Vcc_0V_Vpp_0V();
+        wait(5);
+    } //while(1)
+} //main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Jun 22 12:39:03 2011 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/63bcd7ba4912