📄 eeprom.lst
字号:
438 1 return 0;
439 1 }
440
441 /***** Boot_Flash_Write *****/
442 // Writes data byte to secondary flash.
443 // Accepts address in flash; data (byte).
444 // Returns 0 for successful write. If error, returns 1.
445 BYTE Boot_Flash_Write(WORD address, BYTE data_byte)
446 {
447 1 BYTE xdata readback;
448 1 BYTE xdata done;
449 1 BYTE xdata error;
450 1 BYTE xdata err;
451 1 BYTE xdata poll;
452 1 BYTE xdata erase_flag_0 = 0;
453 1 BYTE xdata erase_flag_1 = 0;
454 1 static BYTE reentry_flag;
455 1
456 1 // check for re-entrant call to this function
457 1 if ( reentry_flag ) return FLASH_ACCESS_ERROR;
458 1
459 1 reentry_flag = 1;
460 1
461 1 // un-comment for re-entrancy test
462 1 //EA = 1; /* enable interrupts */
463 1
464 1 done = FALSE;
465 1 err = FALSE;
466 1
467 1 // suspend any erase in progress
468 1 if ( Eeprom_Sector_Erase_Status(SECTOR_0) )
469 1 {
470 2 if ( Eeprom_Sector_Erase_Suspend(SECTOR_0) ) return SECTOR_ERASE_ERROR;
471 2 erase_flag_0 = 1;
472 2 }
473 1 if ( Eeprom_Sector_Erase_Status(SECTOR_1) )
474 1 {
475 2 if ( Eeprom_Sector_Erase_Suspend(SECTOR_1) ) return SECTOR_ERASE_ERROR;
476 2 erase_flag_1 = 1;
477 2 }
478 1
479 1 // disable interrupts during flash write sequence
480 1 EA = 0;
481 1
482 1 // write data byte
483 1 *((char xdata *) (SECTOR_0_BASE_ADDRESS + 0x0555)) = 0xAA;
484 1 *((char xdata *) (SECTOR_0_BASE_ADDRESS + 0x0AAA)) = 0x55;
485 1 *((char xdata *) (SECTOR_0_BASE_ADDRESS + 0x0555)) = 0xA0;
486 1 *((char xdata *) address) = data_byte;
487 1
488 1 // enable interrupts following write
489 1 EA = 1;
C51 COMPILER V7.00 EEPROM 02/10/2003 10:48:05 PAGE 9
490 1
491 1 // now use dat polling method to verify successful write
492 1 do
493 1 {
494 2 poll = *((char xdata *) address); // Read the location that was just programmed
495 2 error = poll & NVM_ERROR; // save timeout error bit at DQ5
496 2 poll = poll & NVM_DATA_POLL; // get DQ7 of poll byte read from flash
497 2
498 2 if ((data_byte & NVM_DATA_POLL) == poll) // compare DQ7
499 2 done = TRUE; // dat byte programmed into flash OK, indicate successful exit criteria
500 2 else if (error == NVM_ERROR) // check for timeout error
501 2 err = TRUE; // indicate timeout error occurred
502 2
503 2 } while((done == FALSE) && (err == FALSE));
504 1
505 1 // make sure timeout error and dat poll didn't occur simultaneously
506 1 if (err == TRUE)
507 1 {
508 2 poll = *((char xdata *) address); // Read location in flash again
509 2 poll = poll & NVM_DATA_POLL; // get DQ7 of poll byte read from flash
510 2
511 2 if ((data_byte & NVM_DATA_POLL) == poll) // compare DQ7
512 2 done = TRUE; // dat byte programmed into flash OK at the same time timout
513 2 //error occured, indicate successful exit criteria
514 2
515 2 *((char xdata *) (SECTOR_0_BASE_ADDRESS + 0x0555)) = 0xF0;
516 2 //*((char xdata *) 0x0555) = 0xF0; // reset the flash array (short reset instruction)
517 2 } // now delay 3 msec per dat sheet
518 1
519 1 // verify successful write by reading back data and comparing with original
520 1 readback = *((char xdata *) address); // readback data from flash
521 1
522 1 // resume any suspended erase
523 1 if ( erase_flag_0 )
524 1 {
525 2 if ( Eeprom_Sector_Erase_Resume(SECTOR_0) ) return SECTOR_ERASE_ERROR;
526 2 }
527 1 if ( erase_flag_1 )
528 1 {
529 2 if ( Eeprom_Sector_Erase_Resume(SECTOR_1) ) return SECTOR_ERASE_ERROR;
530 2 }
531 1
532 1 reentry_flag = 0;
533 1
534 1 return !(readback == data_byte); // if valid return success
535 1 }
536
537 /***** Read_Record_Data_Structure *****/
538 // Reads an entire record structure from memory.
539 // Accepts record id number.
540 // Returns address of last record. If error, returns error message.
541 WORD Read_Record_Data_Structure(WORD id_number, BYTE* buffer)
542 {
543 1 BYTE xdata valid_sector = 0xFF;
544 1 xdata struct sector_header xdata header;
545 1 xdata struct record_entry xdata record;
546 1 BYTE i;
547 1 BYTE *ptr;
548 1 BYTE xdata *data_buf;
549 1 WORD address;
550 1 WORD xdata base_address;
551 1 WORD xdata last_address;
C51 COMPILER V7.00 EEPROM 02/10/2003 10:48:05 PAGE 10
552 1
553 1 // get active sector
554 1 valid_sector = Find_Active_Sector(F_READ);
555 1 if ( valid_sector == SECTOR_ID_ERROR ) return SECTOR_ID_ERROR;
556 1
557 1 // get pointer to data
558 1 data_buf = buffer;
559 1
560 1 // calculate base address of data
561 1 base_address = SECTOR_0_BASE_ADDRESS + ((WORD)valid_sector * SECTOR_SIZE) +
562 1 (WORD)sizeof(header) + ( id_number * (WORD)sizeof(record) );
563 1
564 1 // get base record
565 1 ptr = (BYTE*) (&record);
566 1 address = base_address;
567 1 for ( i=0; i<sizeof(record); i++ )
568 1 {
569 2 ptr[i] = Boot_Flash_Read( address++ );
570 2 }
571 1
572 1 // get last record
573 1 if ( record.last_record_update != 0xFFFF )
574 1 {
575 2 address = base_address;
576 2 do
577 2 {
578 3 ptr = (BYTE*) (&record);
579 3 last_address = address;
580 3 for ( i=0; i<sizeof(record); i++ )
581 3 {
582 4 ptr[i] = Boot_Flash_Read( address++ );
583 4 }
584 3 address = record.last_record_update;
585 3 } while ( record.last_record_update != 0xFFFF );
586 2 }
587 1 else
588 1 {
589 2 last_address = base_address;
590 2 }
591 1
592 1 // Get last record
593 1 for (i=0; i<sizeof(record); i++)
594 1 {
595 2 data_buf[i] = Boot_Flash_Read(last_address++);
596 2 }
597 1
598 1 // return address of last record
599 1 return last_address - sizeof(record);
600 1 }
601
602 /***** Boot_Flash_Read *****/
603 // Reads data from secondary flash.
604 // Accepts address.
605 // Returns data at address.
606 BYTE Boot_Flash_Read(WORD address)
607 {
608 1 BYTE xdata erase_flag_0 = 0;
609 1 BYTE xdata erase_flag_1 = 0;
610 1 BYTE data_byte;
611 1 static BYTE xdata reentry_flag;
612 1
613 1 // check for re-entrant call to this function
C51 COMPILER V7.00 EEPROM 02/10/2003 10:48:05 PAGE 11
614 1 if ( reentry_flag ) return FLASH_ACCESS_ERROR;
615 1
616 1 reentry_flag = 1;
617 1
618 1 // un-comment for re-entrancy test
619 1 //EA = 1; /* enable interrupts */
620 1
621 1 // suspend any erase in progress
622 1 if ( Eeprom_Sector_Erase_Status(SECTOR_0) )
623 1 {
624 2 if ( Eeprom_Sector_Erase_Suspend(SECTOR_0) ) return SECTOR_ERASE_ERROR;
625 2 erase_flag_0 = 1;
626 2 }
627 1 if ( Eeprom_Sector_Erase_Status(SECTOR_1) )
628 1 {
629 2 if ( Eeprom_Sector_Erase_Suspend(SECTOR_1) ) return SECTOR_ERASE_ERROR;
630 2 erase_flag_1 = 1;
631 2 }
632 1
633 1 // read data byte from flash
634 1 data_byte = *((char xdata *) address);
635 1
636 1 // resume any suspended erase
637 1 if ( erase_flag_0 )
638 1 {
639 2 if ( Eeprom_Sector_Erase_Resume(SECTOR_0) ) return SECTOR_ERASE_ERROR;
640 2 }
641 1 if ( erase_flag_1 )
642 1 {
643 2 if ( Eeprom_Sector_Erase_Resume(SECTOR_1) ) return SECTOR_ERASE_ERROR;
644 2 }
645 1
646 1 reentry_flag = 0;
647 1
648 1 return data_byte;
649 1 }
650
651 /***** Eeprom_Sector_Erase *****/
652 // Erases one boot flash sector.
653 // Accepts sector number (0-3).
654 // Returns 0 for successful erasure. If error, returns 1.
655 BYTE Eeprom_Sector_Erase(BYTE sector)
656 {
657 1 BYTE xdata done;
658 1 BYTE xdata poll;
659 1 BYTE xdata error;
660 1 BYTE xdata err;
661 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -