13.56M读卡器开发详解二(RC522驱动程序)_第1页
13.56M读卡器开发详解二(RC522驱动程序)_第2页
13.56M读卡器开发详解二(RC522驱动程序)_第3页
13.56M读卡器开发详解二(RC522驱动程序)_第4页
13.56M读卡器开发详解二(RC522驱动程序)_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

wordword/word1.

硬件接口介绍根据上一篇的介绍,小编使用了RC522的SPI口通信方式和51单片机进展通信。硬件接口设计此处不再附图。只是将接口配置列写如下:sbit

spi_cs=P1^6;sbit

spi_ck=P1^5;sbit

spi_mosi=P1^4;sbit

spi_miso=P1^3;sbit

spi_rst=P1^2;

#define

SET_SPI_CS

spi_cs=1#define

CLR_SPI_CS

spi_cs=0#define

SET_SPI_CK

spi_ck=1#define

CLR_SPI_CK

spi_ck=0#define

SET_SPI_MOSI

spi_mosi=1#define

CLR_SPI_MOSI

spi_mosi=0#define

STU_SPI_MISO

spi_miso#define

SET_RC522RST

spi_rst=1#define

CLR_RC522RST

spi_rst=0

2.

51单片机模拟SPI通信函数

void

delay_ns(unsigned

int

data

ns){

unsigned

int

xdata

i;

for(i=0;i

{

nop();

nop();

nop();

}}

unsigned

char

SPIReadByte(void){

unsigned

char

idata

SPICount;

//

Counter

used

to

clock

out

the

data

unsigned

char

idata

SPIData;

SPIData

=

0;

for

(SPICount

=

0;

SPICount

<

8;

SPICount++)

//

Prepare

to

clock

in

the

data

to

be

read

{

SPIData

<<=1;

//

Rotate

the

data

CLR_SPI_CK;

nop();nop();

//

Raise

the

clock

to

clock

the

data

out

of

the

MAX7456

if(STU_SPI_MISO)

{

SPIData|=0x01;

}

SET_SPI_CK;

nop();nop();

//

Drop

the

clock

ready

for

the

next

bit

}

//

and

loop

back

return

(SPIData);

//

Finally

return

the

read

data}

void

SPIWriteByte(unsigned

char

data

SPIData){

unsigned

char

idata

SPICount;

//

Counter

used

to

clock

out

the

data

for

(SPICount

=

0;

SPICount

<

8;

SPICount++)

{

if

(SPIData

&

0x80)

{

SET_SPI_MOSI;

}

else

{

CLR_SPI_MOSI;

}

nop();nop();

CLR_SPI_CK;nop();nop();

SET_SPI_CK;nop();nop();

SPIData

<<=

1;

}

}

3.RC522芯片的存放器、命令字等定义

这些宏定义都是根据RC522数据手册编写的代码。

3.2.

RC522存放器地址定义

4.

Rc522的14443协议代码驱动程序

char

PcdRequest(unsigned

char

data

req_code,unsigned

char

*pTagType){

char

idata

status;

unsigned

int

idata

unLen;unsigned

char

xdata

ucMF522Buf[MAXRLEN];

ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x07);SetBitMask(TxControlReg,0x03);

ucMF522Buf[0]

=

req_code;

status

=

PcdMF522(PCD_TRANSCEIVE,ucMF522Buf,1,ucMF522Buf,&unLen);

if

((status

==

MI_OK)

&&

(unLen

==

0x10)){

*pTagType

=

ucMF522Buf[0];*(pTagType+1)

=

ucMF522Buf[1];}else{

status

=

MI_ERR;

}

return

status;}

char

PcdAnticoll(unsigned

char

*pSnr){

char

xdata

status;

unsigned

char

xdata

i,snr_check=0;

unsigned

int

xdata

unLen;

unsigned

char

xdata

ucMF522Buf[MAXRLEN];

ClearBitMask(Status2Reg,0x08);

WriteRawRC(BitFramingReg,0x00);

ClearBitMask(CollReg,0x80);

ucMF522Buf[0]

=

PICC_ANTICOLL1;

ucMF522Buf[1]

=

0x20;

status

=

PcdMF522(PCD_TRANSCEIVE,ucMF522Buf,2,ucMF522Buf,&unLen);

if

(status

==

MI_OK)

{

for

(i=0;

i<4;

i++)

{

*(pSnr+i)

=

ucMF522Buf[i];

snr_check

^=

ucMF522Buf[i];

}

if

(snr_check

!=

ucMF522Buf[i])

{

status

=

MI_ERR;

}

}

SetBitMask(CollReg,0x80);

return

status;}

char

PcdSelect(unsigned

char

*pSnr){

char

xdata

status;

unsigned

char

xdata

i;

unsigned

int

xdata

unLen;

unsigned

char

xdata

ucMF522Buf[MAXRLEN];

ucMF522Buf[0]

=

PICC_ANTICOLL1;

ucMF522Buf[1]

=

0x70;

ucMF522Buf[6]

=

0;

for

(i=0;

i<4;

i++)

{

ucMF522Buf[i+2]

=

*(pSnr+i);

ucMF522Buf[6]

^=

*(pSnr+i);

}

CalulateCRC(ucMF522Buf,7,&ucMF522Buf[7]);

ClearBitMask(Status2Reg,0x08);

status

=

PcdMF522(PCD_TRANSCEIVE,ucMF522Buf,9,ucMF522Buf,&unLen);

if

((status

==

MI_OK)

&&

(unLen

==

0x18))

{

status

=

MI_OK;

}

else

{

status

=

MI_ERR;

}

return

status;}

char

PcdAuthState(unsigned

char

data

auth_mode,unsigned

char

data

addr,unsigned

char

*pKey,unsigned

char

*pSnr){

char

xdata

status;

unsigned

int

xdata

unLen;

unsigned

char

xdata

i,ucMF522Buf[MAXRLEN];

ucMF522Buf[0]

=

auth_mode;

ucMF522Buf[1]

=

addr;

for

(i=0;

i<6;

i++)

{

ucMF522Buf[i+2]

=

*(pKey+i);

}

for

(i=0;

i<6;

i++)

{

ucMF522Buf[i+8]

=

*(pSnr+i);

}

//

memcpy(&ucMF522Buf[2],

pKey,

6);

//

memcpy(&ucMF522Buf[8],

pSnr,

4);

status

=

PcdMF522(PCD_AUTHENT,ucMF522Buf,12,ucMF522Buf,&unLen);

if

((status

!=

MI_OK)

||

(!(ReadRawRC(Status2Reg)

&

0x08)))

{

status

=

MI_ERR;

}

return

status;}M1卡一块数据

char

PcdRead(unsigned

char

data

addr,unsigned

char

*pData){

char

idata

status;

unsigned

int

idata

unLen;

unsigned

char

idata

i,ucMF522Buf[MAXRLEN];

ucMF522Buf[0]

=

PICC_READ;

ucMF522Buf[1]

=

addr;

CalulateCRC(ucMF522Buf,2,&ucMF522Buf[2]);

status

=

PcdMF522(PCD_TRANSCEIVE,ucMF522Buf,4,ucMF522Buf,&unLen);

if

((status

==

MI_OK)

&&

(unLen

==

0x90))

//

{

memcpy(pData,

ucMF522Buf,

16);

}

{

for

(i=0;

i<16;

i++)

{

*(pData+i)

=

ucMF522Buf[i];

}

}

else

{

status

=

MI_ERR;

}

return

status;}M1卡一块

char

PcdWrite(unsigned

char

data

addr,unsigned

char

*pData){

char

idata

status;

unsigned

int

idata

unLen;

unsigned

char

idata

ucMF522Buf[MAXRLEN];

ucMF522Buf[0]

=

PICC_WRITE;

ucMF522Buf[1]

=

addr;

CalulateCRC(ucMF522Buf,2,&ucMF522Buf[2]);

status

=

PcdMF522(PCD_TRANSCEIVE,ucMF522Buf,4,ucMF522Buf,&unLen);

if

((status

!=

MI_OK)

||

(unLen

!=

4)

||

((ucMF522Buf[0]

&

0x0F)

!=

0x0A))

{

status

=

MI_ERR;

}

if

(status

==

MI_OK)

{

memcpy(ucMF522Buf,

pData,

16);

//

for

(i=0;

i<16;

i++)

//

{

//

ucMF522Buf[i]

=

*(pData+i);

//

}

CalulateCRC(ucMF522Buf,16,&ucMF522Buf[16]);

status

=

PcdMF522(PCD_TRANSCEIVE,ucMF522Buf,18,ucMF522Buf,&unLen);

if

((status

!=

MI_OK)

||

(unLen

!=

4)

||

((ucMF522Buf[0]

&

0x0F)

!=

0x0A))

{

status

=

MI_ERR;

}

}

return

status;}

char

PcdHalt(void){

char

idata

status;

unsigned

int

idata

unLen;

unsigned

char

idata

ucMF522Buf[MAXRLEN];

ucMF522Buf[0]

=

PICC_HALT;

ucMF522Buf[1]

=

0;

CalulateCRC(ucMF522Buf,2,&ucMF522Buf[2]);

status

=

PcdMF522(PCD_TRANSCEIVE,ucMF522Buf,4,ucMF522Buf,&unLen);

return

MI_OK;}

RC522计算CRC16

void

CalulateCRC(unsigned

char

*pIndata,unsigned

char

data

len,unsigned

char

*pOutData){

unsigned

char

idata

i,n;

ClearBitMask(DivIrqReg,0x04);

WriteRawRC(mandReg,PCD_IDLE);

SetBitMask(FIFOLevelReg,0x80);

for

(i=0;

i

{

WriteRawRC(FIFODataReg,

*(pIndata+i));

}

WriteRawRC(mandReg,

PCD_CALCCRC);

i

=

0xFF;

do

{

n

=

ReadRawRC(DivIrqReg);

i--;

}

while

((i!=0)

&&

!(n&0x04));

pOutData[0]

=

ReadRawRC(CRCResultRegL);

pOutData[1]

=

ReadRawRC(CRCResultRegM);}

复位RC522

char

PcdReset(void){//PORTD|=(1<<RC522RST);SET_RC522RST;

delay_ns(10);//PORTD&=~(1<<RC522RST);CLR_RC522RST;

delay_ns(10);//PORTD|=(1<<RC522RST);SET_RC522RST;

delay_ns(10);

WriteRawRC(mandReg,PCD_RESETPHASE);

delay_ns(10);

WriteRawRC(ModeReg,0x3D);

//ºÍMifare¿¨Í¨Ñ¶£¬CRC³õʼֵ0x6363

WriteRawRC(TReloadRegL,30);

WriteRawRC(TReloadRegH,0);

WriteRawRC(TModeReg,0x8D);

WriteRawRC(TPrescalerReg,0x3E);

WriteRawRC(TxAutoReg,0x40);//±ØÐëÒª

return

MI_OK;}

设置RC522工作方式

char

M500PcdConfigISOType(unsigned

char

data

type){

if

(type

==

'A')

//ISO14443_A

{

ClearBitMask(Status2Reg,0x08);

WriteRawRC(ModeReg,0x3D);//3F

WriteRawRC(RxSelReg,0x86);//84

WriteRawRC(RFCfgReg,0x7F);

//4F

WriteRawRC(TReloadRegL,30);//tmoLength);//

TReloadVal

=

'h6a

=tmoLength(dec)

WriteRawRC(TReloadRegH,0);

WriteRawRC(TModeReg,0x8D);

WriteRawRC(TPrescalerReg,0x3E);

delay_ns(1000);

PcdAntennaOn();

}

else{

return

-1;

}

return

MI_OK;}

读RC522存放器

unsigned

char

ReadRawRC(unsigned

char

data

Address){

unsigned

char

xdata

ucAddr;

unsigned

char

xdata

ucResult=0;CLR_SPI_CS;

ucAddr

=

((Address<<1)&0x7E)|0x80;

SPIWriteByte(ucAddr);ucResult=SPIReadByte();SET_SPI_CS;

return

ucResult;}

写RC522存放器

void

WriteRawRC(unsigned

char

data

Address,

unsigned

char

data

value){

unsigned

char

xdata

ucAddr;

CLR_SPI_CS;

ucAddr

=

((Address<<1)&0x7E);

SPIWriteByte(ucAddr);SPIWriteByte(value);SET_SPI_CS;}

置和清RC522存放器位

RC522与ISO14443卡通讯

char

PcdMF522(unsigned

char

data

mand,

unsigned

char

*pInData,

unsigned

char

data

InLenByte,

unsigned

char

*pOutData,

unsigned

int

*pOutLenBit){

char

data

status

=

MI_ERR;

unsigned

char

data

irqEn

=

0x00;

unsigned

char

data

waitFor

=

0x00;

unsigned

char

data

lastBits;

unsigned

char

data

n;

unsigned

int

data

i;

switch

(mand)

{

case

PCD_AUTHENT:irqEn

=

0x12;waitFor

=

0x10;break;case

PCD_TRANSCEIVE:irqEn

=

0x77;waitFor

=

0x30;break;default:break;

}

WriteRawRC(IEnReg,irqEn|0x80);

ClearBitMask(IrqReg,0x80);

WriteRawRC(mandReg,PCD_IDLE);

SetBitMask(FIFOLevelReg,0x80);

for

(i=0;

i

{

WriteRawRC(FIFODataReg,

pInData[i]);

}

WriteRawRC(mandReg,

mand);

if

(mand

==

PCD_TRANSCEIVE)

{

SetBitMask(BitFramingReg,0x80);

}

//i

=

600;//¸ù¾ÝʱÖÓƵÂʵ÷Õû£¬²Ù×÷M1¿¨×î´óµÈ´ýʱ¼ä25msi

=

2000;

do

{

n

=

ReadRawRC(IrqReg);

i--;

}

while

((i!=0)

&&

!(n&0x01)

&&

!(n&waitFor));

ClearBitMask(BitFramingReg,0x80);

if

(i!=0)

{

if(!(ReadRawRC(ErrorReg)&0x1B))

{

status

=

MI_OK;

if

(n

&

irqEn

&

0x01)

{

status

=

MI_NOTAGERR;

}

if

(mand

==

PCD_TRANSCEIVE)

{

n

=

ReadRawRC(FIFOLevelReg);

lastBits

=

ReadRawRC(ControlReg)

&

0x07;

if

(lastBits)

{

*pOutLenBit

=

(n-1)*8

+

lastBits;

}

else

{

*pOutLenBit

=

n*8;

}

if

(n

==

0)

{

n

=

1;

}

if

(n

>

MAXRLEN)

{

n

=

MAXRLEN;

}

for

(i=0;

i

{

pOutData[i]

=

ReadRawRC(FIFODataReg);

}

}

}

else

{

status

=

MI_ERR;

}

}

SetBitMask(ControlReg,0x80);

//

stop

timer

now

WriteRawRC(mandReg,PCD_IDLE);

return

status;}

天线开启和关闭

扣款和充值

char

PcdValue(unsigned

char

data

dd_mode,unsigned

char

data

ad

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论