|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
学习一种模块,有很多种方法,其中一种方式是先去弄明白怎么使用这个模块,亲自体验了这个模块的大体功能之后,再回过头来了解该模块的工作原理,再去深层次的研究该模块。/ t q$ a! j6 H0 h
在这里,着重介绍怎么用程序实现RC522模块的一些功能,而RC522的结构,功能等便不再介绍。 C- d1 I8 M- q; G F! W
这个程序的讲解是基于MSP430F149/169单片机的。
- h8 H) b: I+ F6 S& n4 p% P* L4 O+ z0 P7 Z: h. {( ]% W
模块使用的是SPI接口,与单片机接口如下:
4 x' w) o* O7 O0 t9 @
6 b1 Z7 ^+ ]: ?$ h+ q8 Z, I6 _0 ^#define RF_LPCTL BIT3 // P2.3 射频卡休眠控制------RST 6 g9 }( f& J/ r% M U* W9 G; D. a; F
#define RF_SS BIT7 // p2.7 射频卡从机选择(SS)---SDA
7 p) j5 J! B- y) {7 H#define RF_SCLK BIT6 // p2.6 射频卡数据时钟输出(SCLK)
5 o9 B) H# }- D1 Q#define RF_DATA_OUT BIT5 // p2.5 射频卡数据输出(MOSI)* \# I. D2 Z$ U$ w
#define RF_DATA_IN BIT1 // p2.1 射频模块输入(MISO)
; X o: r7 i; H# Y, ^& |9 {4 R1 j/ C0 J: a
要想对模块内部的数据块进行读写,需要完成4个步骤:寻卡→防冲突→选卡→读/写卡;* v0 Y' l2 a# x3 x* r7 x: \1 Q
第一步:寻卡。* u8 ]4 H* S% L L: G
status2=PcdRequest(0x52,Temp);////寻卡 参数Temp为返回的卡类型
, o4 [2 {# t% w' k4 C- }if(status2== MI_OK)( `* _3 ?0 n; h' G
{4 U1 b3 ~9 ~& h: \5 z3 S$ @
tochar(Temp[0]);
% e# ~, ?9 {' ~& a+ ztochar(Temp[1]);//输出卡类型
7 x; ]4 i# G: q+ R}
. E% A, }- ~8 H* j3 a/ m其中0x52代表寻天线区内全部卡。6 v4 ^+ g* N* n8 Z0 n$ ^
卡类型(TagType):: l5 P* R8 V/ g
0x4400 =Mifare_UltraLight
0 l. z" F* i$ n* I$ q2 A0x0400 =Mifare_One(S50)
6 ^0 a! U, J0 b# i' n! q0x0200 =Mifare_One(S70)3 B( K* q; I2 r& ?) c3 F
0x0800 =Mifare_Pro(X)) G# u4 I! f k3 }- V
0x4403 =Mifare_DESFire+ C, v$ s j$ |5 A% p
比如,当Temp[0]=04,Temp[1]=00时,卡类型为S50。
$ d1 a% m/ N7 Q- g: Y: B8 i
7 Z |# N. d6 l* _2 k第二步:防冲突。
1 D- R- Q8 l5 D status2= PcdAnticoll(UID); //防冲撞处理,输出卡片序列号,4字节8 {+ \' J. F6 \
if(status2==MI_OK)* B2 b4 l- m0 d6 S( R9 O; i
{
0 r( g$ x% G4 U8 I PutString0("Card Id is:");! D2 E6 y) j0 k, h A9 J
tochar(UID[0]);
( G+ W- A: {! Q& S; V; t tochar(UID[1]);
: q) E- `* [& l; y% E8 e" C tochar(UID[2]);$ c- o$ M7 J; [! P% v
tochar(UID[3]); //输出卡片序列号- G8 F- f3 H, p, c
}
" ^+ E2 `9 O( {6 U C第三步:选卡。
0 O4 c- ~2 P- n: _- k, g status2= PcdSelect(UID); //选择卡片,输入卡片序列号,4字节7 _4 _7 h3 }8 I) O. ?5 K7 P3 O
第四步:在读写卡之前需要先进行认证。- L! `3 ]8 I* C0 }
status2= PcdAuthState(PICC_AUTHENT1A, 1, Password_Buffer, UID);, `5 \; ~/ c% ^! Y# P7 ^0 O! J
其中四个参数分别代表:验证A密钥+块地址+扇区密码+卡序列号。
) u5 C y Z: r7 |然后进行写操作:+ p6 v' \! q: K9 M! B
status2=PcdWrite(1,writeData);//写数据,将数组writeData中的数写入到卡中
5 K2 V' y3 [( G* Q5 l* w/ g其中第一个参数 1 代表写入的地址为块1.! ?$ g0 T+ K3 c) |6 a9 z
或者进行读卡操作:
7 c2 l6 s) Z1 \3 astatus2 = PcdRead(1, str);//读卡
& g# r- b4 F* b- ?6 R3 c6 X其中第一个参数 1 代表读的地址为块1. 3 Y' L) i" f H+ x9 N
读卡后得到的数据存放于数组str中。- l% @/ M! P6 H4 v! D
2 A4 d" U7 w7 S% ~5 Q3 L C5 t9 @ W! C
至此,已将RC522的基本操作介绍了一遍,明白了以上这些函数,就可以对卡进行一些初步的操作,可以再结合程序研究一下。
4 S) n5 k V* Z5 q- S |
|