|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
学习一种模块,有很多种方法,其中一种方式是先去弄明白怎么使用这个模块,亲自体验了这个模块的大体功能之后,再回过头来了解该模块的工作原理,再去深层次的研究该模块。
! l e# A- B5 w6 J6 F/ \$ ]在这里,着重介绍怎么用程序实现RC522模块的一些功能,而RC522的结构,功能等便不再介绍。% e) k7 U5 ]" t* N" [5 b/ v
这个程序的讲解是基于MSP430F149/169单片机的。2 T+ q+ p* d% m, |5 p+ f
0 P" w- O9 E4 S0 W" f! ?
模块使用的是SPI接口,与单片机接口如下:
: s# Q5 F; X2 l8 g. f1 A* H( o' @$ F, F& [4 v' g+ V
#define RF_LPCTL BIT3 // P2.3 射频卡休眠控制------RST 6 E2 w# z8 P( z# r0 g0 M
#define RF_SS BIT7 // p2.7 射频卡从机选择(SS)---SDA
/ S- W) s) U. J#define RF_SCLK BIT6 // p2.6 射频卡数据时钟输出(SCLK)7 }4 _5 |4 }4 K6 {
#define RF_DATA_OUT BIT5 // p2.5 射频卡数据输出(MOSI)) Q e9 f0 E ?. F X
#define RF_DATA_IN BIT1 // p2.1 射频模块输入(MISO)
% F- i* g. L4 F" P2 `; S2 }1 ]( z8 B2 M t7 I4 v+ w
要想对模块内部的数据块进行读写,需要完成4个步骤:寻卡→防冲突→选卡→读/写卡;' Y6 o5 e3 E8 Y! J1 b( e
第一步:寻卡。9 l1 N- y, e3 C6 v. o9 J0 _2 \
status2=PcdRequest(0x52,Temp);////寻卡 参数Temp为返回的卡类型$ B/ \( e$ K# a
if(status2== MI_OK)" _6 O3 r! ~4 L& B
{
$ Z- a) N. L4 P1 C Z& b tochar(Temp[0]);
* o0 A) ? `$ Ktochar(Temp[1]);//输出卡类型
! Y- I% b9 O4 t3 |6 Q, |}
! U1 y$ l* l% B" t0 r其中0x52代表寻天线区内全部卡。
4 p" x" N. c% d2 K: U L; c% c卡类型(TagType):
3 m9 y( T3 c) j) K f5 X6 y9 x9 e0x4400 =Mifare_UltraLight7 Q5 ~0 ]3 N9 @- k& y% D( n9 G9 }
0x0400 =Mifare_One(S50)- X# B; ~ u& @- M2 u, }2 R
0x0200 =Mifare_One(S70)& Q+ {& X( W+ @6 F, ]9 e) Z, F
0x0800 =Mifare_Pro(X)
. h, e, M$ U0 L0x4403 =Mifare_DESFire
3 A1 O" A" ~" W Y$ U比如,当Temp[0]=04,Temp[1]=00时,卡类型为S50。
5 M. q, p8 t* @- e6 F0 c4 p+ C" N0 g
第二步:防冲突。! H+ z/ v: N; M
status2= PcdAnticoll(UID); //防冲撞处理,输出卡片序列号,4字节9 {) m- Z. J- t
if(status2==MI_OK)6 P& i* v& [ ~) n* c; @
{$ b& q, g% R% @% ~5 V
PutString0("Card Id is:");
9 d, S0 a0 O, B/ n) O0 a tochar(UID[0]);
; F3 x0 u: e; H7 v tochar(UID[1]);
H9 `2 \! r# h+ K# _' h/ b tochar(UID[2]);
( d( n; A( R7 Z tochar(UID[3]); //输出卡片序列号0 T$ z$ r& R; m. }2 u! A1 I( f
}
% y( g. }1 D6 k z1 `9 E3 b第三步:选卡。
) u2 S. a7 \" h( M( K/ n8 Z status2= PcdSelect(UID); //选择卡片,输入卡片序列号,4字节# Z4 {$ R& s; w+ F
第四步:在读写卡之前需要先进行认证。9 r# s B6 i, q3 _
status2= PcdAuthState(PICC_AUTHENT1A, 1, Password_Buffer, UID);" Q2 q* b1 L# J2 o* f/ b6 X. B* p
其中四个参数分别代表:验证A密钥+块地址+扇区密码+卡序列号。( Q( o: [3 l8 F0 W0 P, O# K* u* Z
然后进行写操作:# f/ w) V& }' G' d1 N6 S
status2=PcdWrite(1,writeData);//写数据,将数组writeData中的数写入到卡中
" k8 i+ j* p! B0 ?' }, z) h其中第一个参数 1 代表写入的地址为块1./ H. {$ f: |: u
或者进行读卡操作:
* i3 N* s7 f4 z7 o* j7 y. wstatus2 = PcdRead(1, str);//读卡
' o6 a; a! l$ s3 x8 W2 p* X其中第一个参数 1 代表读的地址为块1.
7 h$ A7 y! q3 C% A) _( B读卡后得到的数据存放于数组str中。& z' F$ g1 Z. }& U! T( k1 C
3 T4 N7 p5 C7 L8 a
+ I9 i) c& \/ J2 { i' L至此,已将RC522的基本操作介绍了一遍,明白了以上这些函数,就可以对卡进行一些初步的操作,可以再结合程序研究一下。" z" w6 ^+ i, U) x) O1 i
|
|