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

📄 download.lst

📁 对W29c040读写程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 182   1              //初始化串口接收结构体
 183   1              InitRec();
 184   1      
 185   1              //通讯状态
 186   1              CommOk=FALSE;
 187   1      
 188   1              while(1)
 189   1              {
 190   2                      //命令接收完毕
 191   2                      if(Rec.Finish)
 192   2                      {
 193   3                              //验证命令合法性
 194   3                              if(!VerifyCmdStr(&Cmd,&DataLen))
 195   3                              {
 196   4                                      Cmd=0x0f;
 197   4                                      SendCmdStr(&Cmd,1);
 198   4                                      goto restart;
 199   4                              }
 200   3      
 201   3                              //通讯状态
 202   3                              CommOk=FALSE;
 203   3      
 204   3                              //解析命令
 205   3                              switch(Cmd)
 206   3                              {
 207   4                                      case 0x5a:      //握手通讯
 208   4              
 209   4                                              //返回握手成功的命令
 210   4                                              SendCmdStr(&Cmd,1);
 211   4                                              CommOk=TRUE;
 212   4                                              break;
 213   4              
 214   4                                      case 0x04:      //发送文件页数
 215   4      
 216   4                                              //文件页数
 217   4                                              File.Pages=Rec.Buffer[7]*256+Rec.Buffer[8];
 218   4      
 219   4                                              SendCmdStr(&Cmd,1);
 220   4                                              CommOk=TRUE;
 221   4                                              break;
 222   4      
 223   4                                      case 0x05:      //发送起始地址
 224   4      
 225   4                                              //写入的起始地址
 226   4                                              File.Addr=Rec.Buffer[7]*256+Rec.Buffer[8];
 227   4      
 228   4                                              //返回OK
 229   4                                              SendCmdStr(&Cmd,1);
 230   4      
 231   4                                              CommOk=TRUE;
 232   4      
 233   4                                              break;
 234   4      
 235   4                                      case 0x06:      //下载文件数据
 236   4      
 237   4                                              //本次接收的数据长度, 6是 LH,LL,/LH,/LL,CMD,CS的长度
 238   4                                              TempLen = Rec.Buffer[2]*256+Rec.Buffer[3]-6;
 239   4      
 240   4                                              //暂存数据
 241   4                                              memcpy(Rec.Data+Rec.DataLen,Rec.Buffer+7,TempLen);
C51 COMPILER V7.10   DOWNLOAD                                                              03/30/2007 17:02:48 PAGE 5   

 242   4      
 243   4                                              //长度增加
 244   4                                              Rec.DataLen+=TempLen;
 245   4      
 246   4                                              //达到256字节
 247   4                                              if(Rec.DataLen>=PAGE_SIZE)
 248   4                                              {
 249   5                                              /* //测试文件接收256字节后自动向PC发送256字节
 250   5                                                      SerialPort_send(0xdd);
 251   5                                                      SerialPort_send(0xdd);
 252   5                                                      SerialPort_send(0xdd);
 253   5                                                      SerialPort_send(0xdd);
 254   5                                                      for(i=0;i<Rec.DataLen;i++)
 255   5                                                      {
 256   5                                                              SerialPort_send(Rec.Data[i]);
 257   5                                                      }
 258   5      
 259   5                                                      i=0;
 260   5      
 261   5                                                      if(i==0) while(1);
 262   5                                              */
 263   5      
 264   5                                                      //写到W29C040存储器
 265   5                                                      if(!WritePage(0,0,0,Rec.Data))
 266   5                                                      {
 267   6                                                              //发送出错命令
 268   6                                                              Cmd=0x0f;
 269   6                                                              SendCmdStr(&Cmd,1);
 270   6      
 271   6                                                              //重新开始接收
 272   6                                                              goto restart;
 273   6                                                      }
 274   5                                                      else //页写flash成功
 275   5                                                      {
 276   6                                                              Rec.DataLen=0; //数据长度清0
 277   6                                                      }
 278   5                                              }
 279   4      
 280   4                                              //发送下载成功命令
 281   4                                              SendCmdStr(&Cmd,1);
 282   4      
 283   4                                              CommOk=TRUE;
 284   4      
 285   4                                              break;
 286   4      
 287   4                                      case 0x07:      //下载完成
 288   4      
 289   4                                              SendCmdStr(&Cmd,1);
 290   4      
 291   4                                              CommOk=TRUE;
 292   4      
 293   4                                              break;
 294   4      
 295   4                                      default:  //错误
 296   4      
 297   4                                              //发送出错命令
 298   4                                              Cmd=0x0f;
 299   4                                              SendCmdStr(&Cmd,1);
 300   4      
 301   4                                              //重新开始接收
 302   4                                              goto restart;
 303   4      
C51 COMPILER V7.10   DOWNLOAD                                                              03/30/2007 17:02:48 PAGE 6   

 304   4                                              break;
 305   4                              }
 306   3                      
 307   3                              //命令接收正常
 308   3                              if(CommOk)
 309   3                              {
 310   4                                      Rec.Finish=FALSE;       //设定未接收完毕
 311   4                                      Rec.Len=0;                      //已接收长度
 312   4                                      Rec.CmdLen=0;           //PC发给下位机的命令的总长度
 313   4                              }
 314   3                      }
 315   2              }
 316   1      }
 317          
 318          /**********************************************************************
 319          * 函 数 名: serial1
 320          * 功能描述: 串口1中断处理
 321          * 函数说明: 
 322          * 调用函数: 无
 323          * 全局变量:
 324          * 输    入: 无
 325          * 返    回: 无
 326          * 设 计 者: wangyong                         日期:2007-03-24
 327          * 修 改 者: wangyong                         日期:2007-03-24
 328          * 版    本: 
 329          **********************************************************************/
 330          void serial1() interrupt 4
 331          {
 332   1              //接收
 333   1              if(RI)
 334   1              {
 335   2                      RI=0;
 336   2      
 337   2                      //还没接完
 338   2                      if(!Rec.Finish)
 339   2                      {
 340   3                              //放入数据
 341   3                              Rec.Buffer[Rec.Len++]=SBUF;
 342   3      
 343   3                              //若已接收了4个字节,则可以算出
 344   3                              //整个命令串的总长度
 345   3                              if(Rec.Len==4)
 346   3                              {
 347   4                                      Rec.CmdLen=(uint)(Rec.Buffer[2]*16+Rec.Buffer[3])+2; //命令总长度
 348   4                              }
 349   3                              else if(Rec.Len>4) //判断是否全部接收完命令
 350   3                              {
 351   4                                      //已接收完,做标志
 352   4                                      if(Rec.Len==Rec.CmdLen) Rec.Finish=TRUE;
 353   4                              }
 354   3                      }
 355   2              }
 356   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    884    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =    397      37
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
C51 COMPILER V7.10   DOWNLOAD                                                              03/30/2007 17:02:48 PAGE 7   

   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 + -