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

📄 at45.lst

📁 F020集成以太网接口核心模块DataFlash例程源代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V8.02   AT45                                                                  08/18/2007 20:06:55 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE AT45
OBJECT MODULE PLACED IN at45.OBJ
COMPILER INVOKED BY: C:\Keil\UV3\C51\BIN\c51.exe at45.c DB OE

line level    source

   1          //--------------------------------------------
   2          // 文件名:AT45DB.C
   3          // 操作:基于SPI硬件总线的AT45DB操作文件
   4          // 注意:本文件中定义的操作是针对161D处于DataFlash格式的操作,即每个PAGE的页面大小为528B
   5          //       如果用户使用的PAGE为512B,则要进行相应的修改
   6          // scj
   7          // 07/05/04
   8          //-----------------------------------------------------------------------
   9          // 修改记录
  10          // 版本     时间        人员                内容
  11          // 1.0      07/05/03    scj            041B操作基本函数
  12          // 1.1      07/05/05    scj            增加了041B,081B,161B函数操作
  13          //                                     根据g_cFlashType来标识Flash类型
  14          //----------------------------------------------------------------------
  15          #include "f020.h"
  16          #include "datatype.h"
  17          #include "at45.h"
  18          #include <intrins.h>
  19          
  20          //--------------------------------------------
  21          // 宏定义
  22          //--------------------------------------------
  23          
  24          #define DF_RESET                 {P5 &=~(0x1);_nop_();P5 |= 0x1;_nop_();}    // P50,AT45DB复位控制引脚
  25          #define DF_PROTECT       {P5 &=~(0x02);_nop_();}             // P51,AT45DB保护控制
  26          #define DF_NONPROTECT    {P5 |=0x02;_nop_();}                // P51,取消AT45DB保护
  27          #define DF_CHIP_SELECT   {P5 &= ~(0x04);_nop_();}                    // P52,AT45DB片选信号
  28          #define DF_CHIP_NOSELECT {P5 |= 0x04;_nop_();}                           // P52,取消AT45DB片选信号
  29          
  30          
  31          
  32          // 器件类型
  33          code char FLASH_STRING[][20]={"Unknown","AT45DB041","AT45DB081","AT45DB161"};
  34          // 器件页面个数
  35          code WORD FLASH_PAGE[]={0,2048,4096,4096};
  36          // 器件页面字节数
  37          code WORD FLASH_PAGE_BYTE[]={0,264,264,528};
  38          // 器件BLOCK数
  39          code WORD FLASH_BLOCK[]={0,256,512,512};
  40          // 页面地址
  41          code BYTE PAGE_SHIFT[]={0,1,1,2};
  42          // 字节地址
  43          code BYTE BYTE_SHIFT[]={0,8,8,8};
  44          // 块移位地址
  45          code BYTE BLOCK_SHIFT[]={0,4,4,5};
  46          //---------------------------------------------
  47          // 变量定义
  48          //---------------------------------------------
  49          char g_cFlashType=0;              // Flash类型,目前支持AT45DB041,AT45DB081,AT45DB161
  50          
  51          //---------------------------------------------
  52          // 函数声明
  53          //---------------------------------------------
  54          
  55          //---------------------------------------------
C51 COMPILER V8.02   AT45                                                                  08/18/2007 20:06:55 PAGE 2   

  56          // 函数实现
  57          //---------------------------------------------
  58          
  59          //---------------------------------------------
  60          // SPI操作函数
  61          //---------------------------------------------
  62          void SendSPIByte(BYTE ch)
  63          {
  64   1              SPIF = 0;
  65   1              SPI0DAT = ch;
  66   1              while (SPIF == 0);        // wait for data transfer to be completed                                     
  67   1      } 
  68          
  69          BYTE GetSPIByte(void)
  70          {
  71   1          SPIF = 0;
  72   1              SPI0DAT = 0;
  73   1              while (SPIF == 0);
  74   1              return  SPI0DAT;      // read data from SPI
  75   1      }
  76          
  77          //-----------------------------------------------------------------
  78          // Flash操作
  79          //-----------------------------------------------------------------
  80          
  81          //-----------------------------------------------------------------
  82          // 功能:获取Flash类型,注意,在使用本文件中定义的函数时必须首先调用该函数
  83          //       否则,其它函数无法正确判断Flash类型可能导致操作错误
  84          // 参数:无
  85          // 返回值:Flash类型的描述字符串,该缓冲区是只读的,内容不允许修改
  86          //------------------------------------------------------------------
  87          const char *GetFlashType()
  88          {
  89   1              BYTE nDeviceID;
  90   1      
  91   1              nDeviceID =GetFlashInfo();
  92   1      
  93   1              if((nDeviceID&0x20)==0x20)
  94   1              {
  95   2                      nDeviceID&=0x1F;
  96   2      
  97   2                      if((nDeviceID>=4)&&(nDeviceID<=6))
  98   2                      {
  99   3                              g_cFlashType = nDeviceID-3;
 100   3      
 101   3                      }
 102   2                      else
 103   2                      {
 104   3                              g_cFlashType = 0;
 105   3                      }
 106   2              }
 107   1              else
 108   1              {
 109   2                      g_cFlashType = 0;
 110   2              }
 111   1      
 112   1      
 113   1              return FLASH_STRING[g_cFlashType];
 114   1      }
 115          
 116          //--------------------------------------------------------------------------------
 117          // 功能:  读Flash当前状态 
C51 COMPILER V8.02   AT45                                                                  08/18/2007 20:06:55 PAGE 3   

 118          // 参数:  无
 119          // 返回值:BYTE,Flash当前状态
 120          //         Bit7=1:空闲 0:忙 
 121          //         Bit6=1:比较结果不匹配 0:匹配
 122          //         Bit5Bit4Bit3:芯片标志(101:AT45DB161D;100:AT45DB081;011:AT45DB041B)
 123          //         Bit2=1
 124          //         Bit1: 扇区保护位,1:保护;0:未保护
 125          //         Bit0: page大小,1:2^n;0:2^n+8/16 B
 126          //--------------------------------------------------------------------------------
 127          BYTE GetFlashStatus() 
 128          {
 129   1              BYTE ret;
 130   1      
 131   1              DF_CHIP_SELECT;
 132   1      
 133   1              SendSPIByte(STATUS_REGISTER);
 134   1              ret=GetSPIByte();
 135   1              
 136   1              DF_CHIP_NOSELECT;
 137   1      
 138   1              return ret;
 139   1      }
 140          
 141          //-------------------------------------------------------------------------------
 142          // 功能:读取FLASH芯片的生产设备信息
 143          // 参数:无
 144          // 返回值:器件容量,高三位为器件系列;后5位为器件容量
 145          //         001 00100       ;AT45DB041
 146          //         001 00101       ;AT45DB081
 147          //         001 00110       ;AT45DB161
 148          //-------------------------------------------------------------------------------
 149          BYTE GetFlashInfo()
 150          {
 151   1              BYTE manufacturers;   // 生产商
 152   1              BYTE density;         // 器件容量
 153   1              BYTE ret;
 154   1      
 155   1              DF_CHIP_SELECT;
 156   1      
 157   1              SendSPIByte(FLASH_DEVICEID); // 读取设备信息
 158   1      
 159   1              manufacturers=GetSPIByte();  // 生产商
 160   1              density=GetSPIByte();        // 器件容量
 161   1              ret=GetSPIByte();            // Device Version
 162   1              ret=GetSPIByte();
 163   1      
 164   1              DF_CHIP_NOSELECT;
 165   1      
 166   1              return density;              // 返回器件容量
 167   1      }
 168          
 169          
 170          //---------------------------------------------------------------------------
 171          // 功能:从缓冲区1的指定位置star_addr中读入len长度的数据到pBuffer
 172          // 参数:
 173          //       str_addr,WORD:缓冲区起始位置
 174          //       len:     WORD:数据长度
 175          //       pBuffer,  BYTE *:数据缓存指针
 176          // 返回值:BYTE,1:读取成功;0:读取失败
 177          //---------------------------------------------------------------------------
 178          BYTE FlashBuffer1Read(WORD start_addr,WORD len, BYTE *pBuffer) 
 179          {                                       
C51 COMPILER V8.02   AT45                                                                  08/18/2007 20:06:55 PAGE 4   

 180   1              WORD i;
 181   1      
 182   1              if((start_addr+len)>FLASH_PAGE_BYTE[g_cFlashType])
 183   1              {// 地址长度错误
 184   2                      return 0;
 185   2              }
 186   1      
 187   1              while((GetFlashStatus()&0x80)==0);  // 检查器件是否准备就绪
 188   1              
 189   1              DF_CHIP_SELECT;                                 // enable DataFlash
 190   1      
 191   1              SendSPIByte(BUFFER_1_READ);                 
 192   1              SendSPIByte(0);
 193   1              SendSPIByte((BYTE)(start_addr>8));
 194   1              SendSPIByte((BYTE)start_addr);
 195   1              SendSPIByte(0);
 196   1              for (i=0;i<len;i++)
 197   1              {
 198   2                      *pBuffer++ = GetSPIByte();       // read data from SPI
 199   2              }
 200   1      
 201   1              DF_CHIP_NOSELECT;
 202   1      
 203   1              return 1;

⌨️ 快捷键说明

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