📄 eeprom.lst
字号:
C51 COMPILER V7.06 EEPROM 12/15/2005 23:22:10 PAGE 5
242 /******************************************************************************************************/
243
244 void Enable_Chip_Data_Protection()
245 {
246 1 UINT8 xdata *Temp;
247 1
248 1 AreaSelect=1;
249 1 Temp = (UINT8 xdata *)0x5555; /* set up address to be C000:5555h */
250 1 *Temp = 0xAA; /* write data 0xAA to the address */
251 1 AreaSelect=0;
252 1 Temp = (UINT8 xdata *)0x6AAA; /* set up address to be C000:2AAAh */
253 1 *Temp = 0x55; /* write data 0x55 to the address */
254 1 AreaSelect=1;
255 1 Temp = (UINT8 xdata *)0x5555; /* set up address to be C000:5555h */
256 1 *Temp = 0xA0; /* write data 0xA0 to the address */
257 1
258 1 delay(10);
259 1 }
260
261
262 void SYSCLK_Init (void)
263 {
264 1 int i;
265 1
266 1 WDTCN = 0xde; // disable watchdog timer
267 1 WDTCN = 0xad;
268 1
269 1 OSCXCN = 0x67; // start external oscillator with 22.1184MHz crystal
270 1
271 1 for (i=0; i < 256; i++) ; // XTLVLD blanking interval (>1ms)
272 1
273 1 while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
274 1
275 1 OSCICN = 0x88; // select external oscillator as SYSCLK source and enable missing clo
-ck detector
276 1
277 1 // OSCICN = 0x97; //// select internal oscillator as SYSCLK
278 1 }
279
280 void eeprom_Init(void)
281 {
282 1 EMI0CF = 0x29; //地址复用方式,带块选择的分片方式,使用P4~P7端口
283 1 // EMI0CN = 0x40; //给出地址总线高8位
284 1 EMI0TC = 0x4A; //时序控制寄存器设置
285 1
286 1 P74OUT = 0xff;
287 1 XBR2 = 0x40; //弱上拉,允许交叉开关
288 1
289 1 DATA=0x00;
290 1 ADDR=0x40;
291 1 AreaSelect=0xC0; //RD,WR='1',ALE='0'
292 1 }
293
294 void eepromErase()
295 {
296 1 AreaSelect =0x61; /* WR='0', RD='1',ALE='1',片选为1 */
297 1 *(UINT8 xdata *)(Base_ROM_ADD + 0x1555) = 0xAA;
298 1 AreaSelect = 0x60;
299 1 *(UINT8 xdata *)(Base_ROM_ADD + 0x2AAA) = 0x55;
300 1 AreaSelect = 0x61;
301 1 *(UINT8 xdata *)(Base_ROM_ADD + 0x1555) = 0x80;
302 1 *(UINT8 xdata *)(Base_ROM_ADD + 0x1555) = 0xAA;
C51 COMPILER V7.06 EEPROM 12/15/2005 23:22:10 PAGE 6
303 1 AreaSelect = 0x60;
304 1 *(UINT8 xdata *)(Base_ROM_ADD + 0x2AAA) = 0x55;
305 1 AreaSelect =0x61;
306 1 *(UINT8 xdata *)(Base_ROM_ADD + 0x1555) = 0x10;
307 1 delay(20);
308 1 }
309
310 //eeprom读函数,offset为偏移量,返回读出的值
311 UINT8 eeprom_ReadByte(UINT8 blocknum,UINT16 offset)
312 {
313 1 UINT8 result;
314 1 UINT8 xdata *addr;
315 1 AreaSelect = (UINT8)(blocknum|0xA0);
316 1 // addr=(UINT16 *)(Base_ROM_ADD + (UINT16)offset);
317 1 // DATA = (Base_ROM_ADD + (UINT16)offset)&&0x00ff;
318 1 // ADDR = ((Base_ROM_ADD + (UINT16)offset)>>8)&& 0x00ff;
319 1 // AreaSelect |= 0x20; //ALE置1,锁存该地址
320 1 // AreaSelect &= 0x9f; //ALE清零,RD='0',读选通
321 1 addr=(UINT8 xdata *)(Base_ROM_ADD + offset);
322 1 result= *addr;
323 1 return result;
324 1 // AreaSelect |= 0xd0; //RD='1'
325 1 }
326
327 //eeprom写函数,datas为写入值
328 bool eeprom_Writepage(UINT8 blocknum,UINT16 offset,UINT16 number,UINT8* datas)
329 {
330 1 volatile UINT8 tmp=0;
331 1 UINT8* xdata addr;
332 1 volatile UINT8 leftnum=0;
333 1
334 1 // if ((valueRead = eeprom_ReadByte( blocknum,offset )) == datas)
335 1 // return(true);
336 1 if(number==0)
337 1 return 1;
338 1 // eeprom_Unlock();
339 1 // delay(100);
340 1
341 1
342 1 addr=(UINT8 xdata *)(Base_ROM_ADD+offset);
343 1 leftnum=EEPROMPAGE-number;
344 1 eeprom_Lock();
345 1 AreaSelect = (UINT8)(blocknum|0x60);
346 1 for(tmp=0;tmp<number;tmp++)
347 1 {
348 2 *addr++=datas[tmp];
349 2 }
350 1 if(number<EEPROMPAGE)
351 1 {
352 2 for(tmp=0;tmp<leftnum;tmp++)
353 2 {
354 3 *addr++=0;
355 3 }
356 2 }
357 1
358 1 /* loop read until is sticks */
359 1 delay(100);
360 1 AreaSelect=0;
361 1 AreaSelect=1;
362 1 AreaSelect=2;
363 1 AreaSelect=3;
364 1 AreaSelect=4;
C51 COMPILER V7.06 EEPROM 12/15/2005 23:22:10 PAGE 7
365 1 // eeprom_Unlock();
366 1
367 1 // DATA = ((Base_ROM_ADD + (INT16)offset))&&0x00ff;
368 1 // ADDR = ((Base_ROM_ADD + (INT16)offset)>>8)&& 0x00ff;
369 1 // AreaSelect |= 0x20; //ALE置1,锁存该地址
370 1 // AreaSelect &= 0x5f; //ALE清零,WR='0',写选通
371 1
372 1 // *addr=datas;
373 1 // AreaSelect |= 0xd0; //WR='1'
374 1 /*
375 1 while((eeprom_ReadByte(blocknum,offset))!=datas && i<10)
376 1 {
377 1 i++;
378 1 delay(10);
379 1 }
380 1 if(i<10) return 1;
381 1 else return 0;
382 1 */
383 1 return 1;
384 1 }
385
386 bool eepromWrite(UINT8 blocknum, UINT16 offset, UINT16 datanum, UINT8 * datas)
387 {
388 1 UINT16 i=0,j;
389 1 UINT8 xdata * datapoint=datas;
390 1 UINT8 writebuf[128];
391 1 UINT8 xdata * addr=(UINT8 xdata *)(Base_ROM_ADD+offset);
392 1 while(datanum>EEPROMPAGE)
393 1 {
394 2 Write_29EE020(blocknum, datapoint, addr);
395 2 i++;
396 2 datanum-=EEPROMPAGE;
397 2 datapoint+=EEPROMPAGE;
398 2 addr+=EEPROMPAGE;
399 2 }
400 1 for(j=0;j<datanum;j++)
401 1 writebuf[j]=*datapoint++;
402 1 Write_29EE020(blocknum, writebuf, addr);
403 1 return 1;
404 1 }
405
406 void eeprom_Unlock()
407 {
408 1 AreaSelect =0x61; /* WR='0', RD='1',ALE='1',片选为1 */
409 1 *(UINT8 xdata *)(Base_ROM_ADD + 0x1555) = 0xAA;
410 1 AreaSelect = 0x60;
411 1 *(UINT8 xdata *)(Base_ROM_ADD + 0x2AAA) = 0x55;
412 1 AreaSelect = 0x61;
413 1 *(UINT8 xdata *)(Base_ROM_ADD + 0x1555) = 0x80;
414 1 *(UINT8 xdata *)(Base_ROM_ADD + 0x1555) = 0xAA;
415 1 AreaSelect = 0x60;
416 1 *(UINT8 xdata *)(Base_ROM_ADD + 0x2AAA) = 0x55;
417 1 AreaSelect =0x61;
418 1 *(UINT8 xdata *)(Base_ROM_ADD + 0x1555) = 0x20;
419 1 delay(10);
420 1 }
421
422 void eeprom_Lock()
423 {
424 1 AreaSelect =0x61; /* WR='0', RD='1',ALE='1',片选为1 */
425 1 *(UINT8 xdata *)(Base_ROM_ADD + 0x1555) = 0xAA;
426 1 AreaSelect = 0x60;
C51 COMPILER V7.06 EEPROM 12/15/2005 23:22:10 PAGE 8
427 1 *(UINT8 xdata *)(Base_ROM_ADD + 0x2AAA) = 0x55;
428 1 AreaSelect = 0x61;
429 1 *(UINT8 xdata *)(Base_ROM_ADD + 0x1555) = 0xA0;
430 1 delay(10);
431 1 }
432
433 /*延时子程序
434 void delay(UINT16 ms)
435 {
436 UINT16 base=2500;
437 while(ms--)
438 {
439 base=2500;
440 while(base--);
441 }
442 }
443 */
444 //测试代码
445 void main(void)
446 {
447 1
448 1 UINT8 test[12];
449 1 int tmp,i;
450 1 char buf[]={0x25,0x3a,0x42,0xbd,0xcd,0xec,0x45,0xff,0x74,0x3a,0x2c,0x56};
451 1 SYSCLK_Init ();
452 1 eeprom_Init();
453 1 /*
454 1 for(i=1;i<15;i++)
455 1 {
456 1 a=eeprom_WriteByte(i,100,i);
457 1 delay(10);
458 1 eeprom_WriteByte(i,i*100,i);
459 1 delay(10);
460 1 }
461 1 */
462 1
463 1
464 1
465 1 tmp=Check_SST_29EE020();
466 1 eepromWrite(0,0,12,buf);
467 1
468 1 for(i=0;i<12;i++)
469 1 test[i]=eeprom_ReadByte(0,i);
470 1
471 1
472 1
473 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1328 ----
CONSTANT SIZE = 12 ----
XDATA SIZE = ---- 206
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
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 + -