|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
学习一种模块,有很多种方法,其中一种方式是先去弄明白怎么使用这个模块,亲自体验了这个模块的大体功能之后,再回过头来了解该模块的工作原理,再去深层次的研究该模块。
4 H1 w6 O# H) p! _3 {7 @4 F2 E3 H在这里,着重介绍怎么用程序实现RC522模块的一些功能,而RC522的结构,功能等便不再介绍。
; a( k& E8 \7 `) N5 g这个程序的讲解是基于MSP430F149/169单片机的。7 P% S$ e9 F; ^7 | W$ Y
& w; d0 k7 t$ s2 @/ G2 Y
模块使用的是SPI接口,与单片机接口如下:
! g2 w8 z, i# h: T6 j {/ G4 B0 l/ d
#define RF_LPCTL BIT3 // P2.3 射频卡休眠控制------RST 3 M. T6 c& R6 q' c4 s
#define RF_SS BIT7 // p2.7 射频卡从机选择(SS)---SDA
6 ~6 r- t+ o9 K#define RF_SCLK BIT6 // p2.6 射频卡数据时钟输出(SCLK)
& L+ y% J+ Q v# Q3 D d" `: s#define RF_DATA_OUT BIT5 // p2.5 射频卡数据输出(MOSI). q: n7 A6 o+ v! S0 N! Q
#define RF_DATA_IN BIT1 // p2.1 射频模块输入(MISO): J: ^/ @& w1 n4 f1 ]' U+ f
$ x- w. j: O& k. E1 Y+ {
要想对模块内部的数据块进行读写,需要完成4个步骤:寻卡→防冲突→选卡→读/写卡;
: X0 o+ Z( X" W1 ]第一步:寻卡。8 h% n/ m) `' u% @, b! O% _ y
status2=PcdRequest(0x52,Temp);////寻卡 参数Temp为返回的卡类型
) e3 y9 h$ f* \7 m( U; H7 L5 |if(status2== MI_OK)
$ G9 C& ~% v, t" b" g{5 G: ] _9 V" x
tochar(Temp[0]);
- B9 t+ \7 Q4 Y8 G8 V: vtochar(Temp[1]);//输出卡类型& N$ E8 {+ K6 T7 D7 C
}
( h5 m( D( I! s* d- |0 O其中0x52代表寻天线区内全部卡。4 ~+ u& P1 w9 f1 ~/ A& [/ p" p
卡类型(TagType):. q. z7 }9 j$ d5 N6 o3 h
0x4400 =Mifare_UltraLight: G3 a# l$ H8 `- b
0x0400 =Mifare_One(S50)
+ _% S; C) R, ^7 O0x0200 =Mifare_One(S70)/ i$ a: e& n _6 _% r L
0x0800 =Mifare_Pro(X); b- `. ~9 G# c- N
0x4403 =Mifare_DESFire* C; p& A! b5 w5 t3 T7 \
比如,当Temp[0]=04,Temp[1]=00时,卡类型为S50。
1 n/ }# R; e `0 C. z# E2 y7 P. X3 w" D1 z, a7 ^. Q
第二步:防冲突。3 F3 C( j! C5 O+ @9 n
status2= PcdAnticoll(UID); //防冲撞处理,输出卡片序列号,4字节7 r9 ~( {* w# R1 J4 W0 U n
if(status2==MI_OK)
: G7 e- x; o) E. ?6 w7 F2 a {
- w! [& X0 r8 n% x7 b PutString0("Card Id is:");
2 ?, s8 c2 y! e8 ]! k0 g$ s2 g; m tochar(UID[0]);
# k, n/ m) h, x. g tochar(UID[1]);
3 K# `% J9 `5 _) [* K0 b( j8 b c) Q tochar(UID[2]);
# W! v6 W2 {9 L tochar(UID[3]); //输出卡片序列号
- P2 R7 l* h# l. \9 |* w}
2 k b6 \) ^5 j3 l6 I2 x8 h) e, x6 y第三步:选卡。2 b" Q9 c! q V' M/ T+ g
status2= PcdSelect(UID); //选择卡片,输入卡片序列号,4字节0 @! `2 V2 S# C m. {
第四步:在读写卡之前需要先进行认证。) [- r" ~: N. e. v9 B- \
status2= PcdAuthState(PICC_AUTHENT1A, 1, Password_Buffer, UID);
% X3 ^- l7 k( F' A1 ]其中四个参数分别代表:验证A密钥+块地址+扇区密码+卡序列号。
' O+ ^: L% |- |! Q' e5 H: `7 a. c然后进行写操作:7 ^% H8 o: L1 V" S
status2=PcdWrite(1,writeData);//写数据,将数组writeData中的数写入到卡中$ A9 J9 h/ v) o2 u/ \8 K6 H
其中第一个参数 1 代表写入的地址为块1." w Y: D6 R! B3 \' Y
或者进行读卡操作:2 w. U# N2 m9 v6 d' P1 b, ~/ }
status2 = PcdRead(1, str);//读卡
; \) w; b8 z: o' o( s其中第一个参数 1 代表读的地址为块1. " [9 _/ e9 d3 T. r
读卡后得到的数据存放于数组str中。
" |2 s" ]- B" O) \, ~) d- b' C# O0 i
0 w$ W8 m i5 k1 ?至此,已将RC522的基本操作介绍了一遍,明白了以上这些函数,就可以对卡进行一些初步的操作,可以再结合程序研究一下。
! n3 z+ y+ }- }4 J+ o |
|