历史上的今天
返回首页

历史上的今天

今天是:2024年11月06日(星期三)

正在发生

2019年11月06日 | 单片机读写RC522射频卡上位机调试软件及参考例程

2019-11-06 来源:51hei

下位机(单片机)电路原理图:
 

上位机delphi源码与说明资料:
 

IC读写器使用说明

一、读写器连接

1.1 把通讯线“DB9”端插到PC 机的串口1/2 上

1.2 把通讯线2510端插到读写器的插座,使读写器和PC 机的串口良好连接

1.2 把电源线的“圆柱”端插到读写器的电源座子上

1.3读写器上电以后可以听到一声风鸣器的响声,如果没有听到风鸣器声,表明读写器没有正常上电.

二、启动Demo 软件

2.1 双击启动测试软件

2.2 如果串口良好连接的话可以听到一声风鸣器的响声,如果启动测试软件以后并没有听到风鸣器声表明串口通讯没有连接好,请检查串口连接线是否连接正确

三、M1卡片读写测试

3.1 把一张Mifare One 卡片放在天线区域范围内

3.2 进入功能选项“低级操作”里面点击“寻卡”,如果出现“寻卡成功!”表明寻卡正常,如果出现“执行失败!”表明出现异常,请检查卡片是否在寻卡范围内,如果确认卡片没有问题,那读写器有异常

3.3 点击“防冲突”,如果出现“执行成功”表明防冲突正常,如果出现“执行失败”表明读写器出现异常或者卡片没有在天线区域范围内

3.4 点击“选择”,如果出现“执行成功”表明选择正常,如果出现“执行失败”表明读写器出现异常或者卡片没有在天线区域范

围内

3.5 进入功能选项“密码下载”里面下载卡片密码,比如需要测试卡片扇区1 数据的读写,那么就在扇区1后面填上密码A/B(注:卡片的初始密码A/B 均为全‘F’),然后选择“A 组密码”或者“B 组密码”,最后点击“下载”,如果出现“密码下载成

功”表明密码下载成功,如果出现异常请按照错误提示更改后再下载一次,直至“下载成功”为止

3.6 进入功能选项“数据读写”里面,“请选择扇区号”下面的可拉选项里面选择第5步下载密码的扇区号(比如扇区1),然后点击“读出”,如果提示“第*扇区数据读出成功”表明读数据正确。如果出现“第*扇区数据读出失败”表明密码校验出错或者出现其他异常,请返回第5 步重新下载密码

3.7 如果读数据正确,在块0、块1、块2 后面修改数据,比如改成

“块0:12345678901234567890123456789012”

“块1:23456789012345678901234567890123”

“块2:34567890123456789012345678901234”

然后点击“写入”,如果出现“第*扇区数据写入成功”表明写入数据正确。如果出现“第*扇区写入失败”表明密码校验出错或者出现其他异常,请返回第5 步重新下载密码

3.8 再次点击“读出”键,然后点击“读出”,如果提示“第*扇区数据读出成功”表明读数据正确,再对比块0、块1、块2 是否和第7 步写入的数据一样,如果数据一样,证明写入成功了。如果出现“第*扇区数据读出失败”表明密码校验出错或者出现其他异常,请返回第5 步重新下载密码。

四、Mifare One 卡片块值测试

4.1 进入功能选项“块值操作”里面,在“扇区号”下面的可拉选项里面选择第3.5 步下载密码的扇区号(比如扇区1),在“块号”下面的可拉选项里面选择你想测试的块号(比如第1 块)

4.2 在“操作值”后面填上你所希望的初始值(比如“11111111”),然后点击“初始化”,如果出现“数据初始化成功”表明操作成功。如果出现“数据初始化失败”表明操作失败,请检查密码是否正确,返回第3.1 步重新操作一次。

4.3 点击“读出”,如果在“当前值”后面出现是你原来写进去的初始值,证明操作正确,如果“数据读出失败”表明块值操作有异常,请重新初始化。

4.4 在“操作值:”后面填上你所希望的操作值(比如“22222222”),然后点击“加值”,如果出现“数值加操作成功”,表明操作成功。如果出现其他提示表明操作失败

4.4 点击“读出”,如果在“当前值:”后面出现是你初始值加上加值(11111111+22222222=33333333)表明操作正确,如果是其他的值表明失败

4.5 在“操作值:”后面填上你所希望的操作值(比如“11111111”),然后点击“减值”,如果出现“数值减操作成功”,表明操作成功。如果出现其他提示表明操作失败

4.6 点击“读出”,如果在“当前值:”后面出现是你当前值减去操作值(33333333-11111111=22222222),表明操作正确,如果是其他值表明失败

五、修改密码和控制位

5.1 进入功能选项“修改密码”里面,在“扇区号”下面的可拉选项里面选择第3.5步下载密码的扇区号(比如扇区1)

5.2 在“密码A”和“密码B”后面分别写入你想修改的密码A 和密码B

5.3 卡片控制位修改之前请详细阅读卡片资料,因为控制位修改不正确,就会导致卡片

不能再使用,请务必小心使用

5.4 在控制位后面填上该扇区的控制位

5.3 点击“修改密码”,如果出现“修改密码成功”,表示操作正确,如果出现出错提示,

请按照出错提示做相应的处理。(注:密码修改后请务必记住,密码遗忘卡片就不

能再次是使用了)

六、参数设置

6.1 进入功能选项“参数设置”里面,可以设置串口通讯参数:串口号、波特率、校验位、数据位、停止位等等,设置玩了以后点击“修改串口”,如果出现“串口参数设置成功”,表明串口设置成功,如果出现异常,请按照提示做出改动。

6.2 设置完毕以后可以点击“测试读卡器”,如果出现“读卡器连接成功”,并且听到读卡器的风鸣器响声,证明串口设置正确,如果出现“读卡器连接失败”,表明串口设置有问题,请重新设置。

6.3 读写器默认参数:Com1、9600bps、N、8、1

七、调试信息

7.1 进入功能选项“调试信息”里面,在“串口信息发送与接受”处可以看到PC 机和读卡器之间通讯的详细过程,对调试非常有帮助



单片机(下位机)源程序如下:

#include

#include "reg52.h"

#include "main.h"

#include "mfrc522.h"

#include  

#define MAXRLEN 18                        

/////////////////////////////////////////////////////////////////////

//功    能:寻卡

//参数说明: req_code[IN]:寻卡方式

//                0x52 = 寻感应区内所有符合14443A标准的卡

//                0x26 = 寻未进入休眠状态的卡

//          pTagType[OUT]:卡片类型代码

//                0x4400 = Mifare_UltraLight

//                0x0400 = Mifare_One(S50)

//                0x0200 = Mifare_One(S70)

//                0x0800 = Mifare_Pro(X)

//                0x4403 = Mifare_DESFire

//返    回: 成功返回MI_OK

/////////////////////////////////////////////////////////////////////

char PcdRequest(unsigned char req_code,unsigned char *pTagType)

{

   char status;  

   unsigned int  unLen;

   unsigned char ucComMF522Buf[MAXRLEN]; 

//  unsigned char xTest ;

   ClearBitMask(Status2Reg,0x08);

   WriteRawRC(BitFramingReg,0x07);


//  xTest = ReadRawRC(BitFramingReg);

//  if(xTest == 0x07 )

//   { LED_GREEN  =0 ;}

// else {LED_GREEN =1 ;while(1){}}

   SetBitMask(TxControlReg,0x03);


   ucComMF522Buf[0] = req_code;


   status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);

//     if(status  == MI_OK )

//   { LED_GREEN  =0 ;}

//   else {LED_GREEN =1 ;}

   if ((status == MI_OK) && (unLen == 0x10))

   {    

       *pTagType     = ucComMF522Buf[0];

       *(pTagType+1) = ucComMF522Buf[1];

   }

   else

   {   status = MI_ERR;   }

   

   return status;

}


/////////////////////////////////////////////////////////////////////

//功    能:防冲撞

//参数说明: pSnr[OUT]:卡片序列号,4字节

//返    回: 成功返回MI_OK

/////////////////////////////////////////////////////////////////////  

char PcdAnticoll(unsigned char *pSnr)

{

    char status;

    unsigned char i,snr_check=0;

    unsigned int  unLen;

    unsigned char ucComMF522Buf[MAXRLEN]; 

    


    ClearBitMask(Status2Reg,0x08);

    WriteRawRC(BitFramingReg,0x00);

    ClearBitMask(CollReg,0x80);


    ucComMF522Buf[0] = PICC_ANTICOLL1;

    ucComMF522Buf[1] = 0x20;


    status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);


    if (status == MI_OK)

    {

             for (i=0; i<4; i++)

         {   

             *(pSnr+i)  = ucComMF522Buf[i];

             snr_check ^= ucComMF522Buf[i];

         }

         if (snr_check != ucComMF522Buf[i])

         {   status = MI_ERR;    }

    }

    

    SetBitMask(CollReg,0x80);

    return status;

}


/////////////////////////////////////////////////////////////////////

//功    能:选定卡片

//参数说明: pSnr[IN]:卡片序列号,4字节

//返    回: 成功返回MI_OK

/////////////////////////////////////////////////////////////////////

char PcdSelect(unsigned char *pSnr)

{

    char status;

    unsigned char i;

    unsigned int  unLen;

    unsigned char ucComMF522Buf[MAXRLEN]; 

    

    ucComMF522Buf[0] = PICC_ANTICOLL1;

    ucComMF522Buf[1] = 0x70;

    ucComMF522Buf[6] = 0;

    for (i=0; i<4; i++)

    {

            ucComMF522Buf[i+2] = *(pSnr+i);

            ucComMF522Buf[6]  ^= *(pSnr+i);

    }

    CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);

  

    ClearBitMask(Status2Reg,0x08);


    status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);

    

    if ((status == MI_OK) && (unLen == 0x18))

    {   status = MI_OK;  }

    else

    {   status = MI_ERR;    }


    return status;

}


/////////////////////////////////////////////////////////////////////

//功    能:验证卡片密码

//参数说明: auth_mode[IN]: 密码验证模式

//                 0x60 = 验证A密钥

//                 0x61 = 验证B密钥 

//          addr[IN]:块地址

//          pKey[IN]:密码

//          pSnr[IN]:卡片序列号,4字节

//返    回: 成功返回MI_OK

/////////////////////////////////////////////////////////////////////               

char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr)

{

    char status;

    unsigned int  unLen;

    unsigned char i,ucComMF522Buf[MAXRLEN]; 


    ucComMF522Buf[0] = auth_mode;

    ucComMF522Buf[1] = addr;

    for (i=0; i<6; i++)

    {    ucComMF522Buf[i+2] = *(pKey+i);   }

    for (i=0; i<6; i++)

    {    ucComMF522Buf[i+8] = *(pSnr+i);   }

//   memcpy(&ucComMF522Buf[2], pKey, 6); 

//   memcpy(&ucComMF522Buf[8], pSnr, 4); 

    

    status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);

    if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))

    {   status = MI_ERR;   }

    

    return status;

}


/////////////////////////////////////////////////////////////////////

//功    能:读取M1卡一块数据

//参数说明: addr[IN]:块地址

//          pData[OUT]:读出的数据,16字节

//返    回: 成功返回MI_OK

///////////////////////////////////////////////////////////////////// 

char PcdRead(unsigned char addr,unsigned char *pData)

{

    char status;

    unsigned int  unLen;

    unsigned char i,ucComMF522Buf[MAXRLEN]; 


    ucComMF522Buf[0] = PICC_READ;

    ucComMF522Buf[1] = addr;

    CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

   

    status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

    if ((status == MI_OK) && (unLen == 0x90))

//   {   memcpy(pData, ucComMF522Buf, 16);   }

    {

        for (i=0; i<16; i++)

        {    *(pData+i) = ucComMF522Buf[i];   }

    }

    else

    {   status = MI_ERR;   }

    

    return status;

}


/////////////////////////////////////////////////////////////////////

推荐阅读

史海拾趣

DIOO公司的发展小趣事

为了进一步拓展市场,DIOO公司决定实施国际化战略。在21世纪初,DIOO公司成功打入欧洲和北美市场,与当地知名电子产品制造商建立了合作关系。通过引进国际先进的生产技术和设计理念,DIOO公司的产品逐渐赢得了全球消费者的认可和喜爱。同时,DIOO公司还积极参加国际电子展会和论坛,与全球业界同仁交流学习,不断提升自身的竞争力和影响力。

BSI公司的发展小趣事

在全球化的背景下,电子行业的国际合作日益加强。BSI作为国际标准化组织的重要成员,积极推动了电子行业的国际合作和交流。通过组织国际会议、研讨会等活动,BSI为各国政府、行业协会和企业提供了一个交流和合作的平台。这些活动不仅促进了电子行业的国际合作和交流,还推动了电子行业的全球化发展。

虽然以上并非具体的发展故事,但通过这些描述,可以看出BSI在电子行业发展中扮演了重要角色,通过标准制定、产品测试与认证、推动绿色发展、支持技术创新以及促进国际合作等方式,为电子行业的健康发展做出了积极贡献。如需更多关于BSI公司具体发展故事的信息,建议查阅公司官方发布的资料或相关新闻报道。

Analytic Instruments Corp公司的发展小趣事

Analytic Instruments Corp成立于XXXX年,最初由几位热衷于电子测量与分析技术的工程师创立。他们凭借对行业的深刻理解和敏锐的市场洞察力,研发出了一款具有创新性的电子测量仪器,该仪器在精度和稳定性上均优于市场上的同类产品。这一技术突破使得公司在创业初期就获得了市场的认可,为后续的发展奠定了坚实的基础。

Delphi Connection Systems公司的发展小趣事

随着全球对环保意识的不断提高,Delphi Connection Systems公司也积极响应环保号召,致力于研发和生产环保型连接器产品。公司采用环保材料和工艺,减少生产过程中的污染排放,同时推出可回收、可再利用的连接器产品。这一举措不仅符合了环保要求,也为客户提供了更加环保的解决方案。

EPSON公司的发展小趣事

随着业务的不断发展,EPSON开始积极拓展国际市场。公司先后在全球五大洲设立了多个生产和研发机构,以及销售和服务网点,以便更好地服务全球客户。通过不断拓展海外市场,EPSON逐渐实现了全球化战略,其产品和服务已经覆盖全球多个国家和地区。

Datasensor公司的发展小趣事

1978年,DATALOGIC公司成功研制出欧洲第一台条码扫描器,并将此产品应用于商业领域。这一创新不仅展示了公司在光电技术领域的实力,也为其在工业自动化领域赢得了良好的声誉。条码扫描器的成功推出,为公司带来了可观的收益,也为公司后续的技术研发和市场拓展提供了强有力的支持。

问答坊 | AI 解惑

电容漏泄的测量

电容器是几乎所有电气设备上都会用到的主要器件。漏阻是电容器被测试的众多电气特征中的一个。漏阻通常被称为“IR”(Insulation Resistance,绝缘电阻),以“兆欧-微法”表示。在其它情况下,漏泄可能被表示为特定电压(通常为工作电压)下的漏 ...…

查看全部问答>

请教代替3sk318的双栅管

本帖最后由 jameswangsynnex 于 2015-3-3 19:56 编辑 请教各位高手,什么型号的双栅管可以代替3SK318(能直接替换最好) 谢谢! …

查看全部问答>

电动车跷跷板【F题,二等奖】

本帖最后由 paulhyde 于 2014-9-15 09:04 编辑 电动车跷跷板~~~~~~~~  …

查看全部问答>

2440 读 温度芯片,总是无法触发中断,请教有什么方法呀?

BSP包里通过应用层调用IIC文件夹不能正常工作,只好转入到bootloader层去做温度检测了,可是无论如何也不能触发中断,有经验的请指教,先谢谢了。…

查看全部问答>

谁有基于单片机数字电流表的设计报告?

只要电路原理图和c源程序。小弟在这拜谢了! 或者谁能帮我改下这电压表的程序成电流表的程序: #include    unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,             &nbs ...…

查看全部问答>

Pci 网卡驱动

现在要开始搞pci网卡驱动想从Realtek 8139这个入手, 个位有甚么好的建议 linux device driver有個pci_skel框架, 不知道怎麼楊. …

查看全部问答>

深入浅出玩转 FPGA 特权同学的 书

深入浅出玩转 FPGA  特权同学的 书   大家东清楚,不用我介绍了吧!…

查看全部问答>

【号外】STM32F101也有USB

刚做的东西给几个小MM去贴片,把101当103贴上去了,居然USB也可以联机。但操作偶尔有问题,手工复位一般可以解决掉。听小道消息说,101是阉割的103,就像奔腾的cache有瑕疵变成赛扬一样。…

查看全部问答>

分享-最好用的串口终端

Bray++同志写的,俺用了好多年。这是最新版。 Terminal.rar (278.15 KB) 下载次数:190 2010-10-13 20:16 …

查看全部问答>

请教,这个I/O子程序是什么意思?

使能I/O口子程序,在CCS帮助文件中看到对该子程序 GPIO_Handle GPIO_open(   int chaNum,   Uint32 flags ); 的解释是: chaNum        GPIO channel to open: lags     & ...…

查看全部问答>