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

📄 at45db081.lst

📁 单片机对at45db021flash芯片的驱动源代码
💻 LST
字号:
C51 COMPILER V7.06   AT45DB081                                                             07/17/2007 18:22:24 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE AT45DB081
OBJECT MODULE PLACED IN .\output\at45db081.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE at45db081.C BROWSE DEBUG OBJECTEXTEND OBJECT(.\output\at45db081.obj)

stmt level    source

   1          
   2          #include <STC89C51RC_RD_PLUS.H>
   3          #include <intrins.h>
   4          #include <absacc.h>
   5          
   6          #define uint  unsigned int
   7          #define uchar unsigned char
   8          #define ulong unsigned long
   9          
  10          
  11          #define PAGE_ERASE 0x81
  12          #define BLOCK_RERASE 0x50
  13          #define STATUS_REGISTER_READ 0xD7
  14          #define MAIN_MEMORY_PAGE_READ 0xd2
  15          #define MAIN_MEMORY_PAGE_WRITE_THROUGH_BUFFER1 0x82
  16          
  17          
  18          #define READY 1
  19          #define BUSY  0
  20          
  21          sbit SCK = P1^4;
  22          sbit SI  = P1^5;
  23          sbit SO  = P1^6;
  24          sbit CS  = P1^3;
  25          
  26          sbit LED = P1^0;
  27          //#define P40  LED
  28          /* 
  29          一片45DB081包括4096页,每页264字节
  30          页擦除时间:最多8毫秒
  31          页编程时间:最多14毫秒
  32          芯片使用spi模式0
  33          
  34          commond:0x84 -->write buffer1
  35          commond:0x87 -->write buffer2
  36          
  37          commond:0x82 -->Main Memory Page Program Through Buffer 1
  38          commond:0x85 -->Main Memory Page Program Through Buffer 2
  39          
  40          commond:0x81 -->Page Erase
  41          
  42          commond:0xd2 -->Main Memory Page Read
  43          commond:0x54 -->Buffer 1 Read
  44          commond:0x56 -->Buffer 2 Read
  45           */
  46          
  47          /*延时1ms-11.0592MHz
  48          void Delay(uint number)
  49          {
  50                  uint j;
  51                  uint i;
  52                  for(j=0;j<number;j++)
  53                  {
  54                          for(i=0;i<110;i++);
  55                  }
C51 COMPILER V7.06   AT45DB081                                                             07/17/2007 18:22:24 PAGE 2   

  56          }*/
  57          /*延时1ms-22.1184MHz*/
  58          void Delay(uint number)
  59          {
  60   1              uint j;
  61   1              uint i;
  62   1              for(j=0;j<number;j++)
  63   1              {
  64   2                      for(i=0;i<220;i++);
  65   2              }
  66   1      }
  67          /*************************************************/
  68          /*函数原型:
  69          /*输入参数:无
  70          /*返回参数:无
  71          /*************************************************/
  72          void SPI_Init(void)
  73          {
  74   1              CS  = 1;
  75   1              SCK = 0;
  76   1              SI  = 1;
  77   1              SO  = 1;
  78   1              Delay(20);//20ms
  79   1      }
  80          /*************************************************/
  81          /*函数原型:
  82          /*输入参数:要发送的命令或数据
  83          /*返回参数:无
  84          /*************************************************/
  85          void SPI_SendByte(uchar SendData)
  86          {
  87   1              uchar i;
  88   1              for(i=0;i<8;i++)
  89   1              {
  90   2                      SI = (bit)(SendData&0x80);
  91   2                      SendData <<= 1;
  92   2                      SCK = 1;
  93   2                      SCK = 0;
  94   2              }
  95   1      }
  96          /*************************************************/
  97          /*函数原型:
  98          /*输入参数:无
  99          /*返回参数:读得的一字节数据
 100          /*************************************************/
 101          uchar SPI_ReadByte(void)
 102          {
 103   1              uchar i,RecData = 0;
 104   1              for(i=0;i<8;i++)
 105   1              {
 106   2                      SCK = 1;
 107   2                      RecData <<= 1;
 108   2                      if(SO)RecData += 1;
 109   2                      SCK = 0;
 110   2                      _nop_();
 111   2              }
 112   1              return (RecData);
 113   1      }
 114          
 115          
 116          //指定页擦除
 117          void PageErase(uint Page)
C51 COMPILER V7.06   AT45DB081                                                             07/17/2007 18:22:24 PAGE 3   

 118          {
 119   1              uchar i;
 120   1              CS = 0;
 121   1              SPI_SendByte(PAGE_ERASE);
 122   1              i = Page>>7;
 123   1              SPI_SendByte(i);
 124   1              i = Page&0xff;
 125   1              i = i<<1;
 126   1              SPI_SendByte(i);
 127   1              i=0;
 128   1              SPI_SendByte(i);
 129   1              CS = 1;
 130   1              Delay(8);
 131   1      }
 132          //块擦除
 133          void BlockErase(uint Block)
 134          {
 135   1              uchar i;
 136   1              CS = 0;
 137   1              SPI_SendByte(BLOCK_RERASE);
 138   1              i = Block>>4;
 139   1              SPI_SendByte(i);
 140   1              i = Block & 0x000f;
 141   1              i<<=4;
 142   1              SPI_SendByte(i);
 143   1              i=0;
 144   1              SPI_SendByte(i);
 145   1              CS = 1;
 146   1              Delay(12);
 147   1      }
 148          //芯片擦除
 149          void ChipErase(void)
 150          {
 151   1              uint i;
 152   1              for(i=0;i<512;i++)BlockErase(i);
 153   1      }
 154          //读芯片状态寄存器
 155          bit ReadStatus(void)//status register read
 156          {
 157   1              uchar i;
 158   1              CS = 0;
 159   1              SPI_SendByte(STATUS_REGISTER_READ);
 160   1              i = SPI_ReadByte();
 161   1              CS = 1;
 162   1              return((bit)(i&0x80));
 163   1      }
 164          //直接从存储空间读到缓冲区
 165          void MainMemPageRead(uint Page,uint InPageAdd,uchar *Buffer,uint Num)
 166          {
 167   1              uchar i = 0;
 168   1              CS = 0;
 169   1              SPI_SendByte(MAIN_MEMORY_PAGE_READ);
 170   1              i = Page>>7;
 171   1              SPI_SendByte(i);
 172   1              i = Page&0xff;
 173   1              i = i<<1;
 174   1              Page = InPageAdd>>8;
 175   1              Page += i;
 176   1              SPI_SendByte(i);
 177   1              SPI_SendByte(InPageAdd&0xff);
 178   1              for(i=0;i<32;i++){SCK = 1;SCK = 0;}//dummy
 179   1              for(i=0;i<Num;i++)Buffer[i] = SPI_ReadByte();
C51 COMPILER V7.06   AT45DB081                                                             07/17/2007 18:22:24 PAGE 4   

 180   1              CS = 1;
 181   1      }
 182          //通过buffer1编程flash
 183          void MainMemoryPageProgramThroughBuffer(uint Page,uint InPageAdd,uchar *Buffer,uint Num)
 184          {
 185   1              uchar i = 0;
 186   1              CS = 0;
 187   1              SPI_SendByte(MAIN_MEMORY_PAGE_WRITE_THROUGH_BUFFER1);
 188   1              i = Page>>7;
 189   1              SPI_SendByte(i);
 190   1              i = Page&0xff;
 191   1              i = i<<1;
 192   1              Page = InPageAdd>>8;
 193   1              Page += i;
 194   1              SPI_SendByte(i);
 195   1              SPI_SendByte(InPageAdd&0xff);
 196   1              for(i=0;i<Num;i++) SPI_SendByte(Buffer[i]);
 197   1              CS = 1;
 198   1      }
 199          
 200          #define XIO XBYTE[0x8000]
 201          
 202          void main(void)
 203          {
 204   1              bit flag=0;
 205   1              uchar i ;
 206   1              uchar code buffer[30]="012345678901234567890123456789";
 207   1              uchar buf[30];
 208   1              SPI_Init();
 209   1              /*
 210   1              uint i;
 211   1              uchar c,a;
 212   1              
 213   1              while(1)
 214   1              {
 215   1                      for(i=0;i<32768;i++)
 216   1                      {
 217   1                              c=i%256;
 218   1                              XBYTE[i]=c;
 219   1                              a = XBYTE[i];
 220   1                              if(a!=c){flag = 1;break;}
 221   1                      }
 222   1                      if(flag)LED = 0;
 223   1                      else 
 224   1                      {
 225   1                              for(i=0;i<5;i++)
 226   1                              {
 227   1                                      LED = 0;
 228   1                                      Delay(10);
 229   1                                      LED = 1;
 230   1                                      Delay(10);
 231   1                              }
 232   1                      }
 233   1                      while(1);
 234   1              }*/
 235   1              /*LED = ReadStatus();
 236   1              while(1);
 237   1              */
 238   1              
 239   1              ChipErase();
 240   1              
 241   1              LED = 0;
C51 COMPILER V7.06   AT45DB081                                                             07/17/2007 18:22:24 PAGE 5   

 242   1              MainMemoryPageProgramThroughBuffer(110,0,buffer,255);//需要45ms@11.0592   20ms@22.1184
 243   1              LED = 1;
 244   1              Delay(15);
 245   1              LED = 0;
 246   1              MainMemPageRead(110,0,buf,255);//需要37ms@11.0592   18ms@22.1184
 247   1              LED = 1;
 248   1              
 249   1              
 250   1              for(i=0;i<30;i++)
 251   1              {
 252   2                      SPI_SendByte(buf[i]);
 253   2                      Delay(1000);
 254   2              }
 255   1              
 256   1              for(i=0;i<30;i++)
 257   1              {
 258   2                      if(buf[i]!=buffer[i])flag=1;
 259   2              }
 260   1              if(flag==0)
 261   1              {
 262   2                      for(i=0;i<5;i++)
 263   2                      {
 264   3                              LED = 0;
 265   3                              Delay(300);
 266   3                              LED = 1;
 267   3                              Delay(300);
 268   3                      }
 269   2              }
 270   1              else LED = 0;
 271   1              
 272   1              while(1);
 273   1      }
 274          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    578    ----
   CONSTANT SIZE    =     30    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      48
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -