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

📄 flash.lst

📁 本程序是并口FLASH 39sf040读写程序,并给出调用函数.
💻 LST
字号:
C51 COMPILER V7.20   FLASH                                                                 07/26/2008 22:22:01 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE FLASH
OBJECT MODULE PLACED IN .\Flash.obj
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE ..\src\Flash.C BROWSE DEFINE(DEVICE_TYPE_ICIDRECORD) DEBUG OBJECTEXTEND PRI
                    -NT(.\Flash.lst) OBJECT(.\Flash.obj)

line level    source

   1          #include        <reg51.h>
   2          #include        <intrins.h>
   3          #include        <absacc.h>
   4          #include        "..\Include\FLASHDEF.h"
   5          
   6          #ifndef FLASH_ONLY_READ
   7          //us 延时函数
   8          void Delayus(unsigned char time)
   9          {
  10   1       unsigned char idata  i;
  11   1              for(i=0;i<time;i++);
  12   1      }
  13          //查询是否已经完成写操作
  14          //byteaddr:查询的地址
  15          void CheckToggleReady(unsigned int byteaddr)
  16          {
  17   1              unsigned long xdata timeout = 0x07FFFFFF;
  18   1              unsigned char PreData, CurData;
  19   1              PreData = ReadIO(byteaddr) & 0x40;
  20   1              while ( timeout-- )
  21   1              {
  22   2                      CurData = ReadIO(byteaddr) & 0x40;
  23   2                      if (CurData == PreData)   
  24   2                              break;
  25   2                      PreData = CurData;
  26   2              }
  27   1      }
  28          
  29          void Flash_wb(unsigned int ChipAddr, unsigned char byte)
  30          {
  31   1              WriteFlashIO(ChipAddr, 0x5555, 0xaa);
  32   1              WriteFlashIO(ChipAddr, 0x2aaa, 0x55);
  33   1              WriteFlashIO(ChipAddr, 0x5555, byte);
  34   1      }
  35          
  36          /*************************************************************************************/
  37          //检查ID函数
  38          // Flash_chipseletaddr:片选地址(0x0000,0x1000,0x2000,0x3000,0x4000.....)
  39          unsigned char Flash_check(unsigned int ChipAddr)
  40          { 
  41   1          unsigned char Flash_ID;
  42   1              Flash_wb(ChipAddr, 0x90);                               //ID ENTRY
  43   1              _nop_();
  44   1              *(&Flash_ID)=ReadFlashIO(ChipAddr, 0);
  45   1              if(Flash_ID != SSTID) 
  46   1                      return 0;
  47   1              *(&Flash_ID)=ReadFlashIO(ChipAddr, 1);
  48   1              Flash_wb(ChipAddr, 0xf0);                               //ID EXIT
  49   1              _nop_(); 
  50   1              return  Flash_ID;                 //返回ID号
  51   1      }
  52          /****************************************************************************/
  53          //初始化函数
  54          //输入参数num:FLASH的片数
C51 COMPILER V7.20   FLASH                                                                 07/26/2008 22:22:01 PAGE 2   

  55          //输出参数Flash_page:输出页地址大小
  56          unsigned char Flash_Init(unsigned int ChipAddr, unsigned char *PageCount, unsigned char *ChipCount)
  57          {  
  58   1              unsigned char Flash_page=0;
  59   1      #if FlashChipCount > 1
  60   1              unsigned char i, ChipType, FlashSta=0;
  61   1              FlashALE = 0;
  62   1              *ChipCount = 0;
  63   1              for(i=0;i<FlashChipCount;i++)
  64   1              {
  65   2                      ChipType = Flash_check(ChipAddr);       //取FLASH ID号
  66   2                      FlashSta >>= 1;
  67   2                      if(ChipType == 0)     //为0时标识错误状态位
  68   2                              FlashSta |= 0x80; 
  69   2                      else                 //正常时执行
  70   2                      {
  71   3                              (*ChipCount)++;
  72   3                              if(Flash_page == 0)//第一片赋芯片ID
  73   3                                      Flash_page = ChipType;
  74   3                              else if (Flash_page != ChipType)//不是第一片且芯片ID不一致
  75   3                                      return DifferFlashERR;                          //存在不同型号芯片
  76   3                          if(FlashSta != 0)
  77   3                                      return JumpFlashERR;                            //存在跳空芯片
  78   3                      }
  79   2                      ChipAddr += 1<<12;    //A12——A14为片选地址位 片选位加1
  80   2              }
  81   1      #else
                      FlashALE = 0;
                      Flash_page = Flash_check(ChipAddr);     //取FLASH ID号
                      if(Flash_page == 0)
                              return NoFlashERR;      //第1片Flash缺或故障
                      *ChipCount = 1;
              #endif
  88   1              switch (Flash_page)
  89   1              {
  90   2                      case SST39SF040ID:
  91   2                              Flash_page = 0x80;    //返回128页
  92   2                              break;
  93   2                      case SST39SF020ID:
  94   2                              Flash_page = 0x40;    //返回64页
  95   2                              break;
  96   2                      case SST39SF010ID:
  97   2                              Flash_page = 0x20;    //返回32页
  98   2                              break;
  99   2                      default:
 100   2                              Flash_page = 0;
 101   2              }
 102   1              *PageCount = Flash_page;
 103   1      #if FlashChipCount > 1
 104   1              if(FlashSta & (1>>(FlashChipCount-1)))
 105   1                      return NoFlashERR;              //第1片Flash缺或故障
 106   1              else
 107   1      #endif
 108   1                      return FlashOK;                 //初始化成功返回0
 109   1      }
 110                 
 111          /*************************************************************************************/
 112          //片擦除程序
 113          // Flash_chipseletaddr:片选地址(0x0000,0x1000,0x2000,0x3000,0x4000.....)
 114          #ifdef FLASH_EN_ALLEraseChip
              void Flash_EraseEntirChip(unsigned int ChipAddr)
              {       
C51 COMPILER V7.20   FLASH                                                                 07/26/2008 22:22:01 PAGE 3   

                      Flash_wb(ChipAddr, 0x80);       //ERASE
                      Flash_wb(ChipAddr, 0x10);       //CHIPERASE
              }
              #endif
 121          /*************************************************************************************/
 122          //扇区擦除程序
 123          //page:要擦除的页地址
 124          // Flash_chipseletaddr:片选地址(0x0000,0x1000,0x2000,0x3000,0x4000.....)
 125          
 126          void Flash_EraseOneSector(unsigned char page,unsigned int ChipAddr)                             //ok
 127          {
 128   1              
 129   1              Flash_wb(ChipAddr, 0x80);       //ERASE
 130   1              WriteFlashIO(ChipAddr, 0x5555, 0xaa);
 131   1              WriteFlashIO(ChipAddr, 0x2aaa, 0x55);
 132   1      //      WriteFlashIO(ChipAddr, page, 0x30);//SECTORERASE
 133   1              Flash_WAddrH(page);
 134   1              XBYTE[(page & 0x0fff) | ChipAddr] = 0x30;
 135   1      }
 136          
 137          /************************************************************************/
 138          //写函数
 139          //*bytedata:写缓冲  page:页地址   addr:便移地址   len:写字节长度
 140          // Flash_chipseletaddr:片选地址(0x0000,0x1000,0x2000,0x3000,0x4000....
 141          void Flash_ProgramData (unsigned char *bytedata, unsigned char page,unsigned  int addr, unsigned int len,u
             -nsigned int ChipAddr)
 142          {   
 143   1              unsigned int tempaddr;
 144   1          while(len--)
 145   1              {
 146   2                      Flash_wb(ChipAddr, 0xA0);       //PROGRAM
 147   2      #ifdef FlashChipAtP2Port
 148   2                      Flash_WAddrH(page);
 149   2                      tempaddr = (addr & 0x0fff) | ChipAddr;
 150   2      #else
                              Flash_WAddrH(addr>>12);
                              tempaddr = addr | ChipAddr;
              #endif
 154   2                      WriteIO(tempaddr, *bytedata);
 155   2      
 156   2                      Delayus(6);
 157   2                      CheckToggleReady(tempaddr); //查询是否完成写操作
 158   2                      if(addr == 0x0FFF)  //偏移地址大于4095页地址加1
 159   2                      {
 160   3                              addr = 0;
 161   3                      page++;
 162   3                      }
 163   2                      else
 164   2                              addr++;
 165   2              bytedata++;
 166   2              }       
 167   1      }
 168          #endif
 169          
 170          /**********************************************************************************/
 171          //指定页地址和便移地址读函数
 172          //*bytedata:读缓冲  page:页地址  addr:便移地址   len:数据字节长度
 173          // Flash_chipseletaddr:片选地址(0x0000,0x1000,0x2000,0x3000,0x4000.....) 
 174          void Flash_ReadData (unsigned char *bytedata, unsigned char page,unsigned  int addr, unsigned int len,unsi
             -gned int ChipAddr)
 175          {
 176   1              Flash_WAddrH(page);
C51 COMPILER V7.20   FLASH                                                                 07/26/2008 22:22:01 PAGE 4   

 177   1              while(len--)
 178   1              {
 179   2                      *bytedata=ReadFlashIO(ChipAddr,addr);
 180   2              bytedata++;
 181   2                      if(addr == 0x0FFF)  //偏移地址大于4095页地址加1
 182   2                      {
 183   3                              addr = 0;
 184   3                              Flash_WAddrH(++page);
 185   3                      }
 186   2                      else
 187   2                              addr++;
 188   2              }
 189   1      }       


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    599    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----       4
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      36
   IDATA SIZE       =   ----       1
   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 + -