51单片机RC522射频卡驱动(3)

2019-06-11 18:39

status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) { status = MI_ERR; }

if (status == MI_OK) {

//memcpy(ucComMF522Buf, pData, 16); for (i=0; i<16; i++) { ucComMF522Buf[i] = *(pData+i); }

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

status PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);

if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) { status = MI_ERR; } }

return status; }

/////////////////////////////////////////////////////////////////////

//功 能:命令卡片进入休眠状态 //返 回: 成功返回MI_OK

///////////////////////////////////////////////////////////////////// char PcdHalt(void) {

char xdata status; uint16 xdata unLen;

uint8 xdata ucComMF522Buf[MAXRLEN];

ucComMF522Buf[0] = PICC_HALT; ucComMF522Buf[1] = 0;

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

status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

return MI_OK; }

///////////////////////////////////////////////////////////////////// //用MF522计算CRC16函数

= ///////////////////////////////////////////////////////////////////// void CalulateCRC(uint8 *pIndata,uint8 len,uint8 *pOutData) {

uint8 xdata i,n;

ClearBitMask(DivIrqReg,0x04);

WriteRawRC(CommandReg,PCD_IDLE); SetBitMask(FIFOLevelReg,0x80); for (i=0; i

{ WriteRawRC(FIFODataReg, *(pIndata+i)); } WriteRawRC(CommandReg, PCD_CALCCRC); i = 0xFF; do {

n = ReadRawRC(DivIrqReg); i--; }

while ((i!=0) && !(n&0x04));

pOutData[0] = ReadRawRC(CRCResultRegL); pOutData[1] = ReadRawRC(CRCResultRegM); }

/////////////////////////////////////////////////////////////////////

//功 能:复位RC522 //返 回: 成功返回MI_OK

///////////////////////////////////////////////////////////////////// char PcdReset(void) { //PORTD|=(1<

WriteRawRC(CommandReg,PCD_RESETPHASE); delay10us();

WriteRawRC(ModeReg,0x3D); //和Mifare卡通讯,CRC初始值0x6363 WriteRawRC(TReloadRegL,30); WriteRawRC(TReloadRegH,0); WriteRawRC(TModeReg,0x8D); WriteRawRC(TPrescalerReg,0x3E);

WriteRawRC(TxAutoReg,0x40);//必须要

return MI_OK; }

////////////////////////////////////////////////////////////////////// //设置RC632的工作方式

////////////////////////////////////////////////////////////////////// char M500PcdConfigISOType(uint8 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); delay1ms();

PcdAntennaOn(); }

else{ return -1; }

return MI_OK; }

///////////////////////////////////////////////////////////////////// //功 能:读RC632寄存器

//参数说明:Address[IN]:寄存器地址 //返 回:读出的值

///////////////////////////////////////////////////////////////////// uint8 ReadRawRC(uint8 Address) {

uint8 xdata ucAddr; uint8 xdata ucResult=0; CLR_SPI_CS;

ucAddr = ((Address<<1)&0x7E)|0x80; SPIWriteByte(ucAddr); ucResult=SPIReadByte(); SET_SPI_CS; return ucResult; }

///////////////////////////////////////////////////////////////////// //功 能:写RC632寄存器

//参数说明:Address[IN]:寄存器地址 // value[IN]:写入的值

///////////////////////////////////////////////////////////////////// void WriteRawRC(uint8 Address, uint8 value) {

uint8 xdata ucAddr; CLR_SPI_CS;

ucAddr = ((Address<<1)&0x7E); SPIWriteByte(ucAddr); SPIWriteByte(value); SET_SPI_CS; }

///////////////////////////////////////////////////////////////////// //功 能:置RC522寄存器位 //参数说明:reg[IN]:寄存器地址 // mask[IN]:置位值

///////////////////////////////////////////////////////////////////// void SetBitMask(uint8 reg,uint8 mask) {

char xdata tmp = 0x0; tmp = ReadRawRC(reg);

WriteRawRC(reg,tmp | mask); // set bit mask }

///////////////////////////////////////////////////////////////////// //功 能:清RC522寄存器位 //参数说明:reg[IN]:寄存器地址 // mask[IN]:清位值

///////////////////////////////////////////////////////////////////// void ClearBitMask(uint8 reg,uint8 mask) {

char xdata tmp = 0x0; tmp = ReadRawRC(reg);

WriteRawRC(reg, tmp & ~mask); // clear bit mask }

///////////////////////////////////////////////////////////////////// //功 能:通过RC522和ISO14443卡通讯 //参数说明:Command[IN]:RC522命令字

// pInData[IN]:通过RC522发送到卡片的数据 // InLenByte[IN]:发送数据的字节长度 // pOutData[OUT]:接收到的卡片返回数据 // *pOutLenBit[OUT]:返回数据的位长度

/////////////////////////////////////////////////////////////////////

char PcdComMF522(uint8 Command,uint8 *pInData,uint8 InLenByte,uint8 *pOutData,uint16 *pOutLenBit) {

char xdata status = MI_ERR; uint8 xdata irqEn = 0x00; uint8 xdata waitFor = 0x00; uint8 xdata lastBits; uint8 xdata n; uint16 xdata i; switch (Command) {

case PCD_AUTHENT: irqEn = 0x12; waitFor = 0x10; break; case PCD_TRANSCEIVE: irqEn = 0x77; waitFor = 0x30; break; default: break; }

WriteRawRC(ComIEnReg,irqEn|0x80); ClearBitMask(ComIrqReg,0x80);

WriteRawRC(CommandReg,PCD_IDLE); SetBitMask(FIFOLevelReg,0x80);

for (i=0; i

{ WriteRawRC(FIFODataReg, pInData[i]); } WriteRawRC(CommandReg, Command);

if (Command == PCD_TRANSCEIVE)

{ SetBitMask(BitFramingReg,0x80); }

//i = 600;//根据时钟频率调整,操作M1卡最大等待时间25ms i = 2000; do


51单片机RC522射频卡驱动(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:质量管理的常用工具与手法(含试题及答案) - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: