找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4378|回复: 2
打印 上一主题 下一主题
收起左侧

自学单片机+MFRC522射频识别卡读写

[复制链接]
跳转到指定楼层
楼主
1、工作之余,对射频识别卡读写比较好奇,就那个宝买了一款简易读写器,利用手边的STM32F072板子写一下;
2、经过几天努力调通了,分享一下;
3、篇幅有限,分享几个代码截屏;


int main(void)
{
  PORT_Init();
  KEY_Init();//OK
  TIM2_Init();//OK
  UART1_Config();//PA9-TX,PA10-RX,AF1
  MFRC522_Init();
  IWDG_Config();//OK
  if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET) {RCC_ClearFlag();}//位 24 RMVF: 清除复位标志
  printf( "-----STM32F072 Mifare RC522 RFID Card reader 13.56 MHz-----\r");

  while (1)
  {        
    IWDG_ReloadCounter();//喂狗
    #if 1
    //-----------寻天线区内未进入休眠状态的卡,返回卡片类型 2字节 [1][0]-------------
    if((OperationCard >= READCARD_2)&&(bIDFlag==0))
    {
        bIDFlag =1;
        printf("---------------寻找IC卡-------------\n\r");
        if (!MFRC522_Request(PICC_REQIDL,& RevBufstr[0]))
        {
            if(RevBufstr[1]==0x00 && RevBufstr[0]==0x04){printf("---------------IC卡S50-------------\n\r");}//0004
            else if(RevBufstr[1]==0x00 && RevBufstr[0]==0x02){printf("---------------IC卡S70-------------\n\r");}//0002
            else                                           { printf("---------------XXX-------------\n\r");}

            //----------防冲撞,返回卡的序列号 4字节  [5][4][3][2]---------------
            if (!MFRC522_Anticoll(&RevBufstr[2]))
            {
                IWDG_ReloadCounter();//喂狗
                printf("---------------防冲撞-----------\n\r");
                //序列号转换为ASCII码
                for(CardNum=0;CardNum<4;CardNum++)
                {
                    string[2*CardNum] = ASCII_NUM[(RevBufstr[CardNum+2]>>4)&0x0f];
                    string[2*CardNum+1] = ASCII_NUM[RevBufstr[CardNum+2]&0x0f];
                }
                printf("---------------Card ID:%s--------------\n\r",string);
                //printf("---------------Card ID:%d--------------\n\r",string);// 已经转换成ASIC码,需要%s字符格式!
                IWDG_ReloadCounter();//喂狗
                //--------------------选卡-------------------
                //读写模块将传送SEL ,NVB及全部40 位的UID CLn,后面加CRC_A校验,与这40位UID CLn匹配的RFID卡以其SAK 响应
                if (! MFRC522_SelectTag(&RevBufstr[2]))
                {
                    printf("---------------选卡成功--------------\n\r");
                    IWDG_ReloadCounter();//喂狗

                 if(OperationCard == READCARD_2)//----------------写卡-------------------
                 {
                    //------验证秘钥keyA--------
                   if (! MFRC522_Auth(PICC_AUTHENT1A,7,NewKeyA,&RevBufstr[2]))
                   {
                       printf("--------------写卡-----验证秘钥keyA 成功--\n\r");
                       //-----读数据块5-----
                       if(!MFRC522_Write(5,&Write_Consume_Data[0]))
                       {
                           printf("---------------写卡:%s----------\n\r",&Write_Consume_Data[0]);
                           MFRC522_Halt();
                       }
                   }
                 } else if(OperationCard==READCARD_3)//读卡
                 {
                   IWDG_ReloadCounter();//喂狗
                    //------验证秘钥keyA--------
                    if (! MFRC522_Auth(PICC_AUTHENT1A,7,NewKeyA,&RevBufstr[2]))
                    {
                        printf("------读卡-----验证秘钥keyA 成功------\n\r");
                        //-----读数据块5-----
                        if(!MFRC522_Read(5,&Read_Data[0]))
                        {
                            IWDG_ReloadCounter();//喂狗
                            //memcpy( (uint8 *)&money, Read_Data, 4 );
                            /*
                            for(CardNum=0;CardNum<4;CardNum++)
                            {
                                string[2*CardNum] = ASCII_NUM[(Read_Data[CardNum]>>4)&0x0f];
                                string[2*CardNum+1] = ASCII_NUM[Read_Data[CardNum]&0x0f];
                            }*/
                            printf("------------读卡:%s---------\n\r",&Read_Data[0]);
                            MFRC522_Halt();
                        }
                    }
                 }
                    #if 0
                    if(OperationCard == REGCARD_1)//----------------注册-------------------
                    {
                        //------验证秘钥keyA--------
                        //#if 0
                        if (! MFRC522_Auth(PICC_AUTHENT1A,7,LastKeyA,&RevBufstr[2]))//
                        {
                            printf(" --------------注册------验证秘钥keyA 成功------------------ \n\r");
                            IWDG_ReloadCounter();//喂狗
                            //块7,第1扇区尾块;-------写入新keyA;----------
                            if(!MFRC522_Write(7,&NewKey[0]))
                            {
                                IWDG_ReloadCounter();//喂狗
                                printf(" --------注册----第1扇区尾块块7 写入新keyA------------ \n\r");
                                if(!MFRC522_Write(4,&Write_Consume_Data[0]))
                                {
                                    printf(" ------注册------写入新Write_Consume_Data 成功------------ \n\r");
                                    IWDG_ReloadCounter();//喂狗
                                    MFRC522_Halt();
                                }
                            }
                        }
                        //#endif
                    }           
                    #endif
                }
            }
        }
    }
    #endif
    if(b5msFlag)
    {
        b5msFlag = 1;
        Timer5ms();
        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14) == Bit_RESET)
        {
            Delay_ms(100);//OK
            if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14) == Bit_RESET)//按键触发DMA传输至UART1外设
            {
                if(bKeyFlag == 0)
                {
                    bKeyFlag = 1;
                    bIDFlag = 0;
                    OperationCard ++;
                    if(OperationCard>3){OperationCard=0;}
                    printf("--------------OperationCard:%d--------------\n\r",OperationCard);
                    MFRC522_Init();
                }
            }
        }else { bKeyFlag = 0;}
    }
    if(b500msFlag)
    {
        b500msFlag = 0;
        bLedFlag^=1;
        if(bLedFlag) LED_ON();
        else       LED_OFF();
    }
  }
}


===============================下面为利用串口助手打印出来结果===============================

MFRC522_Init
---------------寻找IC-------------
命令:发送并接收数据
数据写进RC522 FIFO缓冲区
读取RC522中断标志位,等待RC522接收到IC卡返回的数据
读取FIFO缓冲区的数据
ICS50
---------------防冲撞-----------
命令:发送并接收数据
数据写进RC522 FIFO缓冲区
读取RC522中断标志位,等待RC522接收到IC卡返回的数据
读取FIFO缓冲区的数据
Card ID:89214F8D
---------------选卡--------------
命令:发送并接收数据
数据写进RC522 FIFO缓冲区
读取RC522中断标志位,等待RC522接收到IC卡返回的数据
读取FIFO缓冲区的数据
---------------验证秘钥keyA------------------
命令:验证秘钥
数据写进RC522 FIFO缓冲区
读取RC522中断标志位,等待RC522接收到IC卡返回的数据

RC522_1.jpg (4.67 MB, 下载次数: 40)

RC522_1.jpg

连接图.jpg (6.81 MB, 下载次数: 42)

连接图.jpg

烧写器.jpg (6.2 MB, 下载次数: 35)

烧写器.jpg

RC522电路原理图.pdf

41.8 KB, 下载次数: 34, 下载积分: 黑币 -5

RC522 学习笔记 190801.docx

1.19 MB, 下载次数: 48, 下载积分: 黑币 -5

MFRC522 IC中文说明书.pdf

804.44 KB, 下载次数: 38, 下载积分: 黑币 -5

Mifare1 S50IC卡中文说明书.pdf

136.12 KB, 下载次数: 28, 下载积分: 黑币 -5

RC522读卡打印过程.docx

15.19 KB, 下载次数: 26, 下载积分: 黑币 -5

读卡器介绍.pdf

1.86 MB, 下载次数: 27, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:493109 发表于 2020-2-29 23:17 | 只看该作者
我用52单片机试过成功读取IC的卡号,可惜试了好多次都没成功读出其它扇区的数区,包括扇区密码
回复

使用道具 举报

板凳
ID:562798 发表于 2021-2-1 23:13 | 只看该作者
270497470 发表于 2020-2-29 23:17
我用52单片机试过成功读取IC的卡号,可惜试了好多次都没成功读出其它扇区的数区,包括扇区密码

密码没有特殊手段读不出来的!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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