|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
学习一种模块,有很多种方法,其中一种方式是先去弄明白怎么使用这个模块,亲自体验了这个模块的大体功能之后,再回过头来了解该模块的工作原理,再去深层次的研究该模块。1 ^& r1 u! ]! Q; p; p$ f
在这里,着重介绍怎么用程序实现RC522模块的一些功能,而RC522的结构,功能等便不再介绍。8 U. w* V+ }4 T
这个程序的讲解是基于MSP430F149/169单片机的。
' ?, b$ |- A, _2 |6 D& B4 B) h! e+ O
模块使用的是SPI接口,与单片机接口如下:
4 Y O$ t+ T a. r& z$ G. m* A) K5 B$ b9 e) W' L* n( f# }9 I
#define RF_LPCTL BIT3 // P2.3 射频卡休眠控制------RST
; C/ H8 _ W9 D& Y6 M#define RF_SS BIT7 // p2.7 射频卡从机选择(SS)---SDA5 m, ^1 S% v* A2 V5 F0 \
#define RF_SCLK BIT6 // p2.6 射频卡数据时钟输出(SCLK)2 w0 |) I! `$ T q1 B
#define RF_DATA_OUT BIT5 // p2.5 射频卡数据输出(MOSI)
% i/ Y; ?- _5 f: ^6 V' v2 d3 |$ w#define RF_DATA_IN BIT1 // p2.1 射频模块输入(MISO)
" J ^- g8 A2 x+ M x# q
4 q$ O* N' G, S4 m! h! u要想对模块内部的数据块进行读写,需要完成4个步骤:寻卡→防冲突→选卡→读/写卡;
, g& U$ ?! `! e5 `1 v第一步:寻卡。( M" C* R7 v! z
status2=PcdRequest(0x52,Temp);////寻卡 参数Temp为返回的卡类型
6 q- v/ v3 B1 z8 [& Z1 ~' zif(status2== MI_OK)
* ^7 |$ P' E9 c% Y% `" I: m{
- W1 Z% x- L+ b# m6 I% @- U1 q9 e6 |# ~: c tochar(Temp[0]);# S/ b/ o6 |1 _, u& T
tochar(Temp[1]);//输出卡类型
/ F) ]+ a" T( k5 l9 Q y}. M. y$ F2 d/ y" `/ _7 N$ _: i
其中0x52代表寻天线区内全部卡。* o+ i- ]9 A! J" D {8 t+ W! m
卡类型(TagType):
* T! V- S6 k& x: L1 {) |4 G0x4400 =Mifare_UltraLight
2 T8 b# q, K8 H X& g0x0400 =Mifare_One(S50)
, N0 }( _5 M5 s# q: Q0x0200 =Mifare_One(S70)& t) ?( J0 r5 v; x5 ^% g( P
0x0800 =Mifare_Pro(X)6 }! s1 }% J' H" E' }8 x# d! n
0x4403 =Mifare_DESFire0 V, F8 R# ]' [; S
比如,当Temp[0]=04,Temp[1]=00时,卡类型为S50。
$ T' E/ v# w: e L, u% n& D' \- c3 x" p" E+ B! W
第二步:防冲突。
9 z" j, I, t; P: p1 m8 s Q) d status2= PcdAnticoll(UID); //防冲撞处理,输出卡片序列号,4字节
$ k8 ~2 y9 { S/ Y7 k8 P if(status2==MI_OK): Y6 J! E6 O7 N" N$ Y3 j6 j
{
7 j$ C7 W5 P9 `6 [0 T7 T5 _- c PutString0("Card Id is:");
! K( p+ L( q( O; g( a tochar(UID[0]);5 `3 R/ ]9 x3 R8 a( F* e3 z8 m; g
tochar(UID[1]);* B1 V* d+ U m0 w9 c7 K
tochar(UID[2]);0 V6 Y M9 @, y8 N9 K
tochar(UID[3]); //输出卡片序列号) B( `0 I {: E2 r$ \1 u
}
7 w F1 l7 m+ e# g' S: `" _ R第三步:选卡。8 g2 a$ J& d' T: `: v- Q& J
status2= PcdSelect(UID); //选择卡片,输入卡片序列号,4字节9 s: h( d1 q0 @% ]4 J5 U
第四步:在读写卡之前需要先进行认证。) }% A0 ^' |3 m7 A5 K% n& u( L3 p; g
status2= PcdAuthState(PICC_AUTHENT1A, 1, Password_Buffer, UID);- N8 m% S' J& p# x, v
其中四个参数分别代表:验证A密钥+块地址+扇区密码+卡序列号。
1 w) q5 Q- P0 J: w然后进行写操作:
& Z- ^' K1 c! H6 H! a+ `status2=PcdWrite(1,writeData);//写数据,将数组writeData中的数写入到卡中! Q2 J7 b) a; s& f
其中第一个参数 1 代表写入的地址为块1.: i/ h$ @# ]- `7 y/ j; f8 m" H9 w2 D
或者进行读卡操作:
, c/ P: w8 j6 w4 L$ ~& qstatus2 = PcdRead(1, str);//读卡; q+ g, M2 h2 o3 l+ j
其中第一个参数 1 代表读的地址为块1. + _/ Y1 N4 B: _! H' m+ ]4 Z
读卡后得到的数据存放于数组str中。, Z, L1 R- V% F/ [
8 s& F7 R! ^, ?4 T
5 e- q1 }+ Q9 ^) l5 o& D至此,已将RC522的基本操作介绍了一遍,明白了以上这些函数,就可以对卡进行一些初步的操作,可以再结合程序研究一下。7 Z9 o6 h& ^7 ^; B& e$ Y
|
|