搜索
bottom↓
回复: 3

求救,为什么M1卡密码读不出数据来了?

[复制链接]

出0入0汤圆

发表于 2011-4-11 01:20:03 | 显示全部楼层 |阅读模式
#include "reg52.h"
#include <string.h>
#include <intrins.h>
#include "main.h"
#include "slrc1702.h"
#include "iso14443a.h"
//#include "stdio.h"

bit g_bReceOk;                                              //正确接收到上位机指令标志
bit g_bRc1702Ok;                                             //RC1702复位正常标志


unsigned int  g_cReceNum,tmp;                                   //接收到上位机的字节数
unsigned int  data g_cCommand;                              //接收到的命令码
unsigned char data g_cSNR[4];                               //M1卡序列号
unsigned char g_cIcdevH;                                    //设备标记
unsigned char g_cIcdevL;                                    //设备标记
unsigned char g_cFWI;                                       //
unsigned char g_cCidNad,flag;                                    //
unsigned char idata g_cReceBuf[64];                         //和上位机通讯时的缓冲区
unsigned char tt1[2];
unsigned char blockdata[16];
unsigned char Password[6]={0x77,0x77,0x77,0x77,0x77,0x77};



struct TranSciveBuffer{unsigned char MfCommand;
                       unsigned int  MfLength;
                       unsigned char MfData[64];
                      };


char M500PcdMfOutSelect(unsigned char type)
{
   WriteRawRC(RegMfOutSelect,type&0x7);
   return MI_OK;
}


char M500PiccRequest(unsigned char req_code, // request code ALL = 0x52
                                             // or IDLE = 0x26
                   unsigned char *atq)     // answer to request
{
   return PcdRequest(req_code,atq);
}


char M500PiccAnticoll   (unsigned char *snr)
{
   return PcdAnticoll(snr); // first cascade level
}



char M500PiccSelect(unsigned char *snr,
                  unsigned char *sak)
{
   return PcdSelect(snr,sak); // first cascade level
}



void main( )
{   
     
     unsigned counter,i,status1,counter1;
         unsigned char mfout=2;
         unsigned char cardserialno[4];
         unsigned char *sak1,*pkeys;
         pkeys=&Password[6];
         
         
         InitializeSystem( );
     Rc1702Ready( );
     PcdConfigISOType( 'A' );       
   
         PcdReadE2(8,4,g_cSNR);


          M500PcdMfOutSelect(mfout);

          
    while(1)
     {   
      
               
/*                status1 = M500PiccRequest(PICC_REQALL, tt1);//寻卡
          if (status1==MI_OK)//如果找到卡
        {




        status1=M500PiccAnticoll(cardserialno);

               
        }
         

                 if (status1==MI_OK)
        {
            status1=M500PiccSelect(cardserialno,sak1);//选择卡
       
        }
                                           Password[0]=0x77;
                               Password[1]=0x77;
                               Password[2]=0x77;
                               Password[3]=0x77;
                               Password[4]=0x77;
                               Password[5]=0x77;
         
                                                          
        //授权

  
        if (status1==MI_OK)
//        {

//         if(MI_OK==ChangeCodeKey(&Password,pkeys))
  // {


        //  if(MI_OK==PcdAuthKey(Password))
          {

                   status1=PcdAuthState(PICC_AUTHENT1A,0x0c,&Password,sak1);
          
          }
                */
  // }   }           
  /*if(status1==MI_OK)
   {
      
                 status1=PcdLoadKeyE2(PICC_AUTHENT1A,0X0C);

                 if(status1==MI_OK)
                 {

                         status1 = PcdAuthState(PICC_AUTHENT1A, 0X0C, sak1);

                 }

   }*/               
         
          
         /* if(status1==MI_OK)
           {
               status1=PcdRead(0x0c,blockdata);        //读数据   
                  // sond=~sond;       
                  
                   for(counter1=0;counter1<16;counter1++)
                {
                        i = blockdata[counter1]<<4>>4;//因为printf(%x) 只可以16进制显示整数,所以必须把uchar左移4位再右移4位,下同
                }

                 
                  
        }

                   if(status1==MI_OK)
                        {
                       
                       
                                       
                        }
       

          }  */       


           status1=PcdRequest(PICC_REQALL, tt1);
       
                         if(status1==MI_OK)

                   {
                           status1=PcdRequest(PICC_REQALL, tt1);
                   }
                           else
        {
       
                continue;//提前终止此轮循环, 并跳到while入口处
        }

                   if(status1==MI_OK)
                   {

                        status1=PcdAnticoll(g_cSNR);        //防冲撞

                   }
                                              else
        {
       
                continue;//提前终止此轮循环, 并跳到while入口处
        }

                   if(status1==MI_OK)
                   {

                        status1=PcdSelect(g_cSNR,sak1);

                   }
                                              else
        {
       
                continue;//提前终止此轮循环, 并跳到while入口处
        }


                  
                                                 
                  
                   if(status1==MI_OK)  //下载密码  把7777777777下载下去
                   {

                        status1=M500PcdLoadKeyE2(PICC_AUTHENT1A,0,&pkeys);  // Key loading into the fm1702sl  EEPROM
                         
               
                   }
                                     

                                  if(status1==MI_OK)   //校检密码
                   {

                        status1=PcdLoadKeyE2(PICC_AUTHENT1A,0);        //将存在fm1702sl的EEPROM中的密钥匙调入fm1702sl的FIFO
                          
                         
                        }
                          if(status1==MI_OK)
                         {

                                   status1 = PcdAuthState(PICC_AUTHENT1A, 0X0C, g_cSNR);     //功能:用存放fm1702sl的FIFO中的密钥和卡上的密钥进行验证
                                  

                         }
                                                    else
        {
       
                continue;//提前终止此轮循环, 并跳到while入口处
        }       

                             if(status1==MI_OK)

                           {
                          
                                   status1=PcdRead(0x0c,blockdata);           sond       = 0;                //蜂鸣器响一声,表示fm1702复位成功
                 DelayMs(200);
                 DelayMs(200);
                sond       = 1;
                                                                                                           
                           }
                    
                  }  


                  

                  while(1){};

  }





/////////////////////////////////////////////////////////////////////
//系统初始化
/////////////////////////////////////////////////////////////////////
void InitializeSystem()
{
    TMOD &= 0x0F;
   
        TMOD |= 0x21;
    //PCON |= 0x80;
    //SCON  = 0x50;
    //TH1 = TL1 = BOUND9600;
    TR1=1;
    P0 = P1 = P2 = P3 = 0xFF;
    IE |= 0x90;
}


void time0() interrupt 1
{
          TH0=(65536-50)/256;
    TL0=(65536-50)%256;
        tmp++;
       

}

/////////////////////////////////////////////////////////////////////
//初始化fm1702
/////////////////////////////////////////////////////////////////////
void Rc1702Ready()
{
    char status;
    DelayMs(100);
    DelayMs(100);
        DelayMs(100);
    DelayMs(100);
    DelayMs(100);
    DelayMs(100);
    DelayMs(100);

    status = PcdReset();
    if(status != MI_OK)
    {
        DelayMs(10);
        status = PcdReset();
    }
    if(status != MI_OK)
    {
        DelayMs(10);
        status = PcdReset();
    }
    if(status == MI_OK)
    {
        g_bRc1702Ok = 1;
      sond       = 0;                //蜂鸣器响一声,表示fm1702复位成功
                 DelayMs(200);
                 DelayMs(200);
                sond       = 1;
    }      
}
       




/////////////////////////////////////////////////////////////////////
//用T2做延时子程序
/////////////////////////////////////////////////////////////////////
void DelayMs(unsigned int _MS)
{
    RCAP2LH = RCAP2_1ms;
    T2LH    = RCAP2_1ms;

    ET2     = 0;                                            // Disable timer2 interrupt
    T2CON   = 0x04;                                        // 16-bit auto-reload, clear TF2, start timer
    TR2     = 1;
    while (_MS--)
    {   while (!TF2);TF2 = 0;  }
    TR2 = 0;
}
void Delay_50us(unsigned char _50us)
{
    RCAP2LH = RCAP2_50us;
    T2LH    = RCAP2_50us;

    ET2     = 0;                                            // Disable timer2 interrupt
    T2CON   = 0x04;                                           // 16-bit auto-reload, clear TF2, start timer
    while (_50us--)
    {   while (!TF2);TF2 = 0;  }
    TR2 = 0;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2011-5-17 23:37:46 | 显示全部楼层
不懂,纯顶一下。

出0入0汤圆

发表于 2012-4-9 20:57:54 | 显示全部楼层
楼主也是在做14443A啊,我正在做测试,我用的是CLRC632+SST89E58+MAX232,现在还在调试程序,先测协议里面的标准指令,再测一些自己加进去的指令。
想请教一下,我知道协议中command的数据帧,如何确定需要通过串口发送的指令呢?

出0入0汤圆

发表于 2012-7-10 08:58:21 | 显示全部楼层
默认指令不是 0x77 0x77 0x77 0x77 0x77
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 18:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表