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

📄 at45main.lst

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


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

line level    source

   1          
   2          //----------------------------------------------------------------
   3          // C8051F020实验核心模块测试程序
   4          // SPI总线和AT45DBXX实验
   5          // 
   6          // 实现功能:通过交叉开关,将SPI配置到P02,P03,P04引脚上,实现通过SPI总线访问AT45DB041B/081B/161D:
   7          // 1.通过计算机向模块发送命令对FLASH进行操作
   8          // 
   9          // 实验条件:
  10          // 1.底板上拨码开关JP1的1,2,4,6设置为ON状态
  11          // // 
  12          // 注意:本例程中包括了两个c文件,如果用户使用silab的集成开发环境,
  13          //       如果自己建立新的工程,一定注意要将两个C文件都加入到编译列表中
  14          // 
  15          // 说明:
  16          // 本模块中配套的测试程序都是以消息驱动的.
  17          // 
  18          // 实验程序中的命令都可以使用windows系统中自带的超级终端进行调试
  19          // 
  20          //---------------------------------------------------------------
  21          // 修改记录
  22          // 版本      时间         人员          内容
  23          // 1.0       2007/5/3    scj          建立文件,实现基本功能
  24          // 1.1       07/05/04    scj          增加了Flash操作命令
  25          // 1.2       07/06/04    scj          根据V122底板调整了具体的实验
  26          //----------------------------------------------------------------------------------------------------
  27          // 命令说明:
  28          // 字符通信协议,所有的命令以回车符结束
  29          // 命令字符不区分大小写
  30          // 键盘控制字符支持Backspace,其它控制键不支持
  31          // 
  32          // 应答:命令操作成功,最后都将返回\r\nOK\r\n
  33          //       命令错误,返回\r\nError\r\n
  34          // 具体命令:
  35          // 1.控制LED
  36          //   命令格式:setled=灯序号,开关状态 \r
  37          //   参数:    灯序号:   2,LED2
  38          //             开关状态:ON,打开灯;OFF,关闭灯
  39          //   应答:    \r\nOK\r\n
  40          // 2.擦除指定页面
  41          //   命令格式:erasepage=页面序号\r
  42          //   参数:    页面序号,要擦除的页面的序号,从0到器件的页面最大编号,由使用的器件决定
  43          //   应答:    \r\nOK\r\n
  44          // 3.擦除指定的块
  45          //   命令格式:eraseblock=块序号\r
  46          //   参数:    块序号,要擦除的块的序号,每个块包含8个PAGE
  47          //   应答:    \r\nOK\r\n;\r\nError\r\n
  48          // 4.向指定的页面写入字符串,该页面原有内容均被删除掉
  49          //   命令格式:writepage=页面序号,要写入的字符串
  50          //   参数:    页面序号:欲写入的页面;
  51          //             要写入的字符串:命令总长度不能超过RECVBUF_LEN;字符长度不超过页面大小
  52          //   应答:    \r\nOK\r\n
  53          // 5.读指定页面
  54          //   命令格式:readpage=页面序号
  55          //   参数:    页面序号:要读取的页面的序号
C51 COMPILER V8.02   AT45MAIN                                                              08/18/2007 20:06:55 PAGE 2   

  56          //   应答:    16进制的方式显示264个字节的内容;同时每个16字节后的括号内显示该字符;字节间用空格隔开
  57          // 
  58          //---------------------------------------------------------------------------------------------------
  59          
  60          #include <string.h>
  61          #include <ctype.h>
  62          #include <stdlib.h>
  63          
  64          #include "F020.h"
  65          #include "datatype.h"
  66          #include "at45.h"
  67          
  68          
  69          //--------------------------------------------
  70          // 数据类型定义
  71          //--------------------------------------------
  72          
  73          // 结构体
  74          typedef struct
  75          {
  76                  BYTE base;          // DIDA次数
  77                  BYTE second;        // 秒
  78                  BYTE minute;        // 分
  79                  
  80          }S_TIME;
  81          
  82          
  83          //--------------------------------------------
  84          // 引脚定义
  85          //--------------------------------------------
  86          #define P_LED2  P31
  87          
  88          
  89          //--------------------------------------------
  90          // 宏定义
  91          //--------------------------------------------
  92          
  93          // 系统消息定义
  94          #define SECD_SIGNAL      0x01
  95          #define MINU_SIGNAL      0x02
  96          #define UART0RECV_SIGNAL 0x04
  97          
  98          
  99          // 常量定义
 100          code BYTE ASCII_CODE[]={"0123456789ABCDEF"};
 101          
 102          
 103          //--------------------------------------------
 104          //定时器0定时,使用SYSCLK/12作为时钟源
 105          //定时计算方法,TH0:TL0= 65536-t*SYSCLK/12
 106          //定时25ms,TH0:TL0=0x4C 00
 107          //--------------------------------------------
 108          #define TMR0H 0x4C
 109          #define TMR0L 0x00
 110          
 111          #define TICKS_PER_SEC 40
 112          
 113          #define RECVBUF_LEN  300
 114          
 115          //--------------------------------------------
 116          // 函数声明
 117          //--------------------------------------------
C51 COMPILER V8.02   AT45MAIN                                                              08/18/2007 20:06:55 PAGE 3   

 118          void CommandProc(char *pRecvString);
 119          void SendString(char *pSendString);
 120          void SendHex(BYTE buf);
 121          void SendBuffer(BYTE *pSend,WORD len);
 122          
 123          char strncmps(char *pString1,char *pString2,int iLen);
 124          void Dlyms(WORD ms);
 125          
 126          //--------------------------------------------
 127          // 全局变量定义
 128          // 全局变量以g_开头
 129          // 位变量:              g_b
 130          // 无符号字节变量:      g_c
 131          // 无符号双字节变量:   g_w
 132          // 无符号4字节变量:    g_dw
 133          // 有符号数在类型前加s,比如char型位g_sc
 134          // 结构体为g_s后为大写
 135          //--------------------------------------------
 136          data BYTE   g_cMainSignal;              // 主消息变量
 137          
 138          data S_TIME g_sTime;                    // 主时钟
 139          
 140          data BYTE   g_cRecvPointer;             // 接收指针
 141          data BYTE   g_cRecvLength;              // 接收数据长度
 142          xdata BYTE  g_cRecvBuffer[RECVBUF_LEN]; // 接收缓冲区,字符均被转换为小写
 143          
 144          xdata BYTE  g_cFlashReadBuffer[520];    // 读取Flash缓冲区
 145          
 146          //-----------------------------------------------
 147          // 初始化函数
 148          //
 149          //-----------------------------------------------
 150          void Timer_Init()
 151          {
 152   1              
 153   1              PCON = 0;
 154   1              //.......................................
 155   1              // 设置定时器的时钟信号
 156   1              // - T4M T2M T1M T0M  -  -  -
 157   1          // 0  1   0   1   0   0  0  0
 158   1              // 1:使用SYSCLK;0:使用SYSCLK/12
 159   1              // 定时器0,1,2,4均使用SYSCLK
 160   1              //.......................................
 161   1              CKCON = 0x70;
 162   1              
 163   1              
 164   1              //......................................
 165   1              // 定时0工作在16位定时器模式
 166   1              // 定时器1工作在8位重载模式
 167   1              //......................................
 168   1      
 169   1              TMOD = 0x21;                                            
 170   1                                              
 171   1              //....................................
 172   1              // T0作为系统节拍时钟
 173   1              // 定时计算方法= 65536-t*SYSCLK
 174   1              //.....................................
 175   1              TH0 = TMR0H;            
 176   1              TL0 = TMR0L;            
 177   1              
 178   1              //.......................................
 179   1              // T1作为串口0时钟
C51 COMPILER V8.02   AT45MAIN                                                              08/18/2007 20:06:55 PAGE 4   

 180   1              // 串口0波特率=SYSCLK/16*(256-TMR1LOAD)
 181   1              // T1波特率=9600
 182   1              //.......................................
 183   1                      
 184   1              TH1  = 0xB8;    
 185   1              TL1  = 0xB8;    
 186   1              
 187   1              TCON = 0x00;    
 188   1                                              
 189   1              
 190   1              //..................................................
 191   1              // T2 and T3 not used
 192   1              //..................................................
 193   1              RCAP2H = 0x00;  // Timer 2 Capture Register High Byte
 194   1              RCAP2L = 0x00;  // Timer 2 Capture Register Low Byte    
 195   1              TH2    = 0x00;  // Timer 2 High Byte    
 196   1              TL2    = 0x00;  // Timer 2 Low Byte     
 197   1          T2CON  = 0x00;      // Timer 2 Control Register
 198   1                      
 199   1              TMR3RLL = 0x00; // Timer 3 Reload Register Low Byte
 200   1              TMR3RLH = 0x00; // Timer 3 Reload Register High Byte
 201   1              TMR3H   = 0x00; // Timer 3 High Byte
 202   1              TMR3L   = 0x00; // Timer 3 Low Byte
 203   1          TMR3CN  = 0x00;     // Timer 3 Control Register
 204   1      
 205   1          //.....................................................
 206   1              // T4 作为串口1波特率发生器
 207   1              // T4波特率=SYSCLK/32*(65536-RCAP4H:RCAP4L)
 208   1              // T4波特率=19200
 209   1              //.....................................................
 210   1          RCAP4H = 0xFF;  // Timer 4 Capture Register High Byte
 211   1          RCAP4L = 0xDC;  // Timer 4 Capture Register Low Byte
 212   1          TH4    = 0xFF;  // Timer 4 High Byte
 213   1          TL4    = 0xDC;  // Timer 4 Low Byte
 214   1          T4CON  = 0x30;  // Timer 4 Control Register
 215   1          
 216   1      
 217   1      }
 218          
 219          //...........................................................
 220          // 功能:UART0初始化
 221          // 输入参数:无
 222          // 输出参数:无
 223          // 注意:1.应该首先使用交叉开关为UART0分配相应的引脚
 224          //       2.初始化定时器1作为波特率发生器
 225          //..........................................................
 226          void UART0_Init()
 227          {
 228   1              
 229   1          SCON0 = 0x50;          // 8位波特率异步通信模式
 230   1      
 231   1          REN0  = 1;             // 使能UART0接收
 232   1          TR1   = 1;             // 启动定时器1
 233   1      }
 234          
 235          //---------------------------------------------------------------------
 236          // 功能:初始化SMBUS
 237          // 说明:1.必须在Port_I0_Init中设置交叉开关,并将SMBUS分配到P06,P07引脚上
 238          //       2.SMBUS的位速率必须小于400K(这是由PCF8563决定的)
 239          //---------------------------------------------------------------------
 240          void InitSMBus()
 241          {
C51 COMPILER V8.02   AT45MAIN                                                              08/18/2007 20:06:55 PAGE 5   

 242   1              SMB0CR=0xE4;        // SMBUS速率:307K<400K
 243   1              SMB0CN=0x40;        // 使能SMBUS
 244   1      }       
 245          //.....................................................
 246          // 功能:配置XRAM的扩展方式
 247          // 输入参数:无
 248          // 输出参数:无
 249          // 说明:仅仅使用内部XRAM
 250          // 由于本实验中使用的RAM较少,所以只使用C8051F020的内部RAM
 251          //.....................................................
 252          void EMI_Init()
 253          {
 254   1          EMI0CF    = 0x23;
 255   1      }
 256          
 257          // Peripheral specific initialization functions,
 258          // Called from the Init_Device() function
 259          void SPI_Init()
 260          {
 261   1          SPI0CFG   = 0xC7;             // SCK空闲为高电平,第二个边沿开始采样,8位数据
 262   1          SPI0CN    = 0x03;             // SPI0操作在MASTER模式
 263   1          SPI0CKR   = 0x01;             // SPI波特率应小于8MHZ,fclk=SYSCLK/2*(SPI0CKR+1)
 264   1      }
 265          
 266          void Port_IO_Init()
 267          {
 268   1          // P0.0  -  TX0 (UART0), Open-Drain, Digital
 269   1          // P0.1  -  RX0 (UART0), Open-Drain, Digital
 270   1          // P0.2  -  SCK  (SPI0), Open-Drain, Digital
 271   1          // P0.3  -  MISO (SPI0), Open-Drain, Digital
 272   1          // P0.4  -  MOSI (SPI0), Open-Drain, Digital
 273   1          // P0.5  -  NSS  (SPI0), Open-Drain, Digital
 274   1          // P0.6  -  SDA (SMBus), Open-Drain, Digital
 275   1          // P0.7  -  SCL (SMBus), Open-Drain, Digital
 276   1      

⌨️ 快捷键说明

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