OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 21169|回复: 31

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

[复制链接]

32

主题

153

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
453
金钱
453
注册时间
2014-11-5
在线时间
0 小时
发表于 2014-12-19 01:40:01 | 显示全部楼层 |阅读模式
5金钱
最近捣鼓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进制怎么来的?

最佳答案

查看完整内容[请看2#楼]

这个函数是验证卡片密码。传的参数里:0X09表示块地址   0X09代表的是那块的地址?不是有64块么,访问第0块地址应该是0,第一块就1呀。0X09是表示那一块地址? 你的卡总共64块,那么地址就是0 - 63,不用考虑扇区,例如,你想读第0块,传入0,想读第4块传入4即可,注意地址是从0开始的 问题2: /************************************************************************* **功    能:写数据到M1卡 ...
酱油团队--
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

头像被屏蔽

65

主题

277

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2013-8-11
在线时间
29 小时
发表于 2014-12-19 01:40:02 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

32

主题

153

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
453
金钱
453
注册时间
2014-11-5
在线时间
0 小时
 楼主| 发表于 2014-12-19 01:40:02 | 显示全部楼层
回复【7楼】z1234zz:
---------------------------------
谢谢啦!问题已经全部解决
酱油团队--
回复

使用道具 举报

32

主题

153

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
453
金钱
453
注册时间
2014-11-5
在线时间
0 小时
 楼主| 发表于 2014-12-19 01:40:02 | 显示全部楼层
回复【13楼】long7qazzaq:
---------------------------------
0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x07,0x80,0x29,0xff,0xff,0xff,0xff,0xff,0xff

这是密码格式/。前面6位是密码A,后六位是密码B  中间4位是控制位。

修改密码和写入数据是一样的,把密码格式写正确,写到控制块就OK了
酱油团队--
回复

使用道具 举报

32

主题

153

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
453
金钱
453
注册时间
2014-11-5
在线时间
0 小时
 楼主| 发表于 2014-12-19 02:22:34 | 显示全部楼层
搞过的大虾解答下呀。在线等等,,,,,
酱油团队--
回复

使用道具 举报

32

主题

153

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
453
金钱
453
注册时间
2014-11-5
在线时间
0 小时
 楼主| 发表于 2014-12-19 03:57:27 | 显示全部楼层
大虾们--都去哪了
酱油团队--
回复

使用道具 举报

32

主题

153

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
453
金钱
453
注册时间
2014-11-5
在线时间
0 小时
 楼主| 发表于 2014-12-19 10:03:51 | 显示全部楼层
写函数的原型
/*************************************************************************
**功    能:写数据到M1卡一块
**参数说明: addr:块地址
**          p:向块写入的数据,16字节
**返    回: 成功返回MI_OK
*************************************************************************/                  
char Write(u8   addr,u8 *p )
{
    char   status;
    u8   unLen;
    u8   i,ucComMF522Buf[MAXRLEN]; 
    
    ucComMF522Buf[0] = PICC_WRITE;// 0xA0 //写块
    ucComMF522Buf[1] = addr;//块地址
    CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
 
    status = PcdComMF522(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 = PcdComMF522(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 这样传参数行不行呢?

酱油团队--
回复

使用道具 举报

32

主题

153

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
453
金钱
453
注册时间
2014-11-5
在线时间
0 小时
 楼主| 发表于 2014-12-19 10:36:32 | 显示全部楼层
回复【4楼】z1234zz:
---------------------------------

0x52或0x26指令读回来的就是卡的类型,返回两个字符是对的,就是卡的类型,一般会是0x0400

问:返回的就是16进制吗?
酱油团队--
回复

使用道具 举报

头像被屏蔽

65

主题

277

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2013-8-11
在线时间
29 小时
发表于 2014-12-19 12:34:19 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

32

主题

153

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
453
金钱
453
注册时间
2014-11-5
在线时间
0 小时
 楼主| 发表于 2014-12-19 12:51:23 | 显示全部楼层
回复【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
酱油团队--
回复

使用道具 举报

32

主题

153

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
453
金钱
453
注册时间
2014-11-5
在线时间
0 小时
 楼主| 发表于 2014-12-19 14:31:42 | 显示全部楼层
回复【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块区域的存取权限  有什么不同?是以前修改还是分开?
酱油团队--
回复

使用道具 举报

头像被屏蔽

65

主题

277

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2013-8-11
在线时间
29 小时
发表于 2014-12-19 16:01:14 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

104

主题

313

帖子

0

精华

高级会员

Rank: 4

积分
893
金钱
893
注册时间
2014-11-13
在线时间
53 小时
发表于 2014-12-27 00:24:51 | 显示全部楼层
回复【10楼】xiaolong12:
-------------------------------你好,在吗,大神。能不能讲讲怎样修改密匙A密码?
回复

使用道具 举报

104

主题

313

帖子

0

精华

高级会员

Rank: 4

积分
893
金钱
893
注册时间
2014-11-13
在线时间
53 小时
发表于 2014-12-27 00:25:12 | 显示全部楼层
回复【11楼】z1234zz:
---------------------------------你好,在吗,大神。能不能讲讲怎样修改密匙A密码
回复

使用道具 举报

头像被屏蔽

65

主题

277

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2013-8-11
在线时间
29 小时
发表于 2014-12-27 09:38:09 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-1-22
在线时间
0 小时
发表于 2015-1-22 15:48:56 | 显示全部楼层
回复【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};也还是不行....麻烦请大牛分析下给个建议....
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-1-22
在线时间
0 小时
发表于 2015-1-22 16:12:13 | 显示全部楼层
回复【14楼】xiaolong12:
---------------------------------
兄弟..改密码的调试好了吗 我也遇到改了密码读不到的情况..要咋么定义修改啊?求请教...
回复

使用道具 举报

头像被屏蔽

65

主题

277

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2013-8-11
在线时间
29 小时
发表于 2015-1-24 09:30:30 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2015-1-25
在线时间
7 小时
发表于 2015-2-7 16:38:02 | 显示全部楼层
我也在做这个,可是移植了ministm32Frbt6的程序,根本就不行,为什么我用的是stm32FRCT6的板子,求指教啊,基本读卡还没有实现啊
专注
回复

使用道具 举报

4

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2014-11-26
在线时间
0 小时
发表于 2015-4-19 16:29:00 | 显示全部楼层
回复【18楼】z1234zz:
---------------------------------
把原来的密码写到验证块中间先通过认证 的意思是写入卡里?
然后再把新的密码写入即可,就是再写一次卡里?
写入执行2次?
回复

使用道具 举报

头像被屏蔽

65

主题

277

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2013-8-11
在线时间
29 小时
发表于 2015-4-21 09:13:56 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

11

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
341
金钱
341
注册时间
2014-6-16
在线时间
43 小时
发表于 2015-4-26 21:14:38 | 显示全部楼层
回复【10楼】xiaolong12:
---------------------------------
我现在遇到了修改扇区密码问题,写进去了,但是读取不出数据了,我只改KeyA的六个字节呀,可以参考你的程序吗?
回复

使用道具 举报

22

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2015-4-20
在线时间
0 小时
发表于 2015-11-29 16:32:51 | 显示全部楼层
回复【9楼】xiaolong12:
---------------------------------回复【2楼】xiaolong12:
------------------------------楼主,我毕业设计准备做这个,能加你QQ交流一下吗
回复

使用道具 举报

5

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2015-3-14
在线时间
33 小时
发表于 2015-12-3 11:27:48 | 显示全部楼层
回复【14楼】xiaolong12:
---------------------------------
楼主你好,我用的模块读卡号读不出来,我复位模块后读寄存器读到的值是不对的,我不知道是读的时序问题还是复位时候写的时序问题,模块是好的。楼主有什么好的测试方法么
回复

使用道具 举报

8

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2015-11-13
在线时间
17 小时
发表于 2015-12-24 11:53:49 | 显示全部楼层
回复【2楼】xiaolong12:
---------------------------------
楼主,RFID-RC522射频卡有搞好吗?能参考一下程序吗?
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2016-5-6
在线时间
0 小时
发表于 2016-5-6 11:44:05 | 显示全部楼层
楼主可以参考下你的程序么
回复

使用道具 举报

0

主题

28

帖子

0

精华

高级会员

Rank: 4

积分
781
金钱
781
注册时间
2014-10-10
在线时间
71 小时
发表于 2016-5-6 16:37:21 | 显示全部楼层
学习了,跟楼主有同样的疑惑,谢谢各位!
人生最大的差距是勤奋的差距,人生最大的遗憾是勤奋不够!
回复

使用道具 举报

0

主题

13

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2016-5-17
在线时间
8 小时
发表于 2016-5-31 15:46:17 | 显示全部楼层
好东西啊啊啊
回复

使用道具 举报

翔禹studio 该用户已被删除
发表于 2017-5-16 10:05:21 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

4

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-5-10
在线时间
21 小时
发表于 2017-6-2 17:53:03 | 显示全部楼层
z1234zz 发表于 2014-12-19 01:40
这个函数是验证卡片密码。传的参数里:0X09表示块地址 &nbsp;
0X09代表的是那块的地址?不是有64块 ...

关于PcdRead(addr,data); 这里的地址还是没搞明白啊。
为什么我给0x08的时候就可以读成功 给别的就不好使,这里的地址到底应该给什么格式的?
0x08 我读出来的16字节 0.
回复

使用道具 举报

4

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-5-10
在线时间
21 小时
发表于 2017-6-2 18:07:15 | 显示全部楼层
本帖最后由 464893214 于 2017-6-2 18:09 编辑
464893214 发表于 2017-6-2 17:53
关于PcdRead(addr,data); 这里的地址还是没搞明白啊。
为什么我给0x08的时候就可以读成功 给别的就不好 ...

刚才试了一下循环,除了 8 10 也能读出来 内容也全是 0
试了三张S50的卡 都一个结果,感觉不太对吧。
回复

使用道具 举报

1

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2017-7-22
在线时间
20 小时
发表于 2017-10-31 18:17:58 | 显示全部楼层
终于能看懂问题了,前几天看到了没在一起,今天看到才知道好东西啊
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 09:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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