查看: 8915|回复: 11

[分享] 【YL-KL26Z试用】RFID RC522电子钱包 测试成功。。

[复制链接]

该用户从未签到

11

主题

126

帖子

0

中级会员

Rank: 3Rank: 3

积分
458
最后登录
2021-10-17
发表于 2015-3-30 17:40:02 | 显示全部楼层 |阅读模式
电子钱包初始化程序。
Card_Data2[17] 要写入数据的数组缓冲
Section        要进行电子钱包初始化的块区

memset(Card_Data2,0,17);
Card_Data2[15] = ~0x05;
Card_Data2[14] = 0x05;
Card_Data2[13] = ~0x05;
Card_Data2[12] = 0x05;

Card_Data2[4]  = 0XFF;
Card_Data2[5]  = 0XFF;
Card_Data2[6]  = 0XFF;
Card_Data2[7]  = 0XFF;
status = PcdWrite(Section*4+1,Card_Data2);                   //写入0XAA,0X01,0X01……


电子钱包充值
Last_Money_Vual[4]  充值前电子钱包的数值
Money_Vual[4]          要充值的充值数值
Now_Money_Vual[4] 充值后的钱包数值
status = PcdRead(Section*4+1,Card_Data2);                  
if(status == MI_OK)
{
        Last_Money_Vual[0]= Card_Data2[3];
        Last_Money_Vual[1]= Card_Data2[2];
        Last_Money_Vual[2]= Card_Data2[1];
        Last_Money_Vual[3]= Card_Data2[0];
        status = PcdValue (0xc1,Section*4+1,Money_Vual); 主要操作 (充值)
        if(status == MI_OK)
         {
            status = PcdRead(Section*4+1,Card_Data2);                    //再一次把它读取出来16字节的卡片数据
            if(status == MI_OK)
             {
                Now_Money_Vual[0]= Card_Data2[3];
                Now_Money_Vual[1]= Card_Data2[2];
                Now_Money_Vual[2]= Card_Data2[1];
                Now_Money_Vual[3]= Card_Data2[0];
                                                                                   
               }                                                                        
        }

}
电子钱包扣款
Last_Money_Vual[4]  充值前电子钱包的数值
Money_Vual[4]          要充值的充值数值
Now_Money_Vual[4] 充值后的钱包数值
status = PcdRead(Section*4+1,Card_Data2);                  
if(status == MI_OK)
{
        Last_Money_Vual[0]= Card_Data2[3];
        Last_Money_Vual[1]= Card_Data2[2];
        Last_Money_Vual[2]= Card_Data2[1];
        Last_Money_Vual[3]= Card_Data2[0];
        status = PcdValue (0xc0,Section*4+1,Money_Vual);  主要操作(扣款)
        if(status == MI_OK)
         {
            status = PcdRead(Section*4+1,Card_Data2);                    //再一次把它读取出来16字节的卡片数据
            if(status == MI_OK)
             {
                Now_Money_Vual[0]= Card_Data2[3];
                Now_Money_Vual[1]= Card_Data2[2];
                Now_Money_Vual[2]= Card_Data2[1];
                Now_Money_Vual[3]= Card_Data2[0];
                                                                                   
               }                                                                        
        }

}
回复

使用道具 举报

  • TA的每日心情
    开心
    2017-1-24 09:50
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    654

    主题

    3262

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    13140
    最后登录
    2019-1-27
    发表于 2015-3-30 18:08:03 | 显示全部楼层
    有没有演示?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    145

    主题

    4926

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9267
    最后登录
    1970-1-1
    发表于 2015-4-1 16:18:07 | 显示全部楼层
    建议楼主尽量多描述点,否则直接贴代码,大家很难参考哦。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    11

    主题

    126

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    458
    最后登录
    2021-10-17
     楼主| 发表于 2015-4-7 16:13:58 | 显示全部楼层
    Demo_SD_wav.rar (2.2 MB, 下载次数: 105)
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    11

    主题

    126

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    458
    最后登录
    2021-10-17
     楼主| 发表于 2015-4-8 10:38:10 | 显示全部楼层
    QQ截图20150408103439.png QQ图片20150408103416.png

    测试成功了。。
    另外要注意:如果发生扣款 和充值不成功。。一定要调整

    char PcdComMF522(unsigned char Command,
                     unsigned char *pInData,
                     unsigned char InLenByte,
                     unsigned char *pOutData,
                     unsigned int  *pOutLenBit)
    {
        char status = MI_ERR;
        unsigned char irqEn   = 0x00;
        unsigned char waitFor = 0x00;
        unsigned char lastBits;
        unsigned char n;
        unsigned int i;
        switch (Command)
        {
           case PCD_AUTHENT:
              irqEn   = 0x12;
              waitFor = 0x10;
              break;
           case PCD_TRANSCEIVE:
              irqEn   = 0x77;
              waitFor = 0x30;
              break;
           default:
             break;
        }

        WriteRawRC(ComIEnReg,irqEn|0x80);
        ClearBitMask(ComIrqReg,0x80);
        WriteRawRC(CommandReg,PCD_IDLE);
        SetBitMask(FIFOLevelReg,0x80);

        for (i=0; i<InLenByte; i++)
          {   
                        WriteRawRC(FIFODataReg, pInData);   
          }
        WriteRawRC(CommandReg, Command);
        Delay(5);

        if (Command == PCD_TRANSCEIVE)
           {
             SetBitMask(BitFramingReg,0x80);  
                              }
        i = 3000;//根据时钟频率调整,操作M1卡最大等待时间25ms
        do
           {
             n = ReadRawRC(ComIrqReg);
                                     Delay(5);
             i--;
           }  while ((i!=0) && !(n&0x01) && !(n&waitFor));

        ClearBitMask(BitFramingReg,0x80);
                
        if (i!=0)
        {   
             if(!(ReadRawRC(ErrorReg)&0x1B))
             {
                 status = MI_OK;
                 if (n & irqEn & 0x01) status = MI_NOTAGERR;

                 if (Command == PCD_TRANSCEIVE)
                 {
                           n = ReadRawRC(FIFOLevelReg);
                          lastBits = ReadRawRC(ControlReg) & 0x07;
                    if (lastBits)
                    {   *pOutLenBit = (n-1)*8 + lastBits;   }
                    else
                    {   *pOutLenBit = n*8;   }
                    if (n == 0)
                    {   n = 1;    }
                    if (n > MAXRLEN)
                    {   n = MAXRLEN;   }
                    for (i=0; i<n; i++)
                    {   pOutData = ReadRawRC(FIFODataReg);    }
                }
             }
             else
             {   status = MI_ERR;   }

       }


       SetBitMask(ControlReg,0x80);           // stop timer now
       WriteRawRC(CommandReg,PCD_IDLE);
       return status;
    }


    回复 支持 反对

    使用道具 举报

    该用户从未签到

    11

    主题

    126

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    458
    最后登录
    2021-10-17
     楼主| 发表于 2015-4-8 10:39:03 | 显示全部楼层
    工程我就不重复了。。直接上我调试好的代码子函数。。

    void CardMoneyInit(unsigned char Section)
    {
             unsigned int TryCount=0;;
       PcdAntennaOn();
             Delay(50);
             status = 0;
             while(1)
             {
              status = PcdRequest(PICC_REQALL,Card_Type1);
        if(status == MI_OK)
                     {
                             status = PcdAnticoll(Card_ID);//防冲撞
                             if(status == MI_OK)
                              {
                                            status = PcdSelect(Card_ID);  //选卡
                                            if(status == MI_OK)
                                              {
                                                status = PcdAuthState(PICC_AUTHENT1A,Section*4,Card_KEY,Card_ID);
                                                if(status == MI_OK)
                                                             {
                                                               memset(Card_Data1,0,17);
                                             memcpy(&Card_Data1[1],"COTAO-R&D-0036",14);
                                 Card_Data1[0] =':';
                                       Card_Data1[15]='Y';
                                       status = PcdWrite(Section*4,Card_Data1);                   //写入0XAA,0X01,0X01……
                                       if(status != MI_OK)  printf( "Card Write Error");
                                                                     
                                                                     memset(Card_Data2,0,17);

                     Card_Data2[15] = ~0x05;
                                                                     Card_Data2[14] = 0x05;
                                                                     Card_Data2[13] = ~0x05;
                                                                     Card_Data2[12] = 0x05;
                                                                     
                                                                     Card_Data2[4]  = 0XFF;
                                                                     Card_Data2[5]  = 0XFF;
                                                                     Card_Data2[6]  = 0XFF;
                                                                     Card_Data2[7]  = 0XFF;
                                                                     
                                                                     status = PcdWrite(Section*4+1,Card_Data2);                   //写入0XAA,0X01,0X01……
                                       if(status != MI_OK)  printf( "Card Write Error\r\n");
                                                                     
                                                                     memset(Card_Data3,0,17);       
                                                                     Card_Data3[0]=':';
                                                                     Card_Data3[1]='T';
                                                                     Card_Data3[14]='Y';
                                                                     Card_Data3[15]='0';
                                                                     status = PcdWrite(Section*4+2,Card_Data3);                   //写入0XAA,0X01,0X01……
                                       if(status != MI_OK)  printf( "Card Write Error\r\n");       
                     PcdHalt();
                     Delay(50);                                                                         
                                                                     PcdAntennaOff();                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
                     printf("MoneyBag Complete. \r\n  ");                                                                                                
                     break;                                                                               
                                                              }
                                                            else
                                                             {
                                                               printf("Auth State Error\r\n");
                                                                     
                     PcdHalt();                                                 
                                                                     PcdAntennaOff();                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
                                                              }
                                              }       
              else printf( "Select Card Error\n\r");                                               
                                     }
                             else printf("Anticoll Error\n\r");
                            }
                    else  
                     {
                      printf("NoCardInReader!^_^\r\n");
                            TryCount++;
                            printf( "TryScanCount %d \r\n",TryCount);
         
          if(TryCount > 5000)       
                              {
                                      printf ("NoCard Return For ....\r\n");
                                            Delay(100);                                                                               
                                            PcdAntennaOff();
              break;                                                                               
                                     }                               
                      }
        }
    }  

    void CardMoneySub(unsigned char Section,unsigned int Money)
    {
             unsigned int TryCount=0;
           
             Money_Vual[0] = Money;
             Money_Vual[1] = Money>>8;
             Money_Vual[2] = Money>>16;
             Money_Vual[3] = Money>>24;
       PcdAntennaOn();
             Delay(20);
             status = 0;
             while(1)
             {
              status = PcdRequest(PICC_REQALL,Card_Type1);
        if(status == MI_OK)
                     {
                             status = PcdAnticoll(Card_ID);//防冲撞
                             if(status == MI_OK)
                              {
                                            status = PcdSelect(Card_ID);  //选卡
                                            if(status == MI_OK)
                                              {
                                                status = PcdAuthState(PICC_AUTHENT1A,Section*4,Card_KEY,Card_ID);
                                                if(status == MI_OK)
                                                             {
                                                                status = PcdRead(Section*4+1,Card_Data2);                    //再一次把它读取出来16字节的卡片数据
                                       if(status == MI_OK)
                                                                       {
                                                                                    Last_Money_Vual[0]= Card_Data2[0];
                                                                                    Last_Money_Vual[1]= Card_Data2[1];
                                                                                    Last_Money_Vual[2]= Card_Data2[2];
                                                                                    Last_Money_Vual[3]= Card_Data2[3];
                                                                                    Money = (Last_Money_Vual[3]<<24)+(Last_Money_Vual[2]<<16)+(Last_Money_Vual[1]<<8)+Last_Money_Vual[0];
                                                                                    printf("扣款前卡内余额:%d \r\n",Money);
                                                                  status = PcdValue (0xc0,Section*4+1,Money_Vual);
                                                                        if(status == MI_OK)
                                                                                {
                                                                                        status = PcdRead(Section*4+1,Card_Data2);                    //再一次把它读取出来16字节的卡片数据
                                              if(status == MI_OK)
                                                                              {
                                                                                            Now_Money_Vual[0]= Card_Data2[0];
                                                                                            Now_Money_Vual[1]= Card_Data2[1];
                                                                                            Now_Money_Vual[2]= Card_Data2[2];
                                                                                            Now_Money_Vual[3]= Card_Data2[3];
                                                                                                                    Money = (Now_Money_Vual[3]<<24)+(Now_Money_Vual[2]<<16)+(Now_Money_Vual[1]<<8)+Now_Money_Vual[0];
                                                                                            printf("扣款后金额是:%d  \r\n",Money);
                                                                                    }                                                                         
                                              else printf( "Card Read Error \r\n");
                                                                                 }                                                                               
                                                                         else  printf( "Card Sub Error.... \r\n");
                                                                        }
                                                                            else  printf( "Card Read Error \r\n");                
                     PcdHalt();
                     Delay(50);                                                                         
                                                                     PcdAntennaOff();                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
                                                                                                  
                     break;
                                                              }
                                                            else
                                                             {
                                                               printf("Auth State Error\r\n");
                     PcdHalt();                                                 
                                                                     PcdAntennaOff();                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
                                                              }
                                              }       
              else printf( "Select Card Error\n\r");                                               
                                     }
                             else printf("Anticoll Error\n\r");
                            }
                    else  
                     {
                      printf("NoCardInReader!^_^\r\n");
                            printf("TryCount is %d",TryCount);
                            TryCount++;
          if(TryCount > 5000)       
                              {
                                      printf("NoCard Return For ....\r\n");
                                            Delay(100);                                                                               
                                            PcdAntennaOff();
              break;                                                                               
                                     }                               
                      }
        }
    }   
    void CardMoneyAdd(unsigned char Section,unsigned int Money)
    {
             unsigned int TryCount=0;

             Money_Vual[0] = Money;
             Money_Vual[1] = Money>>8;
             Money_Vual[2] = Money>>16;
             Money_Vual[3] = Money>>24;
       PcdAntennaOn();
             Delay(20);
             status = 0;
             while(1)
             {
              status = PcdRequest(PICC_REQALL,Card_Type1);
        if(status == MI_OK)
                     {
                             status = PcdAnticoll(Card_ID);//防冲撞
                             if(status == MI_OK)
                              {
                                            status = PcdSelect(Card_ID);  //选卡
                                            if(status == MI_OK)
                                              {
                                                status = PcdAuthState(PICC_AUTHENT1A,Section*4,Card_KEY,Card_ID);
                                                if(status == MI_OK)
                                                             {
                                                                status = PcdRead(Section*4+1,Card_Data2);                    //再一次把它读取出来16字节的卡片数据
                                       if(status == MI_OK)
                                                                       {
                                                                                    Last_Money_Vual[0]= Card_Data2[0];
                                                                                    Last_Money_Vual[1]= Card_Data2[1];
                                                                                    Last_Money_Vual[2]= Card_Data2[2];
                                                                                    Last_Money_Vual[3]= Card_Data2[3];
                                                                                    Money = (Last_Money_Vual[3]<<24)+(Last_Money_Vual[2]<<16)+(Last_Money_Vual[1]<<8)+Last_Money_Vual[0];  
                                                                                    printf("充值前卡内余额:%d \r\n",Money);
                                                                  status = PcdValue (0xc1,Section*4+1,Money_Vual);
                                                                        if(status == MI_OK)
                                                                                {
                                                                                        status = PcdRead(Section*4+1,Card_Data2);                    //再一次把它读取出来16字节的卡片数据
                                              if(status == MI_OK)
                                                                              {
                                                                                            Now_Money_Vual[0]= Card_Data2[0];
                                                                                            Now_Money_Vual[1]= Card_Data2[1];
                                                                                            Now_Money_Vual[2]= Card_Data2[2];
                                                                                            Now_Money_Vual[3]= Card_Data2[3];
                                                                                                                    Money = (Now_Money_Vual[3]<<24)+(Now_Money_Vual[2]<<16)+(Now_Money_Vual[1]<<8)+Now_Money_Vual[0];
                                                                                            printf("充值后金额是:%d \r\n",Money);
                                                                                    }                                                                         
                                              else printf( "Card Read Error \r\n");
                                                                                 }                                                                               
                                                                         else  printf( "Card ADD Error....\r\n ");
                                                                        }
                                                                            else  printf( "Card Read Error \r\n ");                
                     PcdHalt();
                     Delay(50);                                                                         
                                                                     PcdAntennaOff();                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
                                                                                                  
                     break;
                                                              }
                                                            else
                                                             {
                                                               printf("Auth State Error\r\n");
                     PcdHalt();                                                 
                                                                     PcdAntennaOff();                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
                                                              }
                                              }       
              else printf( "Select Card Error\n\r");                                               
                                     }
                             else printf("Anticoll Error\n\r");
                            }
                    else  
                     {
                      printf("NoCardInReader!^_^\r\n");
                            printf("TryCount is %d \r\n",TryCount);
                            TryCount++;
          if(TryCount > 5000)       
                              {
                                      printf("NoCard Return For ....\r\n");
                                            Delay(100);                                                                               
                                            PcdAntennaOff();
              break;                                                                               
                                     }                               
                      }
        }
    }  
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    19

    主题

    317

    帖子

    0

    高级会员

    Rank: 4

    积分
    862
    最后登录
    1970-1-1
    发表于 2015-5-7 00:31:16 | 显示全部楼层
    代码很详细,学习了,
    楼主实验的钱包数字是真的吗????呵呵。。。。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    11

    主题

    126

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    458
    最后登录
    2021-10-17
     楼主| 发表于 2015-5-7 15:13:20 | 显示全部楼层
    mlxy123xy 发表于 2015-5-7 00:31
    代码很详细,学习了,
    楼主实验的钱包数字是真的吗????呵呵。。。。。 ...

    自己冲的。。可以一个用到实际中。。不过现在的公交卡 或者小区的门卡 里边已经加密了。。有密码就可以随便充钱了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-1-24 09:50
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    654

    主题

    3262

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    13140
    最后登录
    2019-1-27
    发表于 2015-5-7 17:18:07 | 显示全部楼层
    FlyMyself 发表于 2015-5-7 15:13
    自己冲的。。可以一个用到实际中。。不过现在的公交卡 或者小区的门卡 里边已经加密了。。有密码就可以随 ...

    可以随便冲钱?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    19

    主题

    317

    帖子

    0

    高级会员

    Rank: 4

    积分
    862
    最后登录
    1970-1-1
    发表于 2015-5-7 19:47:29 | 显示全部楼层
    小七 发表于 2015-5-7 17:18
    可以随便冲钱?

    你们都是壕。。。。。。。。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-27 04:15 , Processed in 0.107050 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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