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

📄 mss_spi.lst

📁 KEIL C上的门禁控制器源代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
 227   1              SPItrans(SOH);
 228   1              SPItrans('0');
 229   1              SPItrans('1');
 230   1              SPItrans('0');
 231   1              SPItrans('2');
 232   1              SPItrans(MSG);
 233   1              checksum=MSG;
 234   1              SPItrans(STX);
 235   1              checksum+=0xc6;                 // 校验和
 236   1              Rstwdt();                               // 喂狗
 237   1      }
 238          
 239          ///////////////////////////////////////////////////////////////////////////////
 240          // 组织发送命令体,命令不同,对应的命令体内容和长度也不相同
 241          ///////////////////////////////////////////////////////////////////////////////
C51 COMPILER V7.07   MSS_SPI                                                               09/14/2005 15:20:47 PAGE 5   

 242          void Command()
 243          {
 244   1              idata uchar i;
 245   1      
 246   1              for(i=0;i<CommandLen;i++)
 247   1              {
 248   2                      Rstwdt();                                       // 喂狗
 249   2                      SPItrans(SPIbuf[i]);            // 发送命令体
 250   2                      checksum+=SPIbuf[i];    // 校验和
 251   2              }
 252   1      }
 253          
 254          ///////////////////////////////////////////////////////////////////////////////
 255          // 组织发送命令尾
 256          ///////////////////////////////////////////////////////////////////////////////
 257          void Postamble()
 258          {
 259   1              Rstwdt();                       // 喂狗
 260   1              SPItrans(ETX);
 261   1              checksum+=ETX;          // 校验和
 262   1              CS_ASCII();
 263   1              SPItrans(CSH);  
 264   1              SPItrans(CSL);
 265   1              SPItrans(EOT);
 266   1              Rstwdt();                       // 喂狗
 267   1      }
 268          
 269          ///////////////////////////////////////////////////////////////////////////////
 270          // 组织发送整个命令包
 271          ///////////////////////////////////////////////////////////////////////////////
 272          void SendMsg()
 273          {
 274   1              Preamble();                     // SPI前导数据结构
 275   1              Command();                      // 命令体
 276   1              Postamble();            // SPI校验和结束符
 277   1      }
 278          
 279          ///////////////////////////////////////////////////////////////////////////////
 280          // 向MSS发送"ACK"或"NAK"
 281          ///////////////////////////////////////////////////////////////////////////////
 282          void SendNACK(uchar NACK)
 283          {
 284   1              Rstwdt();                       // 喂狗
 285   1              SPItrans(SOH);
 286   1              SPItrans('0');
 287   1              SPItrans('1');
 288   1              SPItrans('0');
 289   1              SPItrans('2');
 290   1              SPItrans(MSG);
 291   1              SPItrans(NACK);
 292   1              SPItrans(EOT);
 293   1              Rstwdt();                       // 喂狗
 294   1      }
 295          
 296          ///////////////////////////////////////////////////////////////////////////////
 297          // HOST接收MSS数据,按照标准信息包进行检查
 298          // 如果接收错误向MSS发送NAK,如果3次发送错误返回失败
 299          // 如果接收成功向MSS发送ACK
 300          // 如果15秒内不能检测到MSS的数据发送中断,那么MSS可能故障
 301          ///////////////////////////////////////////////////////////////////////////////
 302          bit SPIReceive()
 303          {
C51 COMPILER V7.07   MSS_SPI                                                               09/14/2005 15:20:47 PAGE 6   

 304   1              idata uchar temp;               // 临时变量
 305   1              idata uchar NAKcounter; // NAK计数器
 306   1              idata uint  R_BUF;              // 接收缓冲区指针
 307   1              idata uint  i;                  // 计数器
 308   1      
 309   1              for(R_BUF=0; R_BUF<BUFSIZE; R_BUF++)
 310   1                      SPIbuf[R_BUF]=0;        // 接收缓冲区清零
 311   1      
 312   1              time_out=1500;                  // 如果15秒内MSS无数据返回退出错误
 313   1              do
 314   1              {
 315   2                      Rstwdt();                       // 喂狗
 316   2                      if(time_out==0)
 317   2                      {
 318   3                              HandwareErr=ERROR;              // MSS可能故障
 319   3                              time_out=0;
 320   3                              return ERROR;   // 返回
 321   3                      }
 322   2              }while(MSS_INT);                // 检测MSS通信中断
 323   1      
 324   1      
 325   1              NAKcounter=3;           // NAK计数器
 326   1              do
 327   1              {       
 328   2                      R_BUF=0;                // 接收缓冲区计数
 329   2                      SOHptr=0;
 330   2                      ETXptr=0;
 331   2                      MSS=1;
 332   2      
 333   2                      time_out=1200;                          // 12000msSPI数据传输一个包时间
 334   2                      do
 335   2                      {
 336   3                              do
 337   3                              {       
 338   4                                      Rstwdt();                       // 喂狗
 339   4                                      if(time_out==0)
 340   4                                      {
 341   5                                              HandwareErr=ERROR;              // MSS可能故障
 342   5                                              return ERROR;   // 返回
 343   5                                      }
 344   4                                      temp=SPItrans(0);       // 接收数据
 345   4                              }while(temp==0);
 346   3      
 347   3                              SPIbuf[R_BUF++]=temp;   // 非零数据存入缓冲区
 348   3      
 349   3                              if(R_BUF>BUFSIZE)break; // 缓冲区满
 350   3      
 351   3                              if(time_out==0)
 352   3                              {
 353   4                                      HandwareErr=ERROR;              // MSS可能故障
 354   4                                      return ERROR;   // 返回
 355   4                              }
 356   3                      }while(temp!=EOT);                      // 通信结束
 357   2      
 358   2                      i=0;
 359   2                      do
 360   2                      {
 361   3                              if(SPIbuf[i]==SOH)              // 定位数据头
 362   3                              {
 363   4                                      SOHptr=i;
 364   4                                      break;                  
 365   4                              }
C51 COMPILER V7.07   MSS_SPI                                                               09/14/2005 15:20:47 PAGE 7   

 366   3                              i++;
 367   3                              Rstwdt();                               // 喂狗
 368   3                      }while(i<R_BUF);
 369   2      
 370   2                      if(SOHptr==R_BUF)
 371   2                      {
 372   3                              goto SPIerr;                    // 缓冲区满,数据错误
 373   3                      }
 374   2                      else if(SPIbuf[SOHptr+6]!=STX)
 375   2                      {
 376   3                              goto SPIerr;                    // STX错误
 377   3                      }
 378   2                      else if(SPIbuf[R_BUF-4]!=ETX)
 379   2                      {
 380   3                              goto SPIerr;                    // ETX错误
 381   3                      }
 382   2                      else
 383   2                      {
 384   3                              MSG=SPIbuf[SOHptr+5];   // 保存信息号
 385   3                              ETXptr=R_BUF-4;
 386   3                              Rstwdt();                               // 喂狗
 387   3                              CSH=SPIbuf[ETXptr+1];
 388   3                              CSL=SPIbuf[ETXptr+2];
 389   3                              HEX_CS();                                                               
 390   3                              testchecksum=0;
 391   3      
 392   3                              for(i=0;i<ETXptr-SOHptr+1;i++)  // 计算校验和
 393   3                              {
 394   4                                      Rstwdt();                               // 喂狗
 395   4                                      testchecksum+=SPIbuf[SOHptr+i]; 
 396   4                              }
 397   3      
 398   3                              temp=testchecksum+checksum;
 399   3                              temp=temp&0xff;
 400   3                              if(temp!=0)
 401   3                                      goto SPIerr;                    // 校验
 402   3      
 403   3                              SendNACK(ACK);                          // 发送 ACK
 404   3      
 405   3                              return OK;
 406   3                      }
 407   2      SPIerr:
 408   2                      Rstwdt();
 409   2                      SendNACK(NAK);                                  // 发送 NAK 重新接收DSP数据                                                                                                             
 410   2                      NAKcounter--;
 411   2              }while(NAKcounter>0);
 412   1      
 413   1              HandwareErr=ERROR;              // MSS可能故障
 414   1              return ERROR;
 415   1      }
 416          
 417          ///////////////////////////////////////////////////////////////////////////////
 418          // HOST接收MSS发送的NAK或ACK数据,按照标准信息包进行检查
 419          // 如果2秒内不能检测到MSS的数据发送中断,那么MSS可能故障
 420          ///////////////////////////////////////////////////////////////////////////////
 421          uchar ACKReceive()
 422          {
 423   1              idata uchar temp;               // 临时变量
 424   1              idata uchar R_BUF;              // 接收缓冲区计数
 425   1      
 426   1              for(R_BUF=0; R_BUF<255; R_BUF++)
 427   1                      SPIbuf[R_BUF]=0;        // 接收缓冲区清零
C51 COMPILER V7.07   MSS_SPI                                                               09/14/2005 15:20:47 PAGE 8   

 428   1      
 429   1              time_out=200;                   // 如果2秒内MSS无数据返回退出错误
 430   1              do
 431   1              {
 432   2                      Rstwdt();                       // 喂狗
 433   2                      if(time_out==0)
 434   2                      {
 435   3                              HandwareErr=ERROR;              // MSS可能故障
 436   3                              time_out=0;
 437   3                              return ERROR;   // 返回
 438   3                      }
 439   2              }while(MSS_INT);                // 检测MSS通信中断
 440   1      
 441   1      
 442   1              R_BUF=0;
 443   1              time_out=50;                            // 500ms接收SPI数据包
 444   1              do
 445   1              {
 446   2                      do
 447   2                      {
 448   3                              temp=SPItrans(0);       // 接收SPI字节
 449   3      
 450   3                              if(time_out==0)
 451   3                              {
 452   4                                      HandwareErr=ERROR;              // MSS可能故障
 453   4                                      return ERROR;   // 返回
 454   4                              }
 455   3                      }while(temp==0);                // 空字符不接收
 456   2      
 457   2                      SPIbuf[R_BUF++]=temp;
 458   2                      if(R_BUF>20)
 459   2                      {

⌨️ 快捷键说明

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