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

📄 eeprom.lst

📁 这是我在单片机c8051f020下写的SST 29LE020这款flash的驱动程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
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 + -