📄 copyer.lst
字号:
187 {
188 1 unsigned char Loop = TRUE;
189 1 unsigned char PreData;
190 1 unsigned char CurrData;
191 1 unsigned long TimeOut = 0;
192 1
193 1 PAGE0;
194 1 PreData = XBYTE[Dst];
195 1 PreData = PreData & 0x40;
196 1 while ((TimeOut< 0x07FFFFFF) && (Loop))
197 1 {
198 2 CurrData = XBYTE[Dst];
199 2 CurrData = CurrData & 0x40;
200 2 if (PreData == CurrData)
201 2 Loop = FALSE; //ready to exit the while loop
202 2 PreData = CurrData;
203 2 // WDT_CONTR = 0x34;
204 2 TimeOut++;
205 2 }
206 1 }
207
208 /*================================================================
209 * 函 数 名: Program_One_Byte
210 * 参 数: SrcByte: 数据 hadr:地址16-18 Dst: 地址A0-A15
211 * 功能描述:
212 * 往FLASH写入一个字节
213 * 返 回 值: none
214 * 作 者: uCore
215 * 修改日期: 2008-10-21 00:26
216 ===================================================================*/
217 void Program_One_Byte(unsigned char SrcByte,unsigned char hadr,unsigned int Dst)
218 {
219 1 PAGE0;
220 1 XBYTE[0x5555]=0xaa;
221 1 XBYTE[0x2aaa]=0x55;
222 1 XBYTE[0x5555]=0xa0;
223 1
224 1 TurnChipAdr(hadr);
225 1
226 1 XBYTE[Dst] = SrcByte; // transfer the byte to destination
227 1 Check_Toggle_Ready(Dst); //wait for TOGGLE bit to get ready
228 1 }
229
230 /*================================================================
231 * 函 数 名: Erase_One_Sector
232 * 参 数: e_adr: 扇区地址 (39SF040:128,39SF020:64)
233 * 功能描述:
234 * 擦除一个扇区
235 * 返 回 值: none
236 * 作 者: uCore
237 * 修改日期: 2008-10-21 00:22
C51 COMPILER V7.50 COPYER 10/21/2008 00:32:54 PAGE 5
238 ===================================================================*/
239 int Erase_One_Sector(unsigned char e_adr)
240 {
241 1 unsigned int tmp;
242 1 /* Issue the Sector Erase command to 39VF040 */
243 1 PAGE0;
244 1 tmp=(e_adr%16)*0x1000;
245 1 TurnChipAdr(e_adr/16);
246 1 XBYTE[0x5555]=0xaa;
247 1 XBYTE[0x2aaa]=0x55;
248 1 XBYTE[0x5555]=0x80;
249 1 XBYTE[0x5555]=0xaa;
250 1 XBYTE[0x2aaa]=0x55;
251 1 XBYTE[tmp] =0x30; /* write data 0x30 to the address */
252 1
253 1 Delay_10_Milli_Seconds(); /* check DATABOOK for the most */
254 1 Delay_10_Milli_Seconds(); /* check DATABOOK for the most */
255 1 Delay_10_Milli_Seconds(); /* check DATABOOK for the most */
256 1 /* accurate value -- Tse */
257 1 }
258
259 /*================================================================
260 * 函 数 名: main
261 * 参 数: none
262 * 功能描述:
263 * 主函数
264 * 返 回 值: none
265 * 作 者: uCore
266 * 修改日期: 2008-10-21 00:15
267 ===================================================================*/
268 void main(void)
269 {
270 1 unsigned char sectors;
271 1 unsigned int raddr,waddr;
272 1 unsigned char idata datbuf[128];
273 1 unsigned char i,j;
274 1 unsigned char pages;
275 1
276 1 inichip();
277 1 if(CHIP) //FLASH型号查询
278 1 sectors = 64; //256K,64扇区
279 1 else
280 1 sectors = 128; //512K
281 1
282 1 BUZ = 1;
283 1 while(1)
284 1 {
285 2 STAR = 1;
286 2 if(!STAR) //启动
287 2 {
288 3 ledon = 1; //点亮LED,
289 3 ledfls = 20; //每秒开关一次
290 3 SendPackageToCom(EraseChip,18);
291 3 for(i=0; i<sectors; ++i) //擦除
292 3 {
293 4 Erase_One_Sector(i);
294 4 SendPackageToCom(Dot,1);
295 4 }
296 3
297 3 SendPackageToCom(StartProgrammer,21);
298 3 pages = sectors/16;
299 3 for(i=0; i<pages; ++i) //写入
C51 COMPILER V7.50 COPYER 10/21/2008 00:32:54 PAGE 6
300 3 {
301 4 raddr = 0;
302 4 waddr = 0;
303 4 do{
304 5 //read;
305 5 TurnChipAdr(i);
306 5 S_HZK; //选择源
307 5 j = 0;
308 5 while(j<128) //读128byte
309 5 {
310 6 datbuf[j] = XBYTE[raddr+j];
311 6 ++j;
312 6 }
313 5 raddr = raddr + 128;
314 5
315 5 //write
316 5 S_SAV; //选中目标
317 5 j = 0;
318 5 while(j<128) //读128byte
319 5 {
320 6 Program_One_Byte(datbuf[j],i,waddr+j);
321 6 ++j;
322 6 }
323 5 waddr = waddr + 128;
324 5 if(raddr%4096==0)
325 5 SendPackageToCom(Dot,1);
326 5 }while(raddr != 0);
327 4 }
328 3 SendPackageToCom(VerifyChip,19);
329 3 pages = sectors/16;
330 3 for(i=0; i<pages; ++i) //校验
331 3 {
332 4 raddr = 0;
333 4 TurnChipAdr(i);
334 4 do{
335 5 //read;
336 5 S_HZK;
337 5 j = 0;
338 5 while(j<128) //读128byte
339 5 {
340 6 datbuf[j] = XBYTE[raddr+j];
341 6 ++j;
342 6 }
343 5
344 5 //write
345 5 S_SAV;
346 5 j = 0;
347 5 while(j<128) //读128byte
348 5 {
349 6 if(datbuf[j] != XBYTE[raddr+j])goto FAIL; //校验失败,退出
350 6 ++j;
351 6 }
352 5 raddr = raddr + 128;
353 5 if(raddr%4096==0)
354 5 SendPackageToCom(Dot,1);
355 5 }while(raddr != 0);
356 4 }
357 3 FAIL:
358 3 if((i == pages) && (raddr == 0)) //成功
359 3 {
360 4 SendPackageToCom(ProSuc,22);
361 4 ledon = 0; //关闭LED
C51 COMPILER V7.50 COPYER 10/21/2008 00:32:54 PAGE 7
362 4 }
363 3 else
364 3 {
365 4 SendPackageToCom(ProFail,16);
366 4 ledfls = 10; //出错,LED闪烁速度加快
367 4 }
368 3 }
369 2 }
370 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 830 ----
CONSTANT SIZE = 97 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 3 20
IDATA SIZE = ---- 128
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -