|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
学习一种模块,有很多种方法,其中一种方式是先去弄明白怎么使用这个模块,亲自体验了这个模块的大体功能之后,再回过头来了解该模块的工作原理,再去深层次的研究该模块。
$ w0 F/ `; @+ `- ]在这里,着重介绍怎么用程序实现RC522模块的一些功能,而RC522的结构,功能等便不再介绍。- r( }5 F3 L2 a( J: x
这个程序的讲解是基于MSP430F149/169单片机的。
( U( d% z; w- H1 Z2 d- G
2 z5 [7 |% e% R0 V/ ?模块使用的是SPI接口,与单片机接口如下:
, Z$ c: L+ c) A- k0 ]6 l" U: D+ o
4 K8 z2 S2 D4 s+ r. j2 D5 u. V#define RF_LPCTL BIT3 // P2.3 射频卡休眠控制------RST
, x8 r n1 l: L. D. w- ~3 u$ W#define RF_SS BIT7 // p2.7 射频卡从机选择(SS)---SDA/ J" i' b7 T# a3 r; @# d
#define RF_SCLK BIT6 // p2.6 射频卡数据时钟输出(SCLK)
# I' | ]+ Y+ \7 e* t: n#define RF_DATA_OUT BIT5 // p2.5 射频卡数据输出(MOSI)
P$ ?" w) I; }7 W$ y- ]2 e#define RF_DATA_IN BIT1 // p2.1 射频模块输入(MISO)
5 |7 k* U7 u0 d& Q% \' P: @
" [- ]; \5 `- r( R" ?要想对模块内部的数据块进行读写,需要完成4个步骤:寻卡→防冲突→选卡→读/写卡;9 Z/ s2 O0 U+ V7 C
第一步:寻卡。 {9 S0 S5 t- j: k: {6 y% a
status2=PcdRequest(0x52,Temp);////寻卡 参数Temp为返回的卡类型
0 V- R+ h& u3 \. w8 Zif(status2== MI_OK)' Q/ x# r- e7 \
{& r. i/ l2 l+ c, e$ R5 ?( K
tochar(Temp[0]);
: V" r( d7 r! n: s/ T$ ktochar(Temp[1]);//输出卡类型
* ~2 X1 v9 |( G: a& y}
# z1 v6 T# i% o _其中0x52代表寻天线区内全部卡。
! v: v. u- x% |" f卡类型(TagType):
( w) l% S3 j' y0 `9 K$ i) @0x4400 =Mifare_UltraLight
7 c& t+ _2 s+ P! ~ O, V0x0400 =Mifare_One(S50)
$ W2 l- U, {8 C( E( Z. |" i0 [0x0200 =Mifare_One(S70)- s. t# @# w) P Y! B2 T6 ]
0x0800 =Mifare_Pro(X)% s B/ G- ^. }3 I! v) x! `& C3 ^
0x4403 =Mifare_DESFire7 a2 a5 X+ n; k( Z f
比如,当Temp[0]=04,Temp[1]=00时,卡类型为S50。: e J9 B: g. ?+ j
6 i0 J7 H& k+ b' i
第二步:防冲突。
& ~% m) K0 `, H status2= PcdAnticoll(UID); //防冲撞处理,输出卡片序列号,4字节% b# d( E6 k- u+ M& {1 N
if(status2==MI_OK)3 y& j: l1 @" U7 o
{
; E' _, i9 @ n5 b" ~7 T7 y PutString0("Card Id is:");
6 o. v, Q5 D% D4 \, k7 a tochar(UID[0]); {8 h* Z# t! ]! w K. x
tochar(UID[1]);# G: j8 I4 U/ ^8 R# [2 i, U$ R% q
tochar(UID[2]);- z6 e* q) _3 K
tochar(UID[3]); //输出卡片序列号( v( S8 l& [7 }/ {$ O3 @* t9 l
}
( | {' a2 c5 B1 v第三步:选卡。
; i1 s5 {: s) w( C2 E, ? status2= PcdSelect(UID); //选择卡片,输入卡片序列号,4字节* @- Y$ C! M0 [* M( W, j# I
第四步:在读写卡之前需要先进行认证。/ g: o! o \: i9 A+ D! m
status2= PcdAuthState(PICC_AUTHENT1A, 1, Password_Buffer, UID);9 [7 `2 Q7 ]2 z
其中四个参数分别代表:验证A密钥+块地址+扇区密码+卡序列号。
, p7 T/ E" m9 g7 b2 Y然后进行写操作:) V4 _3 b. a V0 g' G! I
status2=PcdWrite(1,writeData);//写数据,将数组writeData中的数写入到卡中0 [' z) [& {9 K3 ^/ L
其中第一个参数 1 代表写入的地址为块1.
c. X# X3 @4 b1 @# r或者进行读卡操作:
! O+ h9 D8 S3 o2 b! sstatus2 = PcdRead(1, str);//读卡* X" v) e) Q7 K9 X8 t. V* I) {
其中第一个参数 1 代表读的地址为块1. 9 I; V/ h. G0 [8 I% o, u. r
读卡后得到的数据存放于数组str中。
. d. V3 z- D9 G* h8 c6 A1 ^- a+ J7 A4 b5 u; s! B8 A4 `/ X" `5 {
" u- O: {) S4 X3 m- c; W至此,已将RC522的基本操作介绍了一遍,明白了以上这些函数,就可以对卡进行一些初步的操作,可以再结合程序研究一下。# j, O4 Q- G4 N) B2 @4 {2 s
|
|