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

📄 main.lst

📁 25aa320 SPI串行eeprom的烧写程序
💻 LST
字号:
C51 COMPILER V7.50   MAIN                                                                  10/21/2008 14:46:08 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <atmel\REG2051.H>
   2          #include <INTRINS.H>
   3          
   4          //引脚定义,可以自行定义使用
   5          #define IC_P1           P1_1  //cs
   6          #define IC_P2           P1_2  //sk
   7          #define IC_P3           P1_3  //DI
   8          #define IC_P4           P1_4  //DO
   9          #define IC_P5           P1_5  //GND
  10          #define IC_P6           P1_6  //nc
  11          #define IC_P7           P1_7  //nc
  12          #define LED                     P3_7  //VCC
  13          
  14          /*这个需要改,因为25xx320指令不一样
  15          #define EWEN    0x98
  16          #define ERAL    0x90
  17          #define EWDS    0x80 //93CXX用 0x98 EWEN写允许 0x80EWDS写禁止 0x90擦除
  18          */
  19          #define EWEN    0x06  //0x06  WREN写允许  25XX用
  20          //#define ERAL  0x90  //0x90擦除,25XX没有这个
  21          #define EWDS    0x04  //0x04  WRDI写禁止 
  22          
  23          
  24          static unsigned char Pack[4]; //数据包数组
  25          static unsigned char PN = 0; //接收指针
  26          
  27          
  28          void InitCom(void);                         //串口初始化 晶振为11.0592M 方式1 波特率57600
  29          //void InitIC(void);                          
  30          void ComOutChar(unsigned char OutData);     //向串口输出一个字符(非中断方式)
  31          void Init_93C(void);                        //引脚初始化
  32          void Read_93C(unsigned char AH,AL);         //读
  33          void Write_93C(unsigned char AH,AL,Data);   //写
  34          void COM_93C(unsigned char Data);           //93C命令函数
  35          void Erasure_93C(void);                     //擦除
  36          
  37          void main(void)
  38          {
  39   1              unsigned int TempCyc;
  40   1      
  41   1              InitCom();
  42   1      
  43   1              while(1)
  44   1              {                                               
  45   2                      for (TempCyc=0; TempCyc<30000; TempCyc++) //状态灯闪
  46   2                              LED = 1;
  47   2                      for (TempCyc=0; TempCyc<20000; TempCyc++)
  48   2                              LED = 0;
  49   2              }
  50   1      }
  51          
  52          //串口初始化 晶振为11.0592M 方式1 波特率57600
  53          void InitCom(void)
  54          {
  55   1              SCON = 0x50; //串口方式1,允许接收
C51 COMPILER V7.50   MAIN                                                                  10/21/2008 14:46:08 PAGE 2   

  56   1              TMOD = 0x21; //定时器1定时方式2,定时0为模式1,16位模式
  57   1              TCON = 0x40; //设定时器1开始计数
  58   1              TH1 = 255;      //设波特率为57600
  59   1              TL1 = 255;
  60   1              PCON = 0x80; //波特率加倍控制,SMOD位
  61   1              RI = 0; //清收发标志
  62   1              TI = 0;
  63   1              TR1 = 1; //启动定时器
  64   1              EA = 1; //开总中断
  65   1              ES = 1; //开串口中断
  66   1      }
  67          
  68          //向串口输出一个字符(非中断方式)
  69          void ComOutChar(unsigned char OutData)
  70          {
  71   1              SBUF = OutData; //输出字符
  72   1              while(!TI); //空语句判断字符是否发完
  73   1              TI = 0; //清TI
  74   1      }
  75          
  76          //串口接收中断
  77          void ComInINT(void) interrupt 4
  78          {
  79   1              if (RI) //判断是不是收完字符
  80   1                      {
  81   2                              RI = 0; //RI清零
  82   2                              Pack[PN] = SBUF; //存数据
  83   2                              PN++;  //指针加1
  84   2                              if (PN == 4)
  85   2                                      {
  86   3                                              PN = 0; //指针清零 一帧数据收完后
  87   3                                              switch (Pack[0])
  88   3                                                      {
  89   4                                                              case 0: Read_93C(Pack[1],Pack[2]); break;
  90   4                                                              case 1: Write_93C(Pack[1],Pack[2],Pack[3]); break;
  91   4                                                              case 2: Erasure_93C(); break; 
  92   4                                                      }               
  93   3                                      }
  94   2                      }
  95   1      
  96   1      }
  97          
  98          ////////MicroWire 93CXX芯片函数////////////////
  99          ////////SPI 25XX320芯片函数////////////////
 100          //引脚初始化
 101          void Init_93C(void)
 102          {
 103   1              IC_P5 = 0; //GND
 104   1              IC_P1 = 0; //CS
 105   1              IC_P2 = 0; //SK
 106   1              IC_P3 = 0; //DI
 107   1              IC_P4 = 1; //DO 置1让MCU为可读
 108   1              IC_P6 = 0; //选择为8位数据模式
 109   1              IC_P7 = 0; //
 110   1      }
 111          
 112          //93C命令函数
 113          void COM_93C(unsigned char Data)
 114          {
 115   1              unsigned char TempCyc;
 116   1              unsigned int  TempCycB;
 117   1      
C51 COMPILER V7.50   MAIN                                                                  10/21/2008 14:46:08 PAGE 3   

 118   1              TempCycB = Data;   //Data: 0x98 EWEN写允许 0x80EWDS写禁止 0x90擦除
 119   1      
 120   1              Init_93C();        //初始化引脚 
 121   1      
 122   1              IC_P1 = 1;         //CS
 123   1      //      for(TempCyc=10; TempCyc!=0; TempCyc--)  //94C64的8位模式起始位+命令代码+地址位是共10位
 124   1          for(TempCyc=8; TempCyc!=0; TempCyc--)       //25XX320 SI 数据
 125   1              {
 126   2                      IC_P3 = Data & 0x80; //数据 DI
 127   2                      IC_P2 = 1; //SK
 128   2                      _nop_();
 129   2                      IC_P2 = 0; //时钟 /SK
 130   2                      Data <<= 1; //左移
 131   2              }
 132   1      
 133   1              IC_P1 = 0;      //CS
 134   1      
 135   1              if (TempCycB==ERAL) //擦除命令
*** ERROR C202 IN LINE 135 OF MAIN.C: 'ERAL': undefined identifier
 136   1                      {
 137   2                              IC_P2 = 1; //SK 
 138   2                              _nop_();
 139   2                              IC_P2 = 0; //SK
 140   2                              IC_P1 = 1; //CS
 141   2                              _nop_();
 142   2                              for (TempCycB=0; TempCycB<0xFFFF; TempCycB++)
 143   2                                      {
 144   3                                              IC_P2 = 1;
 145   3                                              _nop_();
 146   3                                              _nop_();
 147   3                                              IC_P2 = 0;
 148   3                                              if (IC_P4) 
 149   3                                                      {
 150   4                                                              break; //检测就绪信号
 151   4                                                      }
 152   3                                      }
 153   2                              IC_P1 = 0;
 154   2                              if (TempCycB!=0)
 155   2                                      ComOutChar(0); //成功返回0
 156   2                              else
 157   2                                      ComOutChar(1); //失败返回1
 158   2                      }
 159   1      }
 160          
 161          //擦除
 162          void Erasure_93C(void)
 163          {
 164   1              COM_93C(EWEN);
 165   1      //      COM_93C(ERAL);
 166   1      Write_93C(0x00,0x00,0xFF);
 167   1      
 168   1              COM_93C(EWDS);
 169   1      }
 170          
 171          //写
 172          void Write_93C(unsigned char AH,AL,SData)
 173          {
 174   1              unsigned int Data=0, TempCycB;
 175   1      
 176   1              COM_93C(EWEN); //写允许
 177   1              
 178   1              Init_93C();
C51 COMPILER V7.50   MAIN                                                                  10/21/2008 14:46:08 PAGE 4   

 179   1              
 180   1              IC_P1 = 1; //CS                 
 181   1                              
 182   1              Data = AH*0x100+AL;
 183   1      //      Data = Data<<6; //地址组合、移动
 184   1      //      Data |= 0xA000; //加上起始位和操作码
 185   1              for(TempCycB=16; TempCycB!=0; TempCycB--) //发送地址码
 186   1                      {
 187   2                              IC_P3 = Data & 0x8000; //数据 DI
 188   2                              IC_P2 = 1; //SK
 189   2                              _nop_();
 190   2                              IC_P2 = 0; //时钟 /SK
 191   2                              Data <<= 1; //左移
 192   2                      }
 193   1                              
 194   1              Data = SData*0x100; //数据
 195   1      
 196   1              for(TempCycB=8; TempCycB!=0; TempCycB--) //发送8位数据
 197   1                      {
 198   2                              IC_P3 = Data & 0x8000; //数据 DI
 199   2                              IC_P2 = 1; //SK
 200   2                              _nop_();
 201   2                              IC_P2 = 0; //时钟 /SK
 202   2                              Data <<= 1; //左移
 203   2                      }
 204   1                      
 205   1              IC_P1   =       0;      //CS
 206   1                              
 207   1              IC_P2 = 1; //SK 
 208   1              _nop_();
 209   1              IC_P2 = 0; //SK
 210   1              IC_P1 = 1; //CS
 211   1              _nop_();
 212   1              for (TempCycB=0; TempCycB<0xFFFF; TempCycB++)
 213   1                      {
 214   2                              IC_P2 = 1;
 215   2                              _nop_();
 216   2                              _nop_();
 217   2                              IC_P2 = 0;
 218   2                              if (IC_P4) 
 219   2                                      {
 220   3                                              break; //检测就绪信号
 221   3                                      }
 222   2                      }
 223   1              if (TempCycB!=0)  //当TempCycB=0说明没有出现过BUY
 224   1                      ComOutChar(0); //成功返回
 225   1              else
 226   1                      ComOutChar(1); //失败返回1
 227   1      
 228   1              COM_93C(EWDS); //写禁止
 229   1      }
 230          
 231          //读
 232          void Read_93C(unsigned char AH,AL)
 233          {
 234   1              unsigned char TempCycB;
 235   1              unsigned int Data=0;
 236   1      
 237   1              Init_93C();
 238   1      
 239   1              IC_P1 = 1; //CS                 
 240   1                              
C51 COMPILER V7.50   MAIN                                                                  10/21/2008 14:46:08 PAGE 5   

 241   1              Data = AH*0x100+AL;
 242   1      //      Data = Data<<6; //地址组合、移动
 243   1      //      Data |= 0xC000; //加上起始位和操作码
 244   1              for(TempCycB=8; TempCycB!=0; TempCycB--) //地址码
 245   1                      {
 246   2                              IC_P3 = Data & 0x8000; //数据 DI
 247   2                              IC_P2 = 1; //SK
 248   2                              _nop_();
 249   2                              IC_P2 = 0; //时钟 /SK
 250   2                              Data <<= 1; //左移
 251   2                      }
 252   1                      
 253   1              for(TempCycB=0; TempCycB<8; TempCycB++) //读数据
 254   1                      {
 255   2                              IC_P2 = 1; //SK
 256   2                              _nop_();
 257   2                              _nop_();
 258   2                              Pack[3] = Pack[3] << 1;
 259   2                              if (IC_P4)
 260   2                                      Pack[3]++;
*** ERROR C187 IN LINE 260 OF MAIN.C: not an lvalue
 261   2                              IC_P2 = 0; //时钟 /SK1
 262   2                      }
 263   1              IC_P1   =       0;      //CS
 264   1      
 265   1              ComOutChar(Pack[3]); //返回
 266   1      }
 267          
 268          
 269          void WIPCHK(void) //reentrant //检查WIP位,判断是否写入完成
 270          {
 271   1      unsigned char Temp,TempCyc;
 272   1      
 273   1      for(TempCyc=0;TempCyc<50;TempCyc++)
 274   1      {
 275   2      Temp = RSDR(); //读状态寄存器
 276   2      if (Temp&0x01==0)
 277   2      TempCyc = 50; 
 278   2      }
 279   1      }

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

⌨️ 快捷键说明

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