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

📄 at45db321.lst

📁 单片机对at45db021flash芯片的驱动源代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.08   AT45DB321                                                             12/28/2007 17:00:32 PAGE 1   


C51 COMPILER V7.08, COMPILATION OF MODULE AT45DB321
OBJECT MODULE PLACED IN .\output\at45db321.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE at45db321.C LARGE BROWSE DEBUG OBJECTEXTEND OBJECT(.\output\at45db321.obj)

line 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_ERASE 0x50
  13          #define STATUS_REGISTER_READ 0xD7
  14          #define MAIN_MEMORY_PAGE_READ 0xD2
  15          #define MAIN_MEMORY_PAGE_WRITE_THROUGH_BUFFER1 0x82
  16          #define MAIN_MEMORY_PAGE_WRITE_THROUGH_BUFFER1_ERASE 0x83
  17          #define DEVICE_ID_INFO 0x9F
  18          
  19          
  20          #define READY 1
  21          #define BUSY  0
  22          
  23          sbit SCK = P1^3;
  24          sbit SI  = P1^4;
  25          sbit SO  = P1^0;
  26          sbit CS  = P1^2;
  27          
  28          sbit LED = P1^0;
  29          //#define P40  LED
  30          /* 
  31          一片45DB321包括8192页,每页512字节
  32          页擦除时间:最多35毫秒
  33          页编程时间:最多15毫秒
  34          芯片使用spi模式0
  35          
  36          commond:0x84 -->write buffer1
  37          commond:0x87 -->write buffer2
  38          
  39          commond:0x82 -->Main Memory Page Program Through Buffer 1
  40          commond:0x85 -->Main Memory Page Program Through Buffer 2
  41          
  42          commond:0x81 -->Page Erase
  43          
  44          commond:0xd2 -->Main Memory Page Read
  45          commond:0x54 -->Buffer 1 Read
  46          commond:0x56 -->Buffer 2 Read
  47           */
  48          
  49          /*延时1ms-11.0592MHz
  50          void Delay(uint number)
  51          {
  52                  uint j;
  53                  uint i;
  54                  for(j=0;j<number;j++)
  55                  {
C51 COMPILER V7.08   AT45DB321                                                             12/28/2007 17:00:32 PAGE 2   

  56                          for(i=0;i<110;i++);
  57                  }
  58          }*/
  59          /*延时1ms-22.1184MHz*/
  60          void Delay(uint number)
  61          {
  62   1              uint j;
  63   1              uint i;
  64   1              for(j=0;j<number;j++)
  65   1              {
  66   2                      for(i=0;i<220;i++);
  67   2              }
  68   1      }
  69          void InitSys(void)
  70          {
  71   1              TH1  = 0xfd;            //9600bps   11.0592MHz
  72   1              TL1  = 0xfd;
  73   1              TMOD = 0x21;            //定时器1方式2,定时器0方式1
  74   1              TR1  = 1;               //启动定时器1
  75   1              SCON = 0x50;            //串口方式1,允许接受
  76   1              
  77   1              ES  = 1;                //允许串口中断
  78   1              ET0 = 1;                //允许定时器0中断
  79   1              TR1 = 1;                //启动定时器1
  80   1              IT1 = 1;                //外部中断边沿方式
  81   1              IT0 = 1;                //外部中断边沿方式
  82   1              EA  = 1;
  83   1      }
  84          /*******************************************************************
  85          发送字符串
  86          *******************************************************************/
  87          void PutStr(uchar *p,uint num)
  88          {
  89   1              uint i;
  90   1              if(num != 0)
  91   1              {
  92   2                      for(i = 0;i < num;i ++)
  93   2                      {
  94   3                              SBUF =p[i] ;
  95   3                              while(!TI);
  96   3                              //Delay(10);
  97   3                              TI = 0;
  98   3                      }
  99   2              }
 100   1              else 
 101   1              {
 102   2                      for(i=0;i<30;i++)
 103   2                      {
 104   3                              if(p[i] != 0)
 105   3                              {
 106   4                                      SBUF = p[i];
 107   4                                      while(!TI);
 108   4                                      TI = 0;
 109   4                              }
 110   3                      }
 111   2              }
 112   1      }
 113          /*************************************************/
 114          /*函数原型:
 115          /*输入参数:无
 116          /*返回参数:无
 117          /*************************************************/
C51 COMPILER V7.08   AT45DB321                                                             12/28/2007 17:00:32 PAGE 3   

 118          void SPI_Init(void)
 119          {
 120   1              CS  = 1;
 121   1              SCK = 0;
 122   1              SI  = 1;
 123   1              SO  = 1;
 124   1              Delay(20);//20ms
 125   1      }
 126          /*************************************************/
 127          /*函数原型:
 128          /*输入参数:要发送的命令或数据
 129          /*返回参数:无
 130          /*************************************************/
 131          void SPI_SendByte(uchar SendData)
 132          {
 133   1              uchar i;
 134   1              for(i=0;i<8;i++)
 135   1              {
 136   2                      SI = (bit)(SendData&0x80);
 137   2                      SendData <<= 1;
 138   2                      SCK = 1;
 139   2                      SCK = 0;
 140   2              }
 141   1      }
 142          /*************************************************/
 143          /*函数原型:
 144          /*输入参数:无
 145          /*返回参数:读得的一字节数据
 146          /*************************************************/
 147          uchar SPI_ReadByte(void)
 148          {
 149   1              uchar i,RecData = 0;
 150   1              for(i=0;i<8;i++)
 151   1              {
 152   2                      SCK = 1;
 153   2                      RecData <<= 1;
 154   2                      if(SO)RecData += 1;
 155   2                      SCK = 0;
 156   2                      
 157   2              }
 158   1              return (RecData);
 159   1      }
 160          
 161          
 162          //指定页擦除
 163          void PageErase(uint Page)
 164          {
 165   1              uchar i;
 166   1              
 167   1              if(Page>8191)return;
 168   1              
 169   1              CS = 0;
 170   1              SPI_SendByte(PAGE_ERASE);
 171   1              i = Page>>6;
 172   1              SPI_SendByte(i);
 173   1              i = Page&0x3f;
 174   1              i = i<<2;
 175   1              SPI_SendByte(i);
 176   1              i=0;
 177   1              SPI_SendByte(i);
 178   1              CS = 1;
 179   1              Delay(70);
C51 COMPILER V7.08   AT45DB321                                                             12/28/2007 17:00:32 PAGE 4   

 180   1      }
 181          //读芯片状态寄存器,返回0表示busy,返回1表示ready
 182          bit ReadStatus(void)//status register read
 183          {
 184   1              uchar i;
 185   1              CS = 0;
 186   1              SPI_SendByte(STATUS_REGISTER_READ);
 187   1              i = SPI_ReadByte();
 188   1              CS = 1;
 189   1              return((bit)(i&0x80));
 190   1      }
 191          //得到器件的信息共4个字节
 192          void ReadDeviceId(uchar *p)
 193          {
 194   1              uchar i;
 195   1              CS = 0;
 196   1              SPI_SendByte(DEVICE_ID_INFO);
 197   1              for(i=0;i<4;i++)p[i] = SPI_ReadByte();
 198   1              CS = 1;
 199   1      }
 200          //块擦除
 201          void BlockErase(uint Block)
 202          {
 203   1              uchar i;
 204   1              CS = 0;
 205   1              SPI_SendByte(BLOCK_ERASE);
 206   1              i = (uchar)(Block>>3);
 207   1              SPI_SendByte(i); 
 208   1              i = (uchar)(Block<<5);
 209   1              SPI_SendByte(i);
 210   1              i=0;
 211   1              SPI_SendByte(i);
 212   1              CS = 1;
 213   1              Delay(100);
 214   1      }
 215          //芯片擦除
 216          void ChipErase(void)
 217          {
 218   1              uint i;
 219   1              for(i=0;i<1024;i++)BlockErase(i);

⌨️ 快捷键说明

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