Advertisement
Guest User

EEPROM programmer

a guest
Dec 29th, 2017
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.59 KB | None | 0 0
  1. #define SHD 2 //shift data
  2. #define SHC 3 //shift clock
  3. #define SRC 4 //storage clock
  4. #define DATA_OFFSET 5
  5. #define WE A0
  6.  
  7. void setup() {
  8.   digitalWrite(WE, HIGH);
  9.   pinMode(WE, OUTPUT);
  10.   pinMode(SHD, OUTPUT);
  11.   pinMode(SHC, OUTPUT);
  12.   pinMode(SRC, OUTPUT);
  13.   digitalWrite(SHD, LOW);
  14.   digitalWrite(SHC, LOW);
  15.   digitalWrite(SRC, LOW);
  16.   setPinModes(INPUT);
  17.  
  18.   Serial.begin(9600);
  19.   Serial.println("Commands:");
  20.   Serial.println("read **** - returns byte of data at given address");
  21.   Serial.println("pread **** - returns data in page starting with given bits (hex)");
  22.   Serial.println("readall - returns all data");
  23.   Serial.println("write **** ** - writes byte (hex 2) to given address (hex 1)");
  24.   Serial.println("pwrite **** *x128 - writes up to 64 bytes (hex 2) to page starting with given bits (hex 1)");
  25.   Serial.println("writeprogram - writes using programmed algorithm");
  26.   Serial.println("disableprotect - disables software data protection");
  27. }
  28.  
  29. void loop() { //mostly processing incoming data and responding
  30.   if (Serial.available() > 0) {
  31.     char rec[200];
  32.     byte z = Serial.readBytesUntil(';', rec, 200);
  33.     if (z > 140) return;
  34.     rec[z] = 0;
  35.     String str = String(rec);
  36.     if (str.startsWith("read") && str.length() >= 9) {
  37.       uint16_t addr = (uint16_t)strtol(str.substring(5, 9).c_str(), NULL, 16);
  38.       byte data = readByte(addr);
  39.       Serial.print("Data at 0x");
  40.       Serial.print(String(addr, HEX));
  41.       Serial.print(" is 0x");
  42.       Serial.println(String(data, HEX));
  43.     } else if (str.startsWith("readall")) {
  44.       setPinModes(INPUT);
  45.       Serial.println("All Data:");
  46.       for (int i = 0; i < 8192; i++) {
  47.         byte data = readByteRaw(i);
  48.         if (data < 0x10) Serial.print(0);
  49.         Serial.print(String(data, HEX));
  50.         if (i % 32 == 31) Serial.println();
  51.         else Serial.print(" ");
  52.       }
  53.     } else if (str.startsWith("pread") && str.length() >= 10) {
  54.       uint16_t addr = (uint16_t)strtol(str.substring(6, 10).c_str(), NULL, 16);
  55.       addr &= 0x7FC0;
  56.       setPinModes(INPUT);
  57.       Serial.print("Data from block 0x");
  58.       Serial.println(String(addr, HEX));
  59.       for (int i = addr; i - addr < 64; i++) {
  60.         byte data = readByteRaw(i);
  61.         if (data < 0x10) Serial.print(0);
  62.         Serial.print(String(data, HEX));
  63.         if (i % 16 == 15) Serial.println();
  64.         else Serial.print(" ");
  65.       }
  66.     } else if (str.startsWith("write") && str.length() >= 13) {
  67.       uint16_t addr = (uint16_t)strtol(str.substring(6, 10).c_str(), NULL, 16);
  68.       byte data = (byte)strtol(str.substring(11, 13).c_str(), NULL, 16);
  69.       Serial.print("Writing 0x");
  70.       Serial.print(String(data, HEX));
  71.       Serial.print(" to 0x");
  72.       Serial.println(String(addr, HEX));
  73.       writeByte(addr, data);
  74.       byte nData = readByte(addr);
  75.       if (nData == data) Serial.println("Write successful");
  76.       else {
  77.         Serial.print("Write failed, stored data is 0x");
  78.         Serial.println(String(nData, HEX));
  79.       }
  80.     } else if (str.startsWith("pwrite") && str.length() >= 16 && str.length() <= 140 && str.length() % 2 == 0) {
  81.       uint16_t addr = (uint16_t)strtol(str.substring(7, 11).c_str(), NULL, 16);
  82.       addr &= 0x7FC0;
  83.       byte dataLength = (str.length() - 12) / 2;
  84.       setPinModes(OUTPUT);
  85.       Serial.print("Writing ");
  86.       Serial.print(dataLength);
  87.       Serial.print(" bytes to page 0x");
  88.       Serial.println(String(addr, HEX));
  89.       byte index = 12;
  90.       for (int16_t i = addr; i - addr < dataLength; i++) {
  91.         byte data = (byte)strtol(str.substring(index, index + 2).c_str(), NULL, 16);
  92.         writeByteRaw(i, data);
  93.         delayMicroseconds(10);
  94.         index += 2;
  95.       }
  96.       delayMicroseconds(1);
  97.       delay(10);
  98.       setPinModes(INPUT);
  99.       Serial.println("Page data is now:");
  100.       for (int i = addr; i - addr < 64; i++) {
  101.         byte data = readByteRaw(i);
  102.         if (data < 0x10) Serial.print(0);
  103.         Serial.print(String(data, HEX));
  104.         if (i % 16 == 15) Serial.println();
  105.         else Serial.print(" ");
  106.       }
  107.     } else if (str.startsWith("disableprotect")) {
  108.       setPinModes(OUTPUT);
  109.       Serial.println("Disabling software data protection");
  110.       writeByteRaw(0x1555, 0xAA);
  111.       delayMicroseconds(10);
  112.       writeByteRaw(0xAAA, 0x55);
  113.       delayMicroseconds(10);
  114.       writeByteRaw(0x1555, 0x80);
  115.       delayMicroseconds(10);
  116.       writeByteRaw(0x1555, 0xAA);
  117.       delayMicroseconds(10);
  118.       writeByteRaw(0xAAA, 0x55);
  119.       delayMicroseconds(10);
  120.       writeByteRaw(0x1555, 0x20);
  121.       delay(10);
  122.     }
  123.   }
  124. }
  125.  
  126. void setPinModes(byte mode) {
  127.   for (byte i = DATA_OFFSET; i - DATA_OFFSET < 8; i++) {
  128.     pinMode(i, mode);
  129.     digitalWrite(i, LOW);
  130.   }
  131. }
  132.  
  133. void doShift(uint16_t addr, bool _write) {
  134.   bitWrite(addr, 15, _write);
  135.   shiftOut(SHD, SHC, LSBFIRST, addr & 0xff);
  136.   shiftOut(SHD, SHC, LSBFIRST, addr >> 8);
  137.   digitalWrite(SRC, HIGH);
  138.   digitalWrite(SRC, LOW);
  139. }
  140.  
  141. byte readByte(uint16_t addr) {
  142.   setPinModes(INPUT);
  143.   return readByteRaw(addr);
  144. }
  145.  
  146. byte readByteRaw(uint16_t addr) {
  147.   doShift(addr, false);
  148.   delayMicroseconds(1);
  149.   byte data = 0;
  150.   for (byte j = 0; j < 8; j++) bitWrite(data, j, digitalRead(j + DATA_OFFSET));
  151.   return data;
  152. }
  153.  
  154. void writeByte(uint16_t addr, byte data) {
  155.   setPinModes(OUTPUT);
  156.   writeByteRaw(addr, data);
  157.   delay(10);
  158. }
  159.  
  160. void writeByteRaw(uint16_t addr, byte data) {
  161.   doShift(addr, true);
  162.   delayMicroseconds(10);
  163.   digitalWrite(WE, LOW);
  164.   for (byte j = 0; j < 8; j++) digitalWrite(j + DATA_OFFSET, bitRead(data, j));
  165.   delayMicroseconds(1);
  166.   digitalWrite(WE, HIGH);
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement