|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
学习一种模块,有很多种方法,其中一种方式是先去弄明白怎么使用这个模块,亲自体验了这个模块的大体功能之后,再回过头来了解该模块的工作原理,再去深层次的研究该模块。; ?' E6 q* k4 t- s* D
在这里,着重介绍怎么用程序实现RC522模块的一些功能,而RC522的结构,功能等便不再介绍。- \! `6 K; k; x' F# l2 d' X K. f- s
这个程序的讲解是基于MSP430F149/169单片机的。
# B4 w& U$ i5 Y9 ~5 s* D! R2 n# r/ _
7 ?1 e: V! y7 ]: r I模块使用的是SPI接口,与单片机接口如下:8 F: N) ^: |2 y1 S) n$ t2 U
3 _* R( O6 V/ f) S+ C
#define RF_LPCTL BIT3 // P2.3 射频卡休眠控制------RST 2 `6 V4 D( R1 D; G9 }
#define RF_SS BIT7 // p2.7 射频卡从机选择(SS)---SDA' n& q9 u' l8 o+ R3 \) o
#define RF_SCLK BIT6 // p2.6 射频卡数据时钟输出(SCLK)$ E$ ` Y% m) O5 a; m& X0 P1 q+ @
#define RF_DATA_OUT BIT5 // p2.5 射频卡数据输出(MOSI)- v; J2 c$ G- ~' |1 m# Y
#define RF_DATA_IN BIT1 // p2.1 射频模块输入(MISO)' L+ t; V- D A
L: M0 |& F; a% c; _# f8 \! h6 g2 K
要想对模块内部的数据块进行读写,需要完成4个步骤:寻卡→防冲突→选卡→读/写卡;
! s, [, B7 N% S( i2 `( @6 y- X第一步:寻卡。6 I V+ W- V5 r4 g* Y* \ j
status2=PcdRequest(0x52,Temp);////寻卡 参数Temp为返回的卡类型
( c# \1 k! ~8 k2 O7 t4 tif(status2== MI_OK)
1 {9 _) c+ f, a) Y# f' h{
# f7 d" d! V' d7 ~( k+ Q tochar(Temp[0]);/ W! N* l1 \; G' V; o. p" Y: p; y, C2 }
tochar(Temp[1]);//输出卡类型7 P+ q; Y0 V9 _9 I& V/ ]' ~
}0 C# l$ Y0 G- s# ]5 C0 J( P
其中0x52代表寻天线区内全部卡。
: ?6 _# Q: A; G3 G: q% m3 D/ [# T卡类型(TagType):
7 L3 Z# O+ E4 s0x4400 =Mifare_UltraLight2 e: b: w7 j F5 D
0x0400 =Mifare_One(S50): v H' u- d( A! ?1 A
0x0200 =Mifare_One(S70)
- U" j/ p1 m6 f0 o b+ u0x0800 =Mifare_Pro(X)
7 r) l$ ~" o% e9 l! X6 j1 @; \0x4403 =Mifare_DESFire4 }- a$ e* u. z3 ?( g
比如,当Temp[0]=04,Temp[1]=00时,卡类型为S50。3 f/ M+ U/ A6 T/ K; S$ m
) q2 z% Q7 H# W9 L
第二步:防冲突。
. I* Z1 J- }) U, ]/ V& c) K status2= PcdAnticoll(UID); //防冲撞处理,输出卡片序列号,4字节4 `; U/ |6 d6 K/ I3 r8 m" F
if(status2==MI_OK)
+ s4 N( x' a$ C8 N, z: _2 |1 c {5 T( Y+ V5 s1 y3 b8 B9 o8 |9 ]
PutString0("Card Id is:");4 G6 v6 x' l8 F F6 Q) I9 T/ T
tochar(UID[0]);8 s S" z" B! M
tochar(UID[1]);) \" |( R: Y6 |. |. H! X- s5 |$ c
tochar(UID[2]);& }5 j9 [/ H0 p% G
tochar(UID[3]); //输出卡片序列号. y& }5 V! s0 f! h, _9 W
}
6 S* V" y% i+ f, Z* A第三步:选卡。- j; t5 b- m" N$ j
status2= PcdSelect(UID); //选择卡片,输入卡片序列号,4字节
* z' }5 W) i0 ^ r第四步:在读写卡之前需要先进行认证。
( }7 h5 \# H& D0 v: ^1 z status2= PcdAuthState(PICC_AUTHENT1A, 1, Password_Buffer, UID);! E! A" Y/ w8 D
其中四个参数分别代表:验证A密钥+块地址+扇区密码+卡序列号。6 B$ I& \; ]# k% e
然后进行写操作:
, ?# |" H" s8 ?, A! xstatus2=PcdWrite(1,writeData);//写数据,将数组writeData中的数写入到卡中
4 N9 V4 a. L- W2 y+ k其中第一个参数 1 代表写入的地址为块1.- Z! T# {! j5 ^5 v: U) v
或者进行读卡操作:, Q; W4 L% ]1 e5 @! W' }
status2 = PcdRead(1, str);//读卡( D+ {* i3 p& k; h$ x
其中第一个参数 1 代表读的地址为块1.
' A4 T" t) P/ W6 f8 P" t* P% q读卡后得到的数据存放于数组str中。5 A) q6 _7 b$ C
, N# o' b, o" }; h; ?$ [
- Q: a& ^2 L6 Z* S4 h" J至此,已将RC522的基本操作介绍了一遍,明白了以上这些函数,就可以对卡进行一些初步的操作,可以再结合程序研究一下。& d8 R a: A/ j# V; p
|
|