1 /*********************************************************************
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 #include <xc.h>
34 #include <stdbool.h>
35 #include "MainBrain.h"
36
37
38 const uint16_t SECTOR_SIZE = 4095;
39
40 uint8_t data_flash;
41 unsigned long address_flash;
42 uint8_t Flash_MID;
43 uint8_t Flash_DID;
44 int flash_size;
45 unsigned long Bytes_used;
46 uint32_t dly = 10000;
47
48 void Flash_Init(void)
49 {
50
51 TRISBbits.TRISB2 = 0;
52 PORTBbits.RB2 = 0;
53
54
55 TRISBbits.TRISB4 = 0;
56 PORTBbits.RB4 = 0;
57
58
59 TRISBbits.TRISB3 = 0;
60 PORTBbits.RB3 = 0;
61
62
63 TRISAbits.TRISA10 = 0;
64 PORTAbits.RA10 = 1;
65
66
67
68
69
70 PORTAbits.RA10 = 0;
71
72
73 PMWADDR = 0x5555;
74 PMDOUT = 0xaa;
75 while(PMMODEbits.BUSY == 1);
76
77 PMWADDR = 0x2aaa;
78 PMDOUT = 0x55;
79 while(PMMODEbits.BUSY == 1);
80 Delay32(0, dly);
81 PMWADDR = 0x5555;
82 PMDOUT = 0x90;
83 while(PMMODEbits.BUSY == 1);
84
85
86 PMRADDR = 0x0;
87
88 Flash_MID = PMRDIN;
89 while(PMMODEbits.BUSY == 1);
90
91 Flash_MID = PMRDIN;
92 while(PMMODEbits.BUSY == 1);
93
94
95 PMWADDR = 0;
96 PMDOUT = 0xf0;
97 while(PMMODEbits.BUSY == 1);
98
99
100 PORTAbits.RA10 = 1;
101
102
103 if(Flash_MID != 0xc2)
104 {
105 lastError = lastError | 1;
106 }
107
108
109
110
111
112 PORTAbits.RA10 = 0;
113
114
115
116 PMWADDR = 0x5555;
117 PMDOUT = 0xaa;
118 while(PMMODEbits.BUSY == 1);
119
120 PMWADDR = 0x2aaa;
121 PMDOUT = 0x55;
122 while(PMMODEbits.BUSY == 1);
123
124 PMWADDR = 0x5555;
125 PMDOUT = 0x90;
126 while(PMMODEbits.BUSY == 1);
127
128 Delay32(0, dly);
129
130
131 PMRADDR = 0x1;
132
133
134 Flash_DID = PMRDIN;
135 while(PMMODEbits.BUSY == 1);
136
137 Flash_DID = PMRDIN;
138 while(PMMODEbits.BUSY == 1);
139
140
141 PMWADDR = 1;
142 PMDOUT = 0xf0;
143 while(PMMODEbits.BUSY == 1);
144
145 Delay32(0, dly);
146
147
148 PORTAbits.RA10 = 1;
149
150
151 if(Flash_DID != 0x4f)
152 {
153 lastError = lastError | 2;
154 }
155
156 }
157
158 void Flash_High_Address(unsigned address_flash)
159 {
160
161
162 if(address_flash > 0xffff)
163 {
164
165 PORTBbits.RB2 = 1;
166
167
168 PORTBbits.RB4 = 0;
169
170
171 PORTBbits.RB3 = 0;
172 }
173
174
175 if(address_flash > 0x1ffff)
176 {
177
178 PORTBbits.RB2 = 0;
179
180
181 PORTBbits.RB4 = 1;
182
183
184 PORTBbits.RB3 = 0;
185 }
186
187
188 if(address_flash > 0x2ffff)
189 {
190
191 PORTBbits.RB2 = 1;
192
193
194 PORTBbits.RB4 = 1;
195
196
197 PORTBbits.RB3 = 0;
198 }
199
200
201 if(address_flash > 0x3ffff)
202 {
203
204 PORTBbits.RB2 = 0;
205
206
207 PORTBbits.RB4 = 0;
208
209
210 PORTBbits.RB3 = 1;
211 }
212
213
214 if(address_flash > 0x4ffff)
215 {
216
217 PORTBbits.RB2 = 1;
218
219
220 PORTBbits.RB4 = 0;
221
222
223 PORTBbits.RB3 = 1;
224 }
225
226
227 if(address_flash > 0x5ffff)
228 {
229
230 PORTBbits.RB2 = 0;
231
232
233 PORTBbits.RB4 = 1;
234
235
236 PORTBbits.RB3 = 1;
237 }
238
239
240 if(address_flash > 0x6ffff)
241 {
242
243 PORTBbits.RB2 = 1;
244
245
246 PORTBbits.RB4 = 1;
247
248
249 PORTBbits.RB3 = 1;
250 }
251 }
252
253 void Flash_RD(unsigned address_flash)
254 {
255
256 Flash_High_Address(address_flash);
257
258
259 PMRADDR = address_flash & 0x0ffff;
260
261
262 PORTAbits.RA10 = 0;
263
264
265 data_flash = PMRDIN;
266 while(PMMODEbits.BUSY == 1);
267
268 data_flash = PMRDIN;
269 while(PMMODEbits.BUSY == 1);
270
271
272 PORTAbits.RA10 = 1;
273
274
275 PORTBbits.RB2 = 0;
276
277
278 PORTBbits.RB4 = 0;
279
280
281 PORTBbits.RB3 = 0;
282 }
283
284 void Flash_WR(unsigned address_flash, uint8_t data_flash)
285 {
286 LED_Port(2);
287
288 Flash_High_Address(address_flash);
289
290
291 PORTAbits.RA10 = 0;
292
293
294 PMWADDR = 0x5555;
295 PMDOUT = 0xaa;
296 while(PMMODEbits.BUSY == 1);
297
298 PMWADDR = 0x2aaa;
299 PMDOUT = 0x55;
300 while(PMMODEbits.BUSY == 1);
301
302 PMWADDR = 0x5555;
303 PMDOUT = 0xa0;
304 while(PMMODEbits.BUSY == 1);
305
306
307
308 PMWADDR = address_flash & 0x0ffff;
309 PMRADDR = PMWADDR;
310
311 PMDOUT = data_flash;
312 while(PMMODEbits.BUSY == 1);
313
314 uint8_t j = 0;
315 uint8_t i = PMRDIN;
316
317
318
319 while(data_flash != i)
320 {
321 i = PMRDIN;
322 while(PMMODEbits.BUSY == 1);
323 j++;
324 LED_Port(j);
325 }
326
327 j = 0;
328
329
330
331
332
333 while(i != data_flash)
334 {
335 i = PMRDIN;
336 while(PMMODEbits.BUSY == 1);
337 j++;
338 LED_Port(j);
339
340 }
341 LED_Port(0);
342
343 PORTAbits.RA10 = 1;
344
345
346 PORTBbits.RB2 = 0;
347
348
349 PORTBbits.RB4 = 0;
350
351
352 PORTBbits.RB3 = 0;
353 }
354
355 void Flash_Sector_Erase(int erase_sector)
356 {
357 data_flash = 0;
358
359 erase_sector = erase_sector << 12;
360
361 PORTAbits.RA10 = 0;
362
363
364 PMWADDR = 0x5555;
365 PMDOUT = 0xaa;
366 while(PMMODEbits.BUSY == 1);
367
368 PMWADDR = 0x2aaa;
369 PMDOUT = 0x55;
370 while(PMMODEbits.BUSY == 1);
371
372 PMWADDR = 0x5555;
373 PMDOUT = 0x80;
374 while(PMMODEbits.BUSY == 1);
375
376 PMWADDR = 0x5555;
377 PMDOUT = 0xaa;
378 while(PMMODEbits.BUSY == 1);
379
380 PMWADDR = 0x2aaa;
381 PMDOUT = 0x55;
382 while(PMMODEbits.BUSY == 1);
383
384
385 PMWADDR = erase_sector;
386 PMDOUT = 0x30;
387 while(PMMODEbits.BUSY == 1);
388 int j = 0;
389 while(data_flash != 0xff)
390 {
391 data_flash = PMRDIN;
392 while(PMMODEbits.BUSY == 1);
393
394 j++;
395 LED_Port(j);
396 }
397
398 PORTAbits.RA10 = 1;
399 }
400
401 void Flash_Chip_Erase(void)
402 {
403 int i;
404 data_flash = 0;
405
406
407 PORTAbits.RA10 = 0;
408
409
410 PMWADDR = 0x5555;
411 PMDOUT = 0xaa;
412 while(PMMODEbits.BUSY == 1);
413
414 PMWADDR = 0x2aaa;
415 PMDOUT = 0x55;
416 while(PMMODEbits.BUSY == 1);
417
418 PMWADDR = 0x5555;
419 PMDOUT = 0x80;
420 while(PMMODEbits.BUSY == 1);
421
422 PMWADDR = 0x5555;
423 PMDOUT = 0xaa;
424 while(PMMODEbits.BUSY == 1);
425
426 PMWADDR = 0x2aaa;
427 PMDOUT = 0x55;
428 while(PMMODEbits.BUSY == 1);
429
430 PMWADDR = 0x5555;
431 PMDOUT = 0x10;
432 while(PMMODEbits.BUSY == 1);
433
434 while(data_flash != 0xff)
435 {
436 data_flash = PMRDIN;
437 while(PMMODEbits.BUSY == 1);
438 }
439
440
441 PORTAbits.RA10 = 1;
442 }
443
444 void Flash_Get_Bytes_Used(void)
445 {
446 unsigned long i;
447 Bytes_used = 0;
448
449 if(Flash_DID == 0xd5)
450 {
451 for(i=0; i <= 0x1ffff; i++)
452 {
453 Flash_RD(i);
454 if(data_flash != 0xff)
455 {
456 Bytes_used++;
457 }
458 }
459 }
460 if(Flash_DID == 0xd6)
461 {
462 for(i=0; i <= 0x2ffff; i++)
463 {
464 Flash_RD(i);
465 if(data_flash != 0xff)
466 {
467 Bytes_used++;
468 }
469 }
470 }
471
472 if(Flash_DID == 0xd7)
473 {
474 for(i=0; i <= 0x7ffff; i++)
475 {
476 Flash_RD(i);
477 if(data_flash != 0xff)
478 {
479 Bytes_used++;
480 }
481 }
482 }
483
484 PORTBbits.RB8 = 0;
485 PORTAbits.RA5 = 0;
486 PORTAbits.RA3 = 0;
487
488 return;
489 }
490
491
492