📄 eeprom.lst
字号:
884 BYTE Eeprom_Sector_Erase_Status(BYTE sector)
885 {
886 1 BYTE poll;
887 1
888 1 switch (sector)
889 1 {
890 2 case SECTOR_0:
891 2 poll = *((volatile unsigned char xdata *)SECTOR_0_BASE_ADDRESS);
892 2 return !( poll & 0x80);
893 2 case SECTOR_1:
894 2 poll = *((volatile unsigned char xdata *)SECTOR_1_BASE_ADDRESS);
895 2 return !( poll & 0x80);
896 2 case SECTOR_2:
897 2 poll = *((volatile unsigned char xdata *)SECTOR_2_BASE_ADDRESS);
898 2 return !( poll & 0x80);
899 2 case SECTOR_3:
900 2 poll = *((volatile unsigned char xdata *)SECTOR_3_BASE_ADDRESS);
901 2 return !( poll & 0x80);
902 2 default:
903 2 return 1;
904 2 }
905 1 return 0;
906 1 }
907
908 /***** Find_Next_Address *****/
909 // Finds next available address for data record.
910 // Returns next available address.
911 WORD Find_Next_Address(void)
912 {
913 1 BYTE xdata valid_sector;
914 1 xdata struct sector_header xdata header;
915 1 xdata struct record_entry xdata record;
916 1 WORD address;
917 1 BYTE *ptr;
918 1 WORD i;
919 1
920 1 // Find valid sector
921 1 valid_sector = Find_Active_Sector(F_WRITE);
922 1 if ( valid_sector == SECTOR_ID_ERROR ) return SECTOR_ID_ERROR;
923 1
C51 COMPILER V7.00 EEPROM 02/10/2003 10:48:05 PAGE 16
924 1 // Get sector header
925 1 ptr = (BYTE*) (&header);
926 1 address = SECTOR_0_BASE_ADDRESS + ((WORD)valid_sector * SECTOR_SIZE);
927 1 for ( i=0; i<(WORD)sizeof(header); i++ )
928 1 {
929 2 ptr[i] = Boot_Flash_Read( address++ );
930 2 }
931 1
932 1 // Calculate address
933 1 address = SECTOR_0_BASE_ADDRESS + ((WORD)valid_sector * SECTOR_SIZE) + // sector base address
934 1 (WORD)sizeof(header) + // sector header
935 1 (header.max_records * (WORD)sizeof(record)); // first instance of each record
936 1 ptr = (BYTE*) (&record);
937 1 for ( i=0; i < SECTOR_SIZE; i += sizeof(record) )
938 1 {
939 2 if ( Boot_Flash_Read( address ) == UNINITIALIZED ) return address;
940 2 address += sizeof(record);
941 2 if ( address >= (SECTOR_0_BASE_ADDRESS + ((WORD)valid_sector * SECTOR_SIZE)
942 2 + SECTOR_SIZE - (WORD)sizeof(record)) ) return SECTOR_FULL;
943 2 }
944 1 return ADDRESS_ERROR;
945 1 }
946
947
948 /***** Find_Active_Sector *****/
949 // Finds active sector.
950 // Returns sector number.
951 // If error, returns error code.
952 BYTE Find_Active_Sector(BYTE io)
953 {
954 1 xdata struct sector_header xdata header0;
955 1 xdata struct sector_header xdata header1;
956 1 WORD address;
957 1 BYTE *ptr;
958 1 BYTE i;
959 1
960 1 // Check sector 0 for status
961 1 ptr = (BYTE*) (&header0);
962 1 address = SECTOR_0_BASE_ADDRESS;
963 1 for ( i=0; i < sizeof(header0); i++ )
964 1 {
965 2 ptr[i] = Boot_Flash_Read( address++ );
966 2 }
967 1 // Check sector 1 for status
968 1 ptr = (BYTE*) (&header1);
969 1 address = SECTOR_1_BASE_ADDRESS;
970 1 for ( i=0; i < sizeof(header1); i++ )
971 1 {
972 2 ptr[i] = Boot_Flash_Read( address++ );
973 2 }
974 1
975 1 switch (io)
976 1 {
977 2 case F_WRITE: // write
978 2 if( header0.sector_status == VALID__SECTOR )
979 2 {
980 3 if( header1.sector_status == RECEIVE_DATA )
981 3 {
982 4 return (SECTOR_1);
983 4 }
984 3 else
985 3 {
C51 COMPILER V7.00 EEPROM 02/10/2003 10:48:05 PAGE 17
986 4 return (SECTOR_0);
987 4 }
988 3 }
989 2 else if( header1.sector_status == VALID__SECTOR )
990 2 {
991 3 if( header0.sector_status == RECEIVE_DATA )
992 3 {
993 4 return (SECTOR_0);
994 4 }
995 3 else
996 3 {
997 4 return (SECTOR_1);
998 4 }
999 3 }
1000 2 case F_READ: // read
1001 2 if( header0.sector_status == VALID__SECTOR )
1002 2 {
1003 3 return (SECTOR_0);
1004 3 }
1005 2 else if( header1.sector_status == VALID__SECTOR )
1006 2 {
1007 3 return (SECTOR_1);
1008 3 }
1009 2 default:
1010 2 return (SECTOR_0);
1011 2 }
1012 1 return 1;
1013 1 }
1014
1015
1016 /***** Eeprom_Sector_Swap *****/
1017 // Transfers data from full sector to empty one.
1018 // Returns new sector number.
1019 BYTE Eeprom_Sector_Swap(WORD inn, BYTE xdata *buf)
1020 {
1021 1 xdata struct sector_header xdata sector_header_old;
1022 1 xdata struct sector_header xdata sector_header_new;
1023 1 xdata struct record_entry xdata buffer;
1024 1 BYTE *ptr;
1025 1 BYTE xdata id;
1026 1 BYTE *ptr_old;
1027 1 BYTE *ptr_new;
1028 1 WORD address;
1029 1 BYTE xdata status;
1030 1 BYTE i;
1031 1 BYTE xdata valid_sector;
1032 1 WORD xdata new_sector; // place holder for the sector we are moving to
1033 1 WORD xdata old_sector; // place holder for the sector we are moving from
1034 1
1035 1 // get active sector (This is the sector we are moving from)
1036 1 valid_sector = Find_Active_Sector(F_READ);
1037 1 if ( valid_sector == SECTOR_ID_ERROR ) return SECTOR_ID_ERROR;
1038 1
1039 1 if(valid_sector == SECTOR_1)
1040 1 {
1041 2 new_sector = SECTOR_0_BASE_ADDRESS; // move data to this sector
1042 2 old_sector = SECTOR_1_BASE_ADDRESS; // move data from this sector
1043 2 sector_header_new.sector = SECTOR_0;
1044 2 }
1045 1 else
1046 1 {
1047 2 new_sector = SECTOR_1_BASE_ADDRESS; // move data to this sector
C51 COMPILER V7.00 EEPROM 02/10/2003 10:48:05 PAGE 18
1048 2 old_sector = SECTOR_0_BASE_ADDRESS; // move data from this sector
1049 2 sector_header_new.sector = SECTOR_1;
1050 2 }
1051 1
1052 1 // Get old sector header
1053 1 ptr_old = (BYTE*) (§or_header_old);
1054 1 address = old_sector;
1055 1 for ( i=0; i < sizeof(sector_header_old); i++ )
1056 1 {
1057 2 ptr_old[i] = Boot_Flash_Read(address++);
1058 2 }
1059 1
1060 1 // Verify new sector is erased
1061 1 if ( Eeprom_Sector_Erase(sector_header_new.sector) ) return SECTOR_ERASE_ERROR;
1062 1
1063 1 sector_header_new.sector_checksum = ~(sector_header_new.sector);
1064 1 sector_header_new.max_records = sector_header_old.max_records;
1065 1 sector_header_new.rec_length = (WORD)EEPROM_RECORD_SIZE;
1066 1 sector_header_new.sector_status = RECEIVE_DATA;
1067 1
1068 1 // mark receiving sector (new sector)
1069 1 // mark new sector to receive
1070 1 address = new_sector;
1071 1 ptr_new = (BYTE*) (§or_header_new);
1072 1 for ( i=0; i < sizeof(sector_header_new); i++ )
1073 1 {
1074 2 if ( Boot_Flash_Write( address++, ptr_new[i] ) ) return FLASH_WRITE_ERROR;
1075 2 }
1076 1
1077 1 for (id=0; id < sector_header_old.max_records; id++)
1078 1 {
1079 2 if(id == inn)
1080 2 {
1081 3 ptr = buf; // add the new record as the data is swapped into the new sector
1082 3 status = 0;
1083 3 }
1084 2 else
1085 2 {
1086 3 ptr = (BYTE*) (&buffer);
1087 3 status = Read_Record(id, ptr);
1088 3 }
1089 2 if( status != UNINITIALIZED ) Write_Record( id, ptr );
1090 2 }
1091 1
1092 1 // mark good and bad sectors
1093 1
1094 1 // mark old sector TRANSFER_COMPLETE BEFORE marking new sector ACTIVE
1095 1 sector_header_old.sector_status = TRANSFER_COMPLETE;
1096 1 address = old_sector;
1097 1 for ( i=0; i < sizeof(sector_header_old); i++ )
1098 1 {
1099 2 if ( Boot_Flash_Write( address++, ptr_old[i] ) ) return FLASH_WRITE_ERROR;
1100 2 }
1101 1
1102 1 // mark new sector ACTIVE AFTER marking old TRANSFER_COMPLETE
1103 1 sector_header_new.sector_status =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -