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

📄 eeprom.lst

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