1 | unit ISP_EEPROM;
|
---|
2 |
|
---|
3 | {$MODE Delphi}
|
---|
4 |
|
---|
5 | interface
|
---|
6 |
|
---|
7 | procedure WaitForReadyEEPROM(adres:integer; value:byte);
|
---|
8 | function ISPReadEEPROM_MakeRequest(adres:integer; buf:pointer):integer;
|
---|
9 | function ISPReadEEPROM(adres:integer):byte;
|
---|
10 | procedure ISPReadEEPROMPage(adres:integer; dane:pointer);
|
---|
11 | procedure ISPWriteEEPROM(adres:integer; dana:byte);
|
---|
12 | procedure ISPWriteEEPROMPage(adres:integer; dane:pointer);
|
---|
13 |
|
---|
14 | implementation
|
---|
15 |
|
---|
16 | uses Delays, Globals, ISP, MemBuffer, Processors, SPI;
|
---|
17 |
|
---|
18 | procedure WaitForReadyEEPROM(adres:integer; value:byte);
|
---|
19 | var
|
---|
20 | b:byte;
|
---|
21 | const
|
---|
22 | t1:Int64 = 0;
|
---|
23 | begin
|
---|
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;
|
---|
62 | end;
|
---|
63 |
|
---|
64 | function ISPReadEEPROM_MakeRequest(adres:integer; buf:pointer):integer;
|
---|
65 | var data:array[0..3] of byte;
|
---|
66 | begin
|
---|
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);
|
---|
85 | end;
|
---|
86 |
|
---|
87 | function ISPReadEEPROM(adres:integer):byte;
|
---|
88 | var
|
---|
89 | data:array[0..3] of byte;
|
---|
90 | len:integer;
|
---|
91 | begin
|
---|
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;
|
---|
99 | end;
|
---|
100 |
|
---|
101 | procedure ISPReadEEPROMPage(adres:integer; dane:pointer);
|
---|
102 | begin
|
---|
103 | if proctype = PROC_TYPE_AVR then
|
---|
104 | begin
|
---|
105 | ISPReadMemoryBlock(BUF_EEPROM, adres, dane, Signatures[devicenr].epagesize);
|
---|
106 | end;
|
---|
107 | end;
|
---|
108 |
|
---|
109 | procedure ISPWriteEEPROM(adres:integer; dana:byte);
|
---|
110 | var data:array[0..3] of byte;
|
---|
111 | begin
|
---|
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);
|
---|
132 | end;
|
---|
133 |
|
---|
134 | procedure ISPWriteEEPROMPage(adres:integer; dane:pointer);
|
---|
135 | var
|
---|
136 | pagesize, pagemask, raddr:integer;
|
---|
137 | data:array[0..3] of byte;
|
---|
138 | ptr:^byte;
|
---|
139 | begin
|
---|
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;
|
---|
165 | end;
|
---|
166 |
|
---|
167 | end.
|
---|