📄 mss_spi.lst
字号:
460 3 break; // ACK或NAK命令长度不超过20
461 3 }
462 2
463 2 if(time_out==0)
464 2 {
465 3 HandwareErr=ERROR; // MSS可能故障
466 3 return ERROR; // 返回
467 3 }
468 2 }while(temp!=EOT); // 接收到EOT结束符
469 1
470 1 if(SPIbuf[R_BUF-2]==ACK)
471 1 {
472 2 return ACK; // 返回ACK
473 2 }
474 1 else if(SPIbuf[R_BUF-2]==NAK)
475 1 {
476 2 return NAK; // 返回NAK
477 2 }
478 1
479 1 HandwareErr=ERROR; // MSS可能故障
480 1 return ERROR;
481 1 }
482
483 ///////////////////////////////////////////////////////////////////////////////
484 // 显示公共错误信息
485 ///////////////////////////////////////////////////////////////////////////////
486 void disperr(uchar id)
487 {
488 1 Rstwdt(); // 喂狗
489 1
C51 COMPILER V7.07 MSS_SPI 09/14/2005 15:20:47 PAGE 9
490 1 GLCD_Locate(16,32);
491 1 reverse=1;
492 1 dprintf(failure,12); // 失败
493 1 reverse=0;
494 1
495 1 GLCD_Locate(0,48);
496 1 dprintf(" ",15); // 清行
497 1 GLCD_Locate(16,48);
498 1
499 1 if(id<'A')
500 1 {
501 2 dprintf(disp_err[id-0x30],12); // 显示正常错误信息
502 2 }
503 1 else
504 1 {
505 2 if(id<='F')
506 2 {
507 3 HandwareErr=ERROR; // MSS不能正常工作
508 3 dprintf(disp_err[10],12); // 显示模块复位
509 3 TURN_ON();
510 3 }
511 2 else
512 2 {
513 3 dprintf(disp_err[11],12); // 显示ACK错误
514 3 }
515 2 }
516 1 }
517
518 ///////////////////////////////////////////////////////////////////////////////
519 // MSS上电复位函数
520 // MSS电源芯片采用TPS70145,该芯片具备可编程供电能力,当使能端为低电平时,MSS
521 // 上电,MSS上电后进入自检状态,当自检完成后向HOST申请中断,发送自检结果信息。
522 // MSS自检成功发送'HHHF0'信息,否则发送'HHHFX',X表示MSS模块硬件故障代码。
523 // MSS自检成功后,HOST设置MSS系统安全等级。
524 // 当MSS在10秒内不能完成自检,置MSS故障标志。
525 ///////////////////////////////////////////////////////////////////////////////
526 void TURN_ON()
527 {
528 1 idata uint i;
529 1 idata uchar count=3;
530 1
531 1 MSS_INT=1; // 清MSS中断位
532 1 MSS_PWR_ON=1; // 清MSS电源使能位
533 1
534 1 Rstwdt(); // 喂狗
535 1
536 1 init_again:
537 1 MSS_PWR_ON=0; // 打开MSS电源
538 1
539 1 for(i=0;i<50;i++)
540 1 {
541 2 Wait10ms(); // 等待500ms
542 2 Rstwdt(); // 喂狗
543 2 }
544 1
545 1 for(i=0;i<3;i++) // 检测3次低电平中断,目的是防止MSS上电时误发送低电平
546 1 {
547 2 do
548 2 {
549 3 Rstwdt(); // 喂狗
550 3 if(count==0)
551 3 {
C51 COMPILER V7.07 MSS_SPI 09/14/2005 15:20:47 PAGE 10
552 4 HandwareErr=ERROR; // MSS不能正常工作
553 4 return;
554 4 }
555 3 }while(MSS_INT); // 检测MSS中断
556 2 Rstwdt(); // 喂狗
557 2 Wait10ms(); // 等待10毫秒
558 2 }
559 1
560 1 if(!SPIReceive())
561 1 {
562 2 goto power_off; // 重新对MSS上电
563 2 }
564 1
565 1 if(SPIbuf[SOHptr+7]=='H'&&SPIbuf[SOHptr+8]=='H'&&SPIbuf[SOHptr+9]=='H'
566 1 &&SPIbuf[SOHptr+10]=='F'&&SPIbuf[SOHptr+11]=='0')
567 1 {
568 2 for(i=0; i<BUFSIZE; i++)
569 2 SPIbuf[i]=0;
570 2
571 2 HandwareErr=OK; // MSS工作正常
572 2 return;
573 2 }
574 1
575 1 if(count==0)
576 1 {
577 2 HandwareErr=ERROR; // MSS不能正常工作
578 2 return;
579 2 }
580 1
581 1 power_off:
582 1 MSS_PWR_ON=1; // 清MSS电源使能
583 1 OneSecond();
584 1 count--;
585 1 goto init_again;
586 1 }
587
588 ///////////////////////////////////////////////////////////////////////////////
589 // HOST向MSS发送不同的命令,发送完成后HOST等待接收MSS的ACK或NAK数据,如果HOST
590 // 接收到ACK,表示MSS正确接收可识别的命令包;如果HOST接收到NAK,表示MSS没有
591 // 正确接收到可识别的命令包。
592 // HOST接收到MSS的ACK后,HOST继续等待MSS的数据
593 ///////////////////////////////////////////////////////////////////////////////
594 // 指纹注册SPI命令处理过程
595 // 发送:ETF+管理分类+应用分类+用户编号+密码
596 // 返回:ETFS成功
597 // ETFF+X失败
598 // ETFM提醒用户抬起手指
599 // ETFR提醒用户按下手指
600 ///////////////////////////////////////////////////////////////////////////////
601 bit Enroll()
602 {
603 1 idata uchar i; // 计数器
604 1
605 1 NewMsgNum(); // 信息号
606 1
607 1 SPIbuf[0]='E'; // 注册用户ETF
608 1 SPIbuf[1]='T';
609 1 SPIbuf[2]='F';
610 1
611 1 SPIbuf[3]=ManageClass; // 管理员或普通用户
612 1 SPIbuf[4]=AppClass; // 指纹或密码用户
613 1
C51 COMPILER V7.07 MSS_SPI 09/14/2005 15:20:47 PAGE 11
614 1 for(i=0;i<5;i++) SPIbuf[5+i]=User_id[i];
615 1
616 1 if(AppClass=='P')
617 1 {
618 2 for(i=0;i<6;i++)
619 2 SPIbuf[10+i]=Password[i]; // 密码用户输入密码
620 2 }
621 1 else
622 1 {
623 2 for(i=0;i<6;i++)
624 2 SPIbuf[10+i]=Password[i]; // 密码用户发送用户输入的密码
625 2 }
626 1
627 1 CommandLen=16; // 命令体长度
628 1
629 1 SendMsg(); // 发送命令
630 1 Rstwdt(); // 喂狗
631 1
632 1 if(AppClass=='F')
633 1 {
634 2 GLCD_Locate(40,32);
635 2 dprintf(User_id,5); // 显示用户名
636 2 GLCD_Locate(16,48);
637 2 dprintf(Putf,12); // 按下手指
638 2 }
639 1
640 1 if(ACKReceive()!=ACK) // 收到指纹模块NAK命令,表示命令体错误或命令不能识别或通信错误
641 1 {
642 2 disperr(100); // 显示错误
643 2 }
644 1 else
645 1 {
646 2 liftget_enroll:
647 2 if(SPIReceive()) // 接收DSP数据
648 2 {
649 3 Rstwdt(); // 喂狗
650 3
651 3 if(SPIbuf[SOHptr+7]=='E' && SPIbuf[SOHptr+8]=='T' && SPIbuf[SOHptr+9]=='F')
652 3 {
653 4
654 4 switch(SPIbuf[SOHptr+10])
655 4 {
656 5 case 'M' :
657 5 GLCD_Locate(16,48);
658 5 dprintf(Liftf,12); // 抬起手指
659 5 goto liftget_enroll;
660 5 break;
661 5 case 'R' :
662 5 GLCD_Locate(16,48);
663 5 dprintf(Putf,12); // 按下手指
664 5 goto liftget_enroll;
665 5 break;
666 5 case 'F' :
667 5 pulse=3;
668 5 disperr(SPIbuf[SOHptr+11]); // 显示错误
669 5 break;
670 5 case 'S' :
671 5 pulse=1;
672 5 if(wieformat==1) // 自定义门禁方式
673 5 white_bill_reg(); // 注册白名单
674 5
675 5 Wait10ms();
C51 COMPILER V7.07 MSS_SPI 09/14/2005 15:20:47 PAGE 12
676 5 Wait10ms();
677 5 Wait10ms();
678 5 Wait10ms();
679 5
680 5 GLCD_Locate(16,32);
681 5 dprintf(success,12); // 成功
682 5 GLCD_Locate(0,48);
683 5 dprintf(" ",15);
684 5 GLCD_Locate(24,48);
685 5 dprintf(welcome,4); // 欢迎
686 5 GLCD_Locate(72,48);
687 5 dprintf(User_id,5); // 用户名
688 5 time_out=100;
689 5 do{}while(time_out!=0);
690 5 time_out=0;
691 5 return OK;
692 5 break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -