Advertisement
Guest User

Untitled

a guest
Apr 21st, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.23 KB | None | 0 0
  1. #define PIN_SK 13 //SCK - Digital 13
  2. #define PIN_DO 12 //MISO - Digital 12
  3. #define PIN_DI 11 //MOSI - Digital 11
  4. #define PIN_CS 10 //SS - Digital 10
  5.  
  6. #define BIT_LENGTH 16
  7. #define DEBUG_LOG(x) Serial.print(x)
  8. #else
  9. #define DEBUG_LOG(x)
  10. #endif
  11.  
  12. union DATA{
  13. uint16_t W;
  14. uint8_t B[2];
  15. };
  16. uint8_t DESC_DATA[] = { 0x05,0x67,0xBA,0x12,0xFF,0x00,0xFF,0xFF,\
  17. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\
  18. 0xFF,0xFF,0xFF,0xFF,0x18,0x00,0x52,0x6F,\
  19. 0x63,0x6B,0x73,0x6D,0x69,0x74,0x68,0x20,\
  20. 0x47,0x75,0x69,0x74,0x61,0x72,0x20,0x41,\
  21. 0x64,0x61,0x70,0x74,0x65,0x72,0x00,0xFF,\
  22. 0xFF,0xFF,0xFF,0xFF,0x07,0x00,0x55,0x42,\
  23. 0x49,0x53,0x4F,0x46,0x54,0x00,0xFF,0xFF,\
  24. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\
  25. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\
  26. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
  27. uint8_t DESC_COUNT = 88;
  28.  
  29. void mwiOut(uint16_t value,uint8_t bitOrder,uint8_t bitAmount)
  30. {
  31. uint8_t dataPin = PIN_DI;
  32. uint8_t clockPin = PIN_SK;
  33. uint8_t x = (bitAmount>BIT_LENGTH)?BIT_LENGTH:bitAmount;
  34. uint8_t i;
  35. uint8_t dataBit = 0;
  36.  
  37. DEBUG_LOG("W[");
  38. for (i = 0; i < x; i++)
  39. {
  40. if (bitOrder == LSBFIRST)
  41. {
  42. dataBit = (1 & ( value >> i));
  43. }
  44. else
  45. {
  46. dataBit = (1 & ( value >> ((BIT_LENGTH-1)-i)));
  47. }
  48. digitalWrite(dataPin,dataBit);
  49. DEBUG_LOG(dataBit);
  50. digitalWrite(clockPin, HIGH);
  51. digitalWrite(clockPin, LOW);
  52. }
  53. DEBUG_LOG("]");
  54. }
  55.  
  56. uint16_t mwiIn(uint8_t bitOrder,uint8_t bitAmount)
  57. {
  58. uint16_t value = 0;
  59. uint8_t dataPin = PIN_DO;
  60. uint8_t clockPin = PIN_SK;
  61. uint8_t i;
  62. uint8_t x = (bitAmount>BIT_LENGTH)?BIT_LENGTH:bitAmount;
  63.  
  64. DEBUG_LOG("R[");
  65. for (i = 0; i < x; ++i) {
  66. digitalWrite(clockPin, HIGH);
  67. digitalWrite(clockPin, LOW);
  68. DEBUG_LOG(digitalRead(dataPin));
  69. if (bitOrder == LSBFIRST)
  70. value |= digitalRead(dataPin) << i;
  71. else
  72. value |= digitalRead(dataPin) << ((BIT_LENGTH-1) - i);
  73. }
  74. DEBUG_LOG("]");
  75. return value;
  76. }
  77.  
  78. void waitReady(void)
  79. {
  80. // Wait ready operation
  81. EEPROM_ENABLE(true);
  82. bool bReady = false;
  83. do
  84. {
  85. bReady = (digitalRead(PIN_DO)==HIGH);
  86. digitalWrite(PIN_SK, HIGH);
  87. digitalWrite(PIN_SK, LOW);
  88. Serial.print(".");
  89. }while(!bReady);
  90. Serial.println("DONE!");
  91. EEPROM_ENABLE(false);
  92. }
  93.  
  94. void EEPROM_ENABLE(bool value)
  95. {
  96. if(value)
  97. {
  98. digitalWrite(PIN_CS, HIGH);
  99. digitalWrite(PIN_SK, LOW);
  100. digitalWrite(PIN_DI, LOW);
  101. }
  102. else
  103. {
  104. digitalWrite(PIN_CS, LOW);
  105. digitalWrite(PIN_SK, LOW);
  106. digitalWrite(PIN_DI, LOW);
  107. }
  108. }
  109.  
  110. void EEPROM_EWEN()
  111. {
  112. uint16_t cmd = 0b1001100000000000;
  113.  
  114. EEPROM_ENABLE(true);
  115. mwiOut(cmd,MSBFIRST,9);
  116. EEPROM_ENABLE(false);
  117. }
  118.  
  119. void EEPROM_EWDS()
  120. {
  121. uint16_t cmd = 0b1000000000000000;
  122.  
  123. EEPROM_ENABLE(true);
  124. mwiOut(cmd,MSBFIRST,9);
  125. EEPROM_ENABLE(false);
  126. }
  127.  
  128. uint16_t EEPROM_READ(uint16_t address)
  129. {
  130. uint16_t value = 0;
  131. uint16_t cmd = 0b1100000000000000;
  132. uint16_t add = address << 10;
  133.  
  134. EEPROM_ENABLE(true);
  135. mwiOut(cmd,MSBFIRST,3);
  136. mwiOut(add,MSBFIRST,6);
  137. value = mwiIn(MSBFIRST,16);
  138. EEPROM_ENABLE(false);
  139. return value;
  140. }
  141.  
  142. void EEPROM_WRITE(uint16_t address,uint16_t data)
  143. {
  144. uint16_t cmd = 0b1010000000000000;
  145. uint16_t add = address << 10;
  146.  
  147. // Write operation
  148. EEPROM_ENABLE(true);
  149. mwiOut(cmd,MSBFIRST,3);
  150. mwiOut(add,MSBFIRST,6);
  151. mwiOut(data,MSBFIRST,16);
  152. EEPROM_ENABLE(false);
  153. waitReady();
  154. }
  155.  
  156. void setup()
  157. {
  158. // start serial port at 9600 bps:
  159. Serial.begin(9600);
  160. Serial.println("ROCKSMITH EEPROM WRITER (AT93C46)");
  161.  
  162. // setup software 3-Wire interface
  163. pinMode(PIN_SK, OUTPUT);
  164. pinMode(PIN_CS, OUTPUT);
  165. pinMode(PIN_DI, OUTPUT);
  166. pinMode(PIN_DO, INPUT);
  167. EEPROM_ENABLE(false);
  168. }
  169.  
  170. void loop()
  171. {
  172. Serial.print("EEPROM_ENABLE(TRUE):");
  173. EEPROM_ENABLE(true);
  174. Serial.println(" DONE!");
  175. Serial.print("EEPROM_EWEN:");
  176. EEPROM_EWEN();
  177. Serial.println(" DONE!");
  178. for(int i=0;i<=DESC_COUNT;i+=2)
  179. {
  180. Serial.print("EEPROM_WRITE(");
  181. Serial.print(i);
  182. Serial.print("/");
  183. Serial.print(DESC_COUNT);
  184. Serial.print(")");
  185. EEPROM_WRITE((i>>1),((DESC_DATA[i+1]<<8)|(DESC_DATA[i])));
  186. }
  187. Serial.print("EEPROM_EWDS:");
  188. EEPROM_EWDS();
  189. Serial.println(" DONE!");
  190.  
  191. Serial.println();
  192. Serial.println("VERIFY EEPROM");
  193. DATA temp;
  194. bool error = false;
  195. for(uint16_t i=0;i<=44;i++)
  196. {
  197. temp.W = EEPROM_READ(i);
  198. Serial.print("EEPROM_READ(0x");
  199. Serial.print(i,HEX);
  200. Serial.print("):0x");
  201. Serial.print(temp.W,HEX);
  202.  
  203. if((temp.B[0]==DESC_DATA[(i<<1)])&&(temp.B[1]==DESC_DATA[(i<<1)+1]))
  204. {
  205. Serial.println(" PASSED!");
  206. }
  207. else
  208. {
  209. Serial.println(" FAILED!");
  210. error = true;
  211. }
  212. }
  213.  
  214. if(error)
  215. Serial.println("DATA ERROR. PROGRAM TERMINATED!");
  216. else
  217. Serial.println("ALL PROCESS DONE!");
  218.  
  219. delay(1000);
  220. exit(0);
  221. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement