source: ISPProgrammer/ISPprog/ISP_EEPROM.pas

Last change on this file was 363, checked in by chronos, 12 years ago
  • Added: Package ISPProgrammer for in-system programming of various chips. Supports Dallas ISP protocol, Presto, Rabbit RFU and some others Atmel devices.
File size: 4.0 KB
Line 
1unit ISP_EEPROM;
2
3{$MODE Delphi}
4
5interface
6
7procedure WaitForReadyEEPROM(adres:integer; value:byte);
8function ISPReadEEPROM_MakeRequest(adres:integer; buf:pointer):integer;
9function ISPReadEEPROM(adres:integer):byte;
10procedure ISPReadEEPROMPage(adres:integer; dane:pointer);
11procedure ISPWriteEEPROM(adres:integer; dana:byte);
12procedure ISPWriteEEPROMPage(adres:integer; dane:pointer);
13
14implementation
15
16uses Delays, Globals, ISP, MemBuffer, Processors, SPI;
17
18procedure WaitForReadyEEPROM(adres:integer; value:byte);
19var
20 b:byte;
21const
22 t1:Int64 = 0;
23begin
24 case Signatures[devicenr].algo_busy of
25 ALGO_BUSY_WAIT:
26 WaitMS(Signatures[devicenr].prog_time);
27
28 ALGO_BUSY_POLL_00FF:
29 begin
30 if (value <> $00) and (value <> $ff) then
31 begin
32 WaitMS (1);
33 Tic(t1);
34 repeat
35 b:=ISPReadEEPROM(adres);
36 until (b = value) or (TocMS(t1) > 100);
37 end
38 else
39 WaitMS(Signatures[devicenr].prog_time);
40 end;
41
42 ALGO_BUSY_POLL_FF, ALGO_BUSY_POLL_NMSB:
43 begin
44 if value <> $ff then
45 begin
46 WaitMS (1);
47 Tic(t1);
48 repeat
49 b:=ISPReadEEPROM(adres);
50 until (b = value) or (TocMS(t1) > 100);
51 end
52 else
53 WaitMS(Signatures[devicenr].prog_time);
54 end;
55
56 ALGO_BUSY_POLL_RDYBSY:
57 begin
58 Tic(t1);
59 repeat until (ISPPollReady) or (TocMS(t1) > 100);
60 end;
61 end;
62end;
63
64function ISPReadEEPROM_MakeRequest(adres:integer; buf:pointer):integer;
65var data:array[0..3] of byte;
66begin
67 Result := 0;
68 if (proctype = PROC_TYPE_AVR) or (proctype = PROC_TYPE_NEW51) or (proctype = PROC_TYPE_S8253) then
69 begin
70 data[0] := $A0;
71 data[1] := Hi(word(adres));
72 data[2] := Lo(word(adres));
73 data[3] := 0;
74 Result := 4;
75 end
76 else if proctype = PROC_TYPE_OLD51 then
77 begin
78 // AT89S53 / AT89S8252
79 data[0] := (Hi(word(adres)) shl 3) or 5;
80 data[1] := Lo(word(adres));
81 data[2] := 0;
82 Result := 3;
83 end;
84 Move (data, buf^, Result);
85end;
86
87function ISPReadEEPROM(adres:integer):byte;
88var
89 data:array[0..3] of byte;
90 len:integer;
91begin
92 Result:=$ff;
93 len:=ISPReadEEPROM_MakeRequest(adres, @data);
94 if len > 0 then
95 begin
96 WriteBytes(@data, len - 1);
97 Result:=ReadByte;
98 end;
99end;
100
101procedure ISPReadEEPROMPage(adres:integer; dane:pointer);
102begin
103 if proctype = PROC_TYPE_AVR then
104 begin
105 ISPReadMemoryBlock(BUF_EEPROM, adres, dane, Signatures[devicenr].epagesize);
106 end;
107end;
108
109procedure ISPWriteEEPROM(adres:integer; dana:byte);
110var data:array[0..3] of byte;
111begin
112 if (proctype = PROC_TYPE_AVR) or (proctype = PROC_TYPE_NEW51) or (proctype = PROC_TYPE_S8253) then
113 begin
114 // AVR / AT89S8253
115 data[0] := $C0;
116 data[1] := Hi(word(adres));
117 data[2] := Lo(word(adres));
118 data[3] := dana;
119 WriteBytes(@data, 4);
120 Sync;
121 end
122 else
123 begin
124 // AT89S53 / AT89S8252
125 data[0] := (Hi(word(adres)) shl 3) or 6;
126 data[1] := Lo(word(adres));
127 data[2] := dana;
128 WriteBytes(@data, 3);
129 Sync;
130 end;
131 WaitForReadyEEPROM(adres,dana);
132end;
133
134procedure ISPWriteEEPROMPage(adres:integer; dane:pointer);
135var
136 pagesize, pagemask, raddr:integer;
137 data:array[0..3] of byte;
138 ptr:^byte;
139begin
140 if proctype = PROC_TYPE_AVR then
141 begin
142 pagesize:=Signatures[devicenr].epagesize;
143 pagemask:=pagesize - 1;
144 ptr:=dane;
145 for raddr:=adres to adres + pagesize - 1 do
146 begin
147 // Load EEPROM Memory Page
148 data[0] := $c1;
149 data[1] := Hi(word(raddr and pagemask));
150 data[2] := Lo(word(raddr and pagemask));
151 data[3] := ptr^;
152 WriteBytes(@data, 4);
153 Inc(ptr);
154 end;
155 // Write EEPROM Memory Page
156 data[0] := $c2;
157 data[1] := Hi(word(adres and (not pagemask)));
158 data[2] := Lo(word(adres and (not pagemask)));
159 data[3] := 0;
160 WriteBytes(@data, 4);
161 Sync;
162 ptr:=dane;
163 WaitForReadyEEPROM(adres, ptr^);
164 end;
165end;
166
167end.
Note: See TracBrowser for help on using the repository browser.