Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. #define dummyData 0xAA
  2. #define RDY 75
  3. #define NRDY 76
  4.  
  5. const int _MISO = 4;
  6. const int _MOSI = 5;
  7. const int _CLK = 3;
  8. const int RST = 2;
  9.  
  10. /* Variable definition block */
  11. byte data;
  12. byte AL, AH; // 16-bit address
  13. byte lockByte; // embed lock bits here
  14. byte SigH, SigL; // Signature Bytes
  15.  
  16. void setup()
  17. {
  18.   pinMode(_MISO, INPUT);
  19.   pinMode(_MOSI, OUTPUT);
  20.   pinMode(_CLK, OUTPUT);
  21.   pinMode(RST, OUTPUT);
  22.   Serial.begin(115200);
  23. }
  24.  
  25.  
  26.  
  27. void loop()
  28. {
  29.   while (!Serial.available());
  30.   if (Serial.available() > 0)
  31.     switch (Serial.read())
  32.     {
  33.       case 'p': Serial.write(progEnable());
  34.         break;
  35.       case 'r': readProgmem();
  36.         Serial.write(data);
  37.         break;
  38.       case 'a': while (!Serial.available());
  39.         AL = Serial.read();
  40.         break;
  41.       case 'A': while (!Serial.available());
  42.         AH = Serial.read();
  43.         break;
  44.       case 'd': while (!Serial.available());
  45.         data = Serial.read();
  46.         break;
  47.       case 'S': AH = 0;
  48.         AL = 0;
  49.         SigH = readSign();
  50.         Serial.write(SigH);
  51.         break;
  52.       case 's': AH = 2;
  53.         AL = 0;
  54.         SigL = readSign();
  55.         Serial.write(SigL);
  56.         AH = 1;
  57.         AL = 0;
  58.         SigL = readSign();
  59.         Serial.write(SigL);
  60.         break; // read SigL
  61.       case 'o': digitalWrite(RST, 1); break;
  62.       case 'c': digitalWrite(RST, 0); break;
  63.       case 'e': eraseChip();
  64.         Serial.write(RDY);
  65.         break;
  66.       case 'j': break;
  67.       case 'w': writeProgmem();
  68.         break;
  69.     }
  70. }
  71.  
  72.  
  73. unsigned char SendSPI(unsigned char data)
  74. {
  75.   uint8_t retval = 0;
  76.   uint8_t intData = data;
  77.   int t;
  78.  
  79.   for (int ctr = 0; ctr < 7; ctr++)
  80.   {
  81.     if (intData & 0x80) digitalWrite(_MOSI, 1);
  82.     else digitalWrite(_MOSI, 0);
  83.  
  84.     digitalWrite(_CLK, 1);
  85.     delayMicroseconds(1);
  86.  
  87.     t = digitalRead(_MISO);
  88.     digitalWrite(_CLK, 0);
  89.  
  90.     if (t) retval |= 1; else retval &= 0xFE;
  91.     retval <<= 1;
  92.     intData <<= 1;
  93.     delayMicroseconds(1);
  94.   }
  95.  
  96.  
  97.   if (intData & 0x80) digitalWrite(_MOSI, 1);
  98.   else digitalWrite(_MOSI, 0);
  99.  
  100.   digitalWrite(_CLK, 1);
  101.   delayMicroseconds(1);
  102.  
  103.   t = digitalRead(_MISO);
  104.   digitalWrite(_CLK, 0);
  105.  
  106.   if (t) retval |= 1;
  107.   else retval &= 0xFE;
  108.  
  109.   return retval;
  110. }
  111.  
  112.  
  113. byte progEnable()
  114. {
  115.   SendSPI(0xAC);
  116.   SendSPI(0x53);
  117.   SendSPI(dummyData);
  118.  
  119.   return SendSPI(dummyData);
  120. }
  121.  
  122. void eraseChip()
  123. {
  124.   SendSPI(0xAC);
  125.   SendSPI(0x9F);
  126.   SendSPI(dummyData);
  127.   SendSPI(dummyData);
  128.   delay(520);
  129. }
  130.  
  131. void readProgmem()
  132. {
  133.  
  134.   SendSPI(0x20);
  135.   SendSPI(AH);
  136.   SendSPI(AL);
  137.   data = SendSPI(dummyData);
  138. }
  139.  
  140. void writeProgmem()
  141. {
  142.   SendSPI(0x40);
  143.   SendSPI(AH);
  144.   SendSPI(AL);
  145.   SendSPI(data);
  146. }
  147.  
  148. void writeLockBits()
  149. {
  150.   SendSPI(0xAC);
  151.   SendSPI(lockByte);
  152.   SendSPI(dummyData);
  153.   SendSPI(dummyData);
  154. }
  155.  
  156. void readLockBits()
  157. {
  158.   SendSPI(0x24);
  159.   SendSPI(dummyData);
  160.   SendSPI(dummyData);
  161.   lockByte = SendSPI(dummyData);
  162. }
  163.  
  164. byte readSign()
  165. {
  166.   SendSPI(0x28);
  167.   SendSPI(AH);
  168.   SendSPI(AL);
  169.   return SendSPI(dummyData);
  170. }