⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eeprom.lst

📁 ST公司的upsd dk2000评估板仿真eeprom的源程序。
💻 LST
📖 第 1 页 / 共 5 页
字号:
 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*) (&sector_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*) (&sector_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 + -