最近在弄RFID_RC522_无线射频卡,遇到问题,玩过的大虾帮忙解答下。

2019-08-10 15:53发布

最近捣鼓RFID-RC522,----从某宝上淘来RC522模块和几张S50的卡,在论坛上下载了几个大虾写的RC522的程序研究了几天,遇到了一些问题:

看S50卡的说明书得知:S50有16个扇区,每个扇区有4个块,每块16个字节。
访问一个扇区时需要验证密码A或者B;才能进行操作。
u8 KEY[6]={0xff,0xff,0xff,0xff,0xff,0xff}; 
unsigned char SN[5];  //卡号
问题1:PcdAuthState(0x60,0x09,KEY,SN);   //验证卡片密码 形参参数:验证方式,块地址,密码,卡许列号

        这个函数是验证卡片密码。传的参数里:0X09表示块地址  
0X09代表的是那块的地址?不是有64块么,访问第0块地址应该是0,第一块就1呀。0X09是表示那一块地址?


问题2:
/*************************************************************************
**功    能:写数据到M1卡一块
**参数说明: K:块地址
**          BUF:向块写入的数据,16字节
**返    回: 成功返回MI_OK
*************************************************************************/                  
char Write(u8   K,u8 BUF )

我想向M1卡里的第二个扇区的第0块地址写入16个字节的数据,应该怎么传参数呢?
数组定义为:BUF[16]={9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,};
                  BUF[16]={255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255};
如果写这两个数组里其中一个数组的数据进去能否可行?第会不会越界,装不下?

问题3:
/******************************************************************
**功    能:寻卡
**参数说明: 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(u8   req_code,u8 *pTagType)

这个函数可返回读取的卡片类型,但是我实验了下,发现返回的就是两个字符而已,怎么上面提示的16进制?
把返回的两个字符转化为16进制也对不上上面说的那几个16进制。   问下那个16进制怎么来的?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
24条回答
xiaolong12
1楼-- · 2019-08-11 13:57
回复【7楼】z1234zz:
---------------------------------
写函数的原型
/*************************************************************************
**功    能:写数据到M1卡一块
**参数说明: addr:块地址
**          p:向块写入的数据,16字节
**返    回: 成功返回MI_OK
*************************************************************************/                  
char Write(u8   addr,u8 *p )
{
    char   status;
    u8   unLen;
    u8   i,ucComMF522Buf[MAXRLEN]; 
    
    ucComMF522Buf[0] = ICC_WRITE;// 0xA0 //写块
    ucComMF522Buf[1] = addr;//块地址
    CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
 
    status = cdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

    if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
    {   status = MI_ERR;   }
        
    if (status == MI_OK)
    {
        for (i=0; i<16; i++)//向FIFO写16Byte数据 
        {    
        ucComMF522Buf = *(p +i);   
        }
        CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);

        status = cdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
        if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
        {   status = MI_ERR;   }
    }
    
    return status;
}

我要给扇区2的第1块写入数据,是不是直接传参:char Write(  5 ,buf );  

char buf[16]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

zxz 这样传参数行不行呢?

我写进去了,都出来都是0
z1234zz
2楼-- · 2019-08-11 16:25
回复【7楼】z1234zz:
---------------------------------
大虾-还有一问题:

修改扇区的密码格式是怎么样的?

unsigned char RFID1[16]={0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x07,0x80,0x29,0xff,0xff,0xff,0xff,0xff,0xff};  这样吗?

主要是么有看明白:访问第3块控制区域,的存取控制权限  和修改0,1,2块区域的存取权限  有什么不同?是以前修改还是分开?
xiaolong12
3楼-- · 2019-08-11 20:39
回复【10楼】xiaolong12:
-------------------------------你好,在吗,大神。能不能讲讲怎样修改密匙A密码?
xiaolong12
4楼-- · 2019-08-12 02:29
 精彩回答 2  元偷偷看……
z1234zz
5楼-- · 2019-08-12 06:52
回复【15楼】z1234zz:
---------------------------------
大神.....你好!本人也在调试RC522...没改密码前所有功能都没问题..但是改了密码后就完全读不到了..调试知道是卡在计算CRC16里面,改密码我定义的数组为NEW_KEY[6] = {0XF0,0XFF,0XFF,0XFF,0XFF,0XFF};改完后就出现问题了...后来改为NEW_KEY[16] ={0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x80,0x29,0xfe,0xff,0xff,0xff,0xff,0xff};也还是不行....麻烦请大牛分析下给个建议....
long7qazzaq
6楼-- · 2019-08-12 09:10
回复【14楼】xiaolong12:
---------------------------------
兄弟..改密码的调试好了吗 我也遇到改了密码读不到的情况..要咋么定义修改啊?求请教...

一周热门 更多>