MF RC522 射频识别参考程序注释new

合集下载

MFRC522设计射频身份识别器C程序

MFRC522设计射频身份识别器C程序

#include "myinit.h"/** 函数名:Write_MFRC5200* 功能描述:向MFRC522的某一寄存器写一个字节数据* 输入参数:addr--寄存器地址;val--要写入的值* 返回值:无*/void Write_MFRC522(uchar addr, uchar val){GPIO_WriteLow(GPIOE,GPIO_PIN_5);//地址格式:0XXXXXX0SPI_Write((addr<<1)&0x7E);SPI_Write(val);GPIO_WriteHigh(GPIOE,GPIO_PIN_5);}/** 函数名:Read_MFRC522* 功能描述:从MFRC522的某一寄存器读一个字节数据* 输入参数:addr--寄存器地址* 返回值:返回读取到的一个字节数据*/uchar Read_MFRC522(uchar addr){uchar val;GPIO_WriteLow(GPIOE,GPIO_PIN_5);//地址格式:1XXXXXX0SPI_Write(((addr<<1)&0x7E) | 0x80);val = SPI_Read();GPIO_WriteHigh(GPIOE,GPIO_PIN_5);return val;}/** 函数名:SetBitMask* 功能描述:置RC522寄存器位* 输入参数:reg--寄存器地址;mask--置位值* 返回值:无*/void SetBitMask(uchar reg, uchar mask){uchar tmp;tmp = Read_MFRC522(reg);Write_MFRC522(reg, tmp | mask); // set bit mask}/** 函数名:ClearBitMask* 功能描述:清RC522寄存器位* 输入参数:reg--寄存器地址;mask--清位值* 返回值:无*/void ClearBitMask(uchar reg, uchar mask){uchar tmp;tmp = Read_MFRC522(reg);Write_MFRC522(reg, tmp & (~mask)); // clear bit mask}/** 函数名:AntennaOn* 功能描述:开启天线,每次启动或关闭天险发射之间应至少有1ms的间隔* 输入参数:无* 返回值:无*/void AntennaOn(void){uchar temp;temp = Read_MFRC522(TxControlReg);if (!(temp & 0x03)){SetBitMask(TxControlReg, 0x03);}}/** 函数名:AntennaOff* 功能描述:关闭天线,每次启动或关闭天险发射之间应至少有1ms的间隔* 输入参数:无* 返回值:无*/void AntennaOff(void){ClearBitMask(TxControlReg, 0x03);}/** 函数名:ResetMFRC522* 功能描述:复位RC522* 输入参数:无* 返回值:无*/void MFRC522_Reset(void){Write_MFRC522(CommandReg, PCD_RESETPHASE);}void MFRC522_Init(void){Set_NRSTPD;MFRC522_Reset();//Timer: TPrescaler*TreloadVal/6.78MHz = 24msWrite_MFRC522(TModeReg, 0x8D); //Tauto=1; f(Timer) = 6.78MHz/TPreScaler Write_MFRC522(TPrescalerReg, 0x3E); //TModeReg[3..0] + TPrescalerReg Write_MFRC522(TReloadRegL, 30);Write_MFRC522(TReloadRegH, 0);Write_MFRC522(TxAutoReg, 0x40); //100%ASKWrite_MFRC522(ModeReg, 0x3D); //CRC初始值0x6363//ClearBitMask(Status2Reg, 0x08); //MFCrypto1On=0//Write_MFRC522(RxSelReg, 0x86); //RxWait = RxSelReg[5..0]//Write_MFRC522(RFCfgReg, 0x7F); //RxGain = 48dBAntennaOn(); //打开天线}/** 函数名:MFRC522_ToCard* 功能描述:RC522和ISO14443卡通讯* 输入参数:command--MF522命令字,* sendData--通过RC522发送到卡片的数据,* sendLen--发送的数据长度* backData--接收到的卡片返回数据,* backLen--返回数据的位长度* 返回值:成功返回MI_OK*/uchar MFRC522_ToCard(uchar command, uchar *sendData, uchar sendLen, uchar *backData, uint *backLen){uchar status = MI_ERR;uchar irqEn = 0x00;uchar waitIRq = 0x00;uchar lastBits;uchar n;uint i;switch (command){case PCD_AUTHENT: //认证卡密{irqEn = 0x12;waitIRq = 0x10;break;}case PCD_TRANSCEIVE: //发送FIFO中数据{irqEn = 0x77;waitIRq = 0x30;break;}default:break;}Write_MFRC522(CommIEnReg, irqEn|0x80); //允许中断请求ClearBitMask(CommIrqReg, 0x80); //清除所有中断请求位SetBitMask(FIFOLevelReg, 0x80); //FlushBuffer=1, FIFO初始化Write_MFRC522(CommandReg, PCD_IDLE); //NO action;取消当前命令//向FIFO中写入数据for (i=0; i<sendLen; i++){Write_MFRC522(FIFODataReg, sendData[i]);}//执行命令Write_MFRC522(CommandReg, command);if (command == PCD_TRANSCEIVE){SetBitMask(BitFramingReg, 0x80); //StartSend=1,transmission of data starts}//等待接收数据完成i = 40000; //i根据时钟频率调整,操作M1卡最大等待时间25msdo{//CommIrqReg[7..0]//Set1 TxIRq RxIRq IdleIRq HiAlerIRq LoAlertIRq ErrIRq TimerIRqn = Read_MFRC522(CommIrqReg);i--;}while ((i!=0) && !(n&0x01) && !(n&waitIRq));ClearBitMask(BitFramingReg, 0x80); //StartSend=0if (i != 0){if(!(Read_MFRC522(ErrorReg) & 0x1B)) //BufferOvfl Collerr CRCErr ProtecolErr {status = MI_OK;if (n & irqEn & 0x01){status = MI_NOTAGERR; //??}if (command == PCD_TRANSCEIVE){n = Read_MFRC522(FIFOLevelReg);lastBits = Read_MFRC522(ControlReg) & 0x07;if (lastBits){*backLen = (n-1)*8 + lastBits;}else{*backLen = n*8;}if (n == 0){n = 1;}if (n > MAX_LEN){n = MAX_LEN;}//读取FIFO中接收到的数据for (i=0; i<n; i++){backData[i] = Read_MFRC522(FIFODataReg);}}}else{status = MI_ERR;}}//SetBitMask(ControlReg,0x80); //timer stops //Write_MFRC522(CommandReg, PCD_IDLE);return status;}/** 函数名:MFRC522_Request* 功能描述:寻卡,读取卡类型号* 输入参数:reqMode--寻卡方式,* TagType--返回卡片类型* 0x4400 = Mifare_UltraLight* 0x0400 = Mifare_One(S50)* 0x0200 = Mifare_One(S70)* 0x0800 = Mifare_Pro(X)* 0x4403 = Mifare_DESFire* 返回值:成功返回MI_OK*/uchar MFRC522_Request(uchar reqMode, uchar *TagType){uchar status;uint backBits; //接收到的数据位数Write_MFRC522(BitFramingReg, 0x07); //TxLastBists = BitFramingReg[2..0]TagType[0] = reqMode;status = MFRC522_ToCard(PCD_TRANSCEIVE, TagType, 1, TagType, &backBits);if ((status != MI_OK) || (backBits != 0x10)){status = MI_ERR;}return status;}/** 函数名:MFRC522_Anticoll* 功能描述:防冲突检测,读取选中卡片的卡序列号* 输入参数:serNum--返回4字节卡序列号,第5字节为校验字节* 返回值:成功返回MI_OK*/uchar MFRC522_Anticoll(uchar *serNum){uchar status;uchar i;uchar serNumCheck=0;uint unLen;//ClearBitMask(Status2Reg, 0x08); //TempSensclear//ClearBitMask(CollReg,0x80); //ValuesAfterCollWrite_MFRC522(BitFramingReg, 0x00); //TxLastBists = BitFramingReg[2..0]serNum[0] = PICC_ANTICOLL;serNum[1] = 0x20;status = MFRC522_ToCard(PCD_TRANSCEIVE, serNum, 2, serNum, &unLen);if (status == MI_OK){//校验卡序列号for (i=0; i<4; i++){serNumCheck ^= serNum[i];}if (serNumCheck != serNum[i]){status = MI_ERR;}}//SetBitMask(CollReg, 0x80); //ValuesAfterColl=1return status;}/** 函数名:CalulateCRC* 功能描述:用MF522计算CRC* 输入参数:pIndata--要读数CRC的数据,len--数据长度,pOutData--计算的CRC结果* 返回值:无*/void CalulateCRC(uchar *pIndata, uchar len, uchar *pOutData){uchar i, n;ClearBitMask(DivIrqReg, 0x04); //CRCIrq = 0SetBitMask(FIFOLevelReg, 0x80); //清FIFO指针//Write_MFRC522(CommandReg, PCD_IDLE);//向FIFO中写入数据for (i=0; i<len; i++){Write_MFRC522(FIFODataReg, *(pIndata+i));}Write_MFRC522(CommandReg, PCD_CALCCRC);//等待CRC计算完成i = 0xFF;do{n = Read_MFRC522(DivIrqReg);i--;}while ((i!=0) && !(n&0x04)); //CRCIrq = 1//读取CRC计算结果pOutData[0] = Read_MFRC522(CRCResultRegL);pOutData[1] = Read_MFRC522(CRCResultRegM);}/** 函数名:MFRC522_SelectTag* 功能描述:选卡,读取卡存储器容量* 输入参数:serNum--传入卡序列号* 返回值:成功返回卡容量*/uchar MFRC522_SelectTag(uchar *serNum){uchar i;uchar status;uchar size;uint recvBits;uchar buffer[9];//ClearBitMask(Status2Reg, 0x08); //MFCrypto1On=0buffer[0] = PICC_SElECTTAG;buffer[1] = 0x70;for (i=0; i<5; i++){buffer[i+2] = *(serNum+i);}CalulateCRC(buffer, 7, &buffer[7]); //??status = MFRC522_ToCard(PCD_TRANSCEIVE, buffer, 9, buffer, &recvBits);if ((status == MI_OK) && (recvBits == 0x18)){size = buffer[0];}else{size = 0;}return size;}/** 函数名:MFRC522_Auth* 功能描述:验证卡片密码* 输入参数:authMode--密码验证模式0x60 = 验证A密钥0x61 = 验证B密钥BlockAddr--块地址Sectorkey--扇区密码serNum--卡片序列号,4字节* 返回值:成功返回MI_OK*/uchar MFRC522_Auth(uchar authMode, uchar BlockAddr, uchar *Sectorkey, uchar *serNum) {uchar status;uint recvBits;uchar i;uchar buff[12];//验证指令+块地址+扇区密码+卡序列号buff[0] = authMode;buff[1] = BlockAddr;for (i=0; i<6; i++){buff[i+2] = *(Sectorkey+i);}for (i=0; i<4; i++){buff[i+8] = *(serNum+i);}status = MFRC522_ToCard(PCD_AUTHENT, buff, 12, buff, &recvBits);if ((status != MI_OK) || (!(Read_MFRC522(Status2Reg) & 0x08))){status = MI_ERR;}return status;}/** 函数名:MFRC522_Read* 功能描述:读块数据* 输入参数:blockAddr--块地址;recvData--读出的块数据* 返回值:成功返回MI_OK*/uchar MFRC522_Read(uchar blockAddr, uchar *recvData){uchar status;uint unLen;recvData[0] = PICC_READ;recvData[1] = blockAddr;CalulateCRC(recvData,2, &recvData[2]);status = MFRC522_ToCard(PCD_TRANSCEIVE, recvData, 4, recvData, &unLen);if ((status != MI_OK) || (unLen != 0x90)){status = MI_ERR;}return status;}/** 函数名:MFRC522_Write* 功能描述:写块数据* 输入参数:blockAddr--块地址;writeData--向块写16字节数据* 返回值:成功返回MI_OK*/uchar MFRC522_Write(uchar blockAddr, uchar *writeData){uchar status;uint recvBits;uchar i;uchar buff[18];buff[0] = PICC_WRITE;buff[1] = blockAddr;CalulateCRC(buff, 2, &buff[2]);status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff, &recvBits);if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A)){status = MI_ERR;}if (status == MI_OK){for (i=0; i<16; i++) //向FIFO写16Byte数据{buff[i] = *(writeData+i);}CalulateCRC(buff, 16, &buff[16]);status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 18, buff, &recvBits);if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A)){status = MI_ERR;}}return status;}/** 函数名:MFRC522_Halt* 功能描述:命令卡片进入休眠状态* 输入参数:无* 返回值:无*/void MFRC522_Halt(void){uchar status;uint unLen;uchar buff[4];buff[0] = PICC_HALT;buff[1] = 0;CalulateCRC(buff, 2, &buff[2]);status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff,&unLen);}。

MFRC522数据手册_引脚图_参数

MFRC522数据手册_引脚图_参数
2.1 Differences between version 1.0 and 2.0
The MFRC522 is available in two versions:
• MFRC52201HN1, hereafter referred to version 1.0 and • MFRC52202HN1, hereafter referred to version 2.0.
MFRC522
Standard 3V MIFARE reader solution
Rev. 3.7 — 26 March 2014 112137
Product data sheet COMPANY PUBLIC
1. Introduction
This document describes the functionality and electrical specifications of the contactless reader/writer MFRC522.
83 of 94
NXP Semiconductors
MFRC522
Standard 3V MIFARE reader solution
001aak598 (1) (2)
(3)
10 μs/div (1) MinLevel (1 V/div) on pin AUX2. (2) Corr1 (1 V/div) on pin AUX1. (3) RF field.
All information provided in this document is subject to legal disclaimers.
Rev. 3.7 — 26 March 2014 112137
© NXP Semiconductors N.V. 2014. All rights reserved.

mfrc522各寄存器注释

mfrc522各寄存器注释

mfrc522各寄存器注释//函数原型/////////////////////////////////////////////////////////////////////char PcdReset(void);void PcdAntennaOn(void);void PcdAntennaOff(void);char PcdRequest(unsigned char req_code,unsigned char *pTagType);char PcdAnticoll(unsigned char *pSnr);char PcdSelect(unsigned char *pSnr);char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char*pKey,unsigned char *pSnr);char PcdRead(unsigned char addr,unsigned char *pData);char PcdWrite(unsigned char addr,unsigned char *pData);char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue);char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr); char PcdHalt(void); char PcdComMF522(unsigned char Command,unsigned char *pInData,unsigned char InLenByte,unsigned char *pOutData,unsigned int *pOutLenBit);void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData); void WriteRawRC(unsigned char Address,unsigned char value);unsigned char ReadRawRC(unsigned char Address);void SetBitMask(unsigned char reg,unsigned char mask);void ClearBitMask(unsigned char reg,unsigned char mask);char M500PcdConfigISOType(unsigned char type);//void delay_10ms(unsigned int _10ms);void iccardcode();char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr);char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue);///////////////////////////////////////////////////////////////////////MF522命令字/////////////////////////////////////////////////////////////////////#define PCD_IDLE 0x00 //取消当前命令#define PCD_AUTHENT 0x0E //验证密钥#define PCD_RECEIVE 0x08 //接收数据#define PCD_TRANSMIT 0x04 //发送数据#define PCD_TRANSCEIVE 0x0C //发送并接收数据#define PCD_RESETPHASE 0x0F //复位#define PCD_CALCCRC 0x03 //CRC计算///////////////////////////////////////////////////////////////////////Mifare_One卡⽚命令字#define PICC_REQIDL 0x26 //寻天线区内未进⼊休眠状态#define PICC_REQALL 0x52 //寻天线区内全部卡#define PICC_ANTICOLL1 0x93 //防冲撞#define PICC_ANTICOLL2 0x95 //防冲撞#define PICC_AUTHENT1A 0x60 //验证A密钥#define PICC_AUTHENT1B 0x61 //验证B密钥#define PICC_READ 0x30 //读块#define PICC_WRITE 0xA0 //写块#define PICC_DECREMENT 0xC0 //扣款#define PICC_INCREMENT 0xC1 //充值#define PICC_RESTORE 0xC2 //调块数据到缓冲区#define PICC_TRANSFER 0xB0 //保存缓冲区中数据#define PICC_HALT 0x50 //休眠///////////////////////////////////////////////////////////////////////MF522 FIFO长度定义/////////////////////////////////////////////////////////////////////#define DEF_FIFO_LENGTH 64 //FIFO size=64byte///////////////////////////////////////////////////////////////////////MF522寄存器定义/////////////////////////////////////////////////////////////////////// PAGE 0 // 命令和状态#define RFU00 0x00#define CommandReg 0x01 // 启动和停⽌命令的执⾏#define ComIEnReg 0x02 // 中断请求传递的使能和禁能控制位#define DivlEnReg 0x03 // 中断请求传递的使能和禁能控制位#define ComIrqReg 0x04 // 包含中断请求标志#define DivIrqReg 0x05 // 包含中断请求标志#define ErrorReg 0x06 // 错误标志,指⽰执⾏的上个命令的错误状态#define Status1Reg 0x07 // 包含通信的状态标志#define Status2Reg 0x08 // 包含接收器和发送器的状态标志#define FIFODataReg 0x09 // 64字节FIFO缓冲区的输⼊和输出#define FIFOLevelReg 0x0A // 指⽰FIFO中存储的字节数#define WaterLevelReg 0x0B // 定义FIFO下溢和上溢报警的FIFO深度#define ControlReg 0x0C // 不同的控制寄存器#define BitFramingReg 0x0D // ⾯向位的帧的调节#define CollReg 0x0E // RF接⼝上检测到的第⼀个位冲突的位的位置#define RFU0F 0x0F// PAGE 1#define RFU10 0x10#define ModeReg 0x11 // 定义发送和接收的常⽤模式#define TxModeReg 0x12 // 定义发送过程的数据传输速率#define RxModeReg 0x13 // 定义接收过程中的数据传输速率#define TxControlReg 0x14 // 控制天线驱动器管脚TX1和TX2的逻辑特性#define TxAutoReg 0x15 // 控制天线驱动器的设置#define TxSelReg 0x16 // 选择天线驱动器的内部源#define RxSelReg 0x17 // 选择内部的接收器设置#define RxThresholdReg 0x18 // 选择位译码器的阈值#define DemodReg 0x19 // 定义解调器的设置#define RFU1A 0x1A#define RFU1B 0x1B#define MifareReg 0x1C // 控制ISO 14443/MIFARE模式中106kbit/s的通信#define RFU1D 0x1D#define RFU1E 0x1E#define SerialSpeedReg 0x1F // 选择串⾏UART接⼝的速率// PAGE 2#define RFU20 0x20#define CRCResultRegM 0x21 // 显⽰CRC计算的实际MSB和LSB值#define CRCResultRegL 0x22#define RFU23 0x23#define ModWidthReg 0x24 // 控制ModWidth的设置#define RFU25 0x25#define RFCfgReg 0x26 // 配置接收器增益#define GsNReg 0x27 // 选择天线驱动器管脚TX1和TX2的调制电导#define CWGsCfgReg 0x28 // 选择天线驱动器管脚TX1和TX2的调制电导#define ModGsCfgReg 0x29 // 选择天线驱动器管脚TX1和TX2的调制电导#define TModeReg 0x2A // 定义内部定时器的设置#define TPrescalerReg 0x2B // 定义内部定时器的设置#define TReloadRegH 0x2C // 描述16位长的定时器重装值#define TReloadRegL 0x2D // 描述16位长的定时器重装值#define TCounterValueRegH 0x2E // 显⽰16位长的实际定时器值#define TCounterValueRegL 0x2F // 显⽰16位长的实际定时器值// PAGE 3#define RFU30 0x30#define TestSel1Reg 0x31 // 常⽤测试信号的配置#define TestSel2Reg 0x32 // 常⽤测试信号的配置和PRBS控制#define TestPinEnReg 0x33 // 输出驱动器的使能管脚(注:仅⽤于串⾏接⼝)#define TestPinValueReg 0x34 // 定义D1-D7⽤作I/O总线时的值#define TestBusReg 0x35 // 显⽰内部测试总线的状态#define AutoTestReg 0x36 // 控制数字⾃测试#define VersionReg 0x37 // 显⽰版本#define AnalogTestReg 0x38 // 控制管脚AUX1和AUX2#define TestDAC1Reg 0x39 // 定义TestDAC1的测试值#define TestDAC2Reg 0x3A // 定义TestDAC2的测试值#define TestADCReg 0x3B // 显⽰ADC I和Q通道的实际值#define RFU3C 0x3C #define RFU3D 0x3D#define RFU3E 0x3E#define RFU3F 0x3F///////////////////////////////////////////////////////////////////// //和MF522通讯时返回的错误代码///////////////////////////////////////////////////////////////////// #define MI_OK 0#define MI_NOTAGERR (-1)#define MI_ERR (-2)。

rc522读写程序

rc522读写程序

rc522读写程序
摘要:
1.RC522 读写程序简介
2.RC522 读写程序的工作原理
3.RC522 读写程序的应用场景
4.RC522 读写程序的发展前景
正文:
一、RC522 读写程序简介
RC522 读写程序是一款基于射频识别技术(RFID)的读写程序,主要用于MFRC522 射频识别卡与读写器之间的通信。

该程序可以实现对射频识别卡的读取、写入和删除数据等操作,为各类应用场景提供了便捷的解决方案。

二、RC522 读写程序的工作原理
RC522 读写程序的工作原理主要基于射频识别技术的无线通信。

当射频识别卡进入读写器的工作范围时,读写器会发射一定频率的射频信号,激活射频识别卡内的芯片。

随后,射频识别卡将自身的数据传递给读写器,完成数据的读取或写入。

三、RC522 读写程序的应用场景
RC522 读写程序在现实生活中的应用场景非常广泛,包括但不限于以下几个方面:
1.门禁系统:通过射频识别技术,可实现对进出门禁的人员或物品的自动识别和控制。

2.考勤管理:企业或学校可利用RC522 读写程序实现对员工或学生的考勤管理,提高管理效率。

3.智能交通:RC522 读写程序可用于实现智能交通领域的车辆识别、交通监控等功能。

4.零售行业:通过射频识别技术,实现对商品的快速扫描和识别,提高购物体验。

四、RC522 读写程序的发展前景
随着科技的不断进步,射频识别技术在各个领域的应用也在不断拓展。

RC522 读写程序作为射频识别技术的重要组成部分,具有非常广阔的发展前景。

rc522产品手册

rc522产品手册

rc522产品手册一、概述RC522是一款广泛应用的非接触式射频识别(RFID)读写器芯片,专为高频(13.56 MHz)射频通信设计。

由于其高效性能、低功耗及易于集成等特性,RC522在物联网、电子门锁、智能支付等领域有着广泛的应用。

本手册将详细介绍RC522的主要功能、技术规格、使用方法及常见问题解答。

二、产品特性工作频率:13.56 MHz。

支持ISO14443A/MIFARE标准。

高集成度:将射频前端、解调器、安全逻辑和EEPROM 存储器集成于单芯片中。

低功耗:在待机状态下电流消耗仅为170μA,读写时为3.3mA。

高速数据传输:支持高达848 kbps的通信速率。

多种接口选择:可与SPI、I2C、UART等接口进行连接。

安全性:支持加密和解密功能,确保数据传输的安全性。

三、使用方法硬件连接:根据所选接口,将RC522与微控制器或其他设备进行连接。

注意确保天线连接良好,以获得最佳的通信效果。

电源供应:为RC522提供稳定的电源,建议电压范围为3.3-5V。

寄存器配置:根据需求,通过SPI、I2C或UART接口对RC522的寄存器进行配置。

这包括设置通信参数、选择工作模式等。

读写操作:使用配置好的寄存器参数,对RFID标签进行读写操作。

数据处理:对从RFID标签读取的数据进行解码和安全性验证,确保数据的准确性和安全性。

四、常见问题及解答1.RC522支持哪些类型的RFID标签?答:RC522支持ISO14443A标准和MIFARE系列标签,可读写多种类型的RFID 标签。

2.为什么无法读取RFID标签?答:可能的原因包括天线连接不良、标签与读卡器之间的距离过远、存在干扰等。

请检查天线连接和工作环境,确保符合通信要求。

3.如何配置RC522的寄存器?答:根据需要,通过SPI、I2C或UART接口对RC522的寄存器进行配置。

具体配置方法可参考相关开发文档或手册。

MFRC522读卡器设计重点讲义资料

MFRC522读卡器设计重点讲义资料

MFRC522读卡器设计重点讲义资料
引言:
MFRC522读卡器是一款非常流行的射频识别设备,广泛应用于门禁系统、智能支付、物联网等领域。

本文将介绍MFRC522读卡器的设计原理、工作流程以及一些设计注意事项,帮助读者能更好地理解和应用该技术。

一、MFRC522读卡器的原理
二、MFRC522读卡器的工作流程
1.初始化:通过SPI接口与主控制器进行通信,设置相关寄存器、配置工作模式和参数。

三、MFRC522读卡器的设计注意事项
2.电源设计:为保证读卡器的正常工作,应注意电源的稳定性和可靠性。

可以采用稳压电源和合适的滤波电路。

3.通信接口选择:MFRC522读卡器通常通过SPI接口与主控制器进行通信,设计时应注意信号线的布局、长度和阻抗匹配,以确保稳定的数据传输速率。

4.PCB设计:将MFRC522读卡器的各个模块、器件布局在PCB上时,应注意信号分布的合理性、阻抗匹配和地线的设计。

结论:
MFRC522读卡器是一款非常实用的射频识别设备,在门禁系统、智能支付和物联网等领域有着广泛的应用。

通过理解其工作原理和工作流程,以及注意一些设计要点,可以更好地应用该技术,并实现更高效、稳定的
系统设计。

希望本文所提供的讲义资料能帮助读者更好地学习和应用MFRC522读卡器技术。

rc522识别ic卡的工作流程

rc522识别ic卡的工作流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor.I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!深入理解RC522模块识别IC卡的工作流程在物联网(IoT)和智能设备领域,RFID(无线频率识别)技术因其非接触式通信和便捷性而广泛应用。

13_ZigBee组网实验说明-射频卡MFR522

13_ZigBee传感器组网——射频卡MFRC522实验现象:使用MFRC522模块读取IC卡信息,终端节点采集IC卡信息后,通过自身串口输出并可与协调器组网,发送采集的数据给协调器,协调器接收后串口打印输出;这种在无线IC卡考勤机上有非常广泛的应用。

传感器介绍:IC卡(Integrated Circuit Card,集成电路卡),有些国家和地区也称智能卡(smart card)、智慧卡(intelligent card)、微电路卡(microcircuit card)或微芯片卡等。

它是将一个微电子芯片嵌入符合ISO 7816标准的卡基中,做成卡片形式。

IC 卡读写器是IC卡与应用系统间的桥梁,在ISO国际标准中称之为接口设备IFD(Interface Device)。

IFD内CPU通过一个接口电路与IC卡相连并进行通信。

IC 卡接口电路是IC卡读写器中至关重要的部分,根据实际应用系统的不同,可选择并行通信、半双工串行通信和I2C通信等不同的IC卡读写芯片。

非接触式IC卡又称射频卡,成功地解决了无源(卡中无电源)和免接触这一难题,是电子器件领域的一大突破。

主要用于公交、轮渡、地铁的自动收费系统,也应用在门禁管理、身份证明和电子钱包实现平台:ZigBee传感器节点硬件说明:MFRC522模块是SPI接口的,所以通过CC2530的SPI接口控制这个模块,底板的硬件设计比较简单,留出了MFRC522卡的接口。

带网蜂IC卡模块的ZigBee节点通过感应IC卡,将采集到的IC卡的ID编号远程发送给协调器,协调器接收后通过串口打印出来。

实验过程:分三个步骤,如下:一:下载EndDerviceEB至ZigBee节点二:下载CoordinatorEB至ZigBee节点三:终端节点与协调器组网一:下载EndDerviceEB至ZigBee节点打开例程,下载器连接好ZigBee传感器节点,下载EndDerivceEB至终端节点。

RFID-RC522


/* * 函 数 名:ClearBitMask * 功能描述:清 RC522 寄存器位 * 输入参数:reg--寄存器地址;mask--清位值 * 返 回 值:无 */ void ClearBitMask(uchar reg, uchar mask) {
uchar tmp; tmp = Read_MFRC522(reg); Write_MFRC522(reg, tmp & (~mask)); // clear bit mask }
/* * 函 数 名:Write_MFRC5200 * 功能描述:向 MFRC522 的某一寄存器写一个字节数据 * 输入参数:addr--寄存器地址;val--要写入的值 * 返 回 值:无 */ void Write_MFRC522(uchar addr, uchar val) { CS = 0; //地址格式:0XXXXXX0 SPI_Write((addr<<1)&0x7E); SPI_Write(v0 //RxWait = RxSelReg[5..0] //RxGain = 48dB
/* * * * * * * * * * *
函 数 名:MFRC522_Request 功能描述:寻卡,读取卡类型号 输入参数:reqMode--寻卡方式, TagType--返回卡片类型 0x4400 = Mifare_UltraLight 0x0400 = Mifare_One(S50) 0x0200 = Mifare_One(S70) 0x0800 = Mifare_Pro(X) 0x4403 = Mifare_DESFire 返 回 值:成功返回 MI_OK
/* * 函 数 名:Read_MFRC522 * 功能描述:从 MFRC522 的某一寄存器读一个字节数据 * 输入参数:addr--寄存器地址 * 返 回 值:返回读取到的一个字节数据 */ uchar Read_MFRC522(uchar addr) { uchar val; CS = 0; //地址格式:1XXXXXX0 SPI_Write(((addr<<1)&0x7E) | 0x80); val = SPI_Read(); CS = 1; return val; } /* * 函 数 名:SetBitMask * 功能描述:置 RC522 寄存器位 * 输入参数:reg--寄存器地址;mask--置位值 * 返 回 值:无 */ void SetBitMask(uchar reg, uchar mask) { uchar tmp; tmp = Read_MFRC522(reg); Write_MFRC522(reg, tmp | mask); // set bit mask }

MFRC522 读卡器设计重点讲义资料

第1部分——物理特性;
第2部分——射频能量和信号接口;
第3部分——初始化和防冲突;
第4部分——传输协议。
近耦合IC卡的物理特性及尺寸与ISO/IEC 7810中的规定相符,为85.72mm×54.03mm×0.76mm±容差。与磁卡、接触型IC卡标准尺寸完全一致,为兼容接触型IC卡和磁卡提供了有效途径和方案,使得非接触型的双界面卡、多功能组合卡的推出成为可能。
(2)RFID卡读写设备
RFID卡读写设备(读写器)是连接RFID卡与应用系统间的桥梁,是RFID卡应用中至关重要的一个环节。RFID卡读写设备的基本任务就是启动RFID卡,与RFID卡建立通信,在应用系统和卡片间传递数据。
RFID卡读写器将要发送的信息编码后加载到一固定频率的载波上,当RFID卡(卡片内有一个谐振电路,其频率与读写器发送的载波频率相同)进入读写器的工作区域后,谐振电路产生共振并产生电荷积累,当电荷积累到一定数值时,就能为RFID卡内的电路提供工作电压,使IC卡内的芯片开始正常工作,处理读写器发送的数据信息。
与接触式IC卡相比,RFID卡具有以下优点:
(1)高可靠性:由于无触点,避免了由接触读写而产生的各种故障。提高了抗静电和环境污染(如油烟、灰尘、水汽等)的能力,因此提高了使用的可靠性、读写设备和卡片的使用寿命。
(2)易用性:操作方便、快捷,无需插拔卡,完成—次操作只需0.1~0.3秒。使用时,卡片可以任意方向掠过读写设备表面。
摘要
射频识别卡读写模块的设计与应用
随着电子信息技术的发展,智能卡(IC卡)已经在我们的生活中随处可见。射频识别卡正逐渐取代传统的接触式IC卡,成为智能卡领域的新潮流。研究、开发射频识别卡的读写技术与读写设备,对其推广有着重要的实际意义。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MF RC522 射频识别参考程序注释串口读取的数据//------------------------------------------ucAddr = ((Address<<1)&0x7E)|0x80;//变化成有效的地址形式,最低位为0,最高位为1时候是,从MFRC522读出数据,参考39页// 读SPI数据//------------------------------------------unsigned char SPIReadByte(void){unsigned char data SPICount; // Counter used to clock out the dataunsigned char data 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 MAX7456if(STU_SPI_MISO){SPIData|=0x01;}Drop the clock ready for the next bit} // and loop back return (SPIData); // Finally return the read data}//------------------------------------------// 写SPI数据//------------------------------------------void SPIWriteByte(unsigned char data SPIData){unsigned char data SPICount; // Counter used to clock out the datafor (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;}}///////////////////////////////////////////////////////////////////////功能:寻卡//参数说明: req_code[IN]:寻卡方式// 0x52 = 寻感应区内所有符合14443A标准的卡// 0x26 = 寻未进入休眠状态的卡// pTagType[OUT]:卡片类型代码// 0x4400 = Mifare_UltraLight// 0x0400 = Mifare_One(S50)// 0x0200 = Mifare_One(S70)// 0x0800 = Mifare_Pro(X)// 0x4403 = Mifare_DESFire//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdRequest(unsigned char data req_code,unsigned char *pTagType){unsigned int data unLen;unsigned char data ucComMF522Buf[MAXRLEN];ClearBitMask(Status2Reg,0x08);//清除MRCrypto1on,要用软件清零WriteRawRC(BitFramingReg,0x07);//startsend=0,rxalign=0,在FIFO中存放的位置,TXlastbit=7SetBitMask(TxControlReg,0x03);//TX2rfen=1,TX1RFen=1,传递调制的13.56MHZ的载波信号ucComMF522Buf[0] = req_code;status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);//****** ************8if ((status == MI_OK) && (unLen == 0x10)){*pTagType = ucComMF522Buf[0];*(pTagType+1) = ucComMF522Buf[1];}else{ status = MI_ERR; }return status;}///////////////////////////////////////////////////////////////////////功能:防冲撞//参数说明: pSnr[OUT]:卡片序列号,4字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdAnticoll(unsigned char *pSnr){char data status;unsigned char data i,snr_check=0;unsigned int data unLen;unsigned char data ucComMF522Buf[MAXRLEN];ClearBitMask(Status2Reg,0x08); //清除MRCrypto1on,要用软件清零WriteRawRC(BitFramingReg,0x00); //表示最后一个字节所有位都发送ClearBitMask(CollReg,0x80); //CollRegCollReg 0冲突结束后冲突位被置零ucComMF522Buf[1] = 0x20;status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);if (status == MI_OK){for (i=0; i<4; i++){*(pSnr+i) = ucComMF522Buf[i];//snr_check ^= ucComMF522Buf[i]; //}if (snr_check != ucComMF522Buf[i]){ status = MI_ERR; }}SetBitMask(CollReg,0x80); //CollRegCollReg 在106kbps良好的防冲突情况下该位置1 return status;}///////////////////////////////////////////////////////////////////////功能:选定卡片//参数说明: pSnr[IN]:卡片序列号,4字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdSelect(unsigned char *pSnr){char data status;unsigned char data i;unsigned int data unLen;unsigned char data ucComMF522Buf[MAXRLEN];ucComMF522Buf[0] = PICC_ANTICOLL1;ucComMF522Buf[1] = 0x70;ucComMF522Buf[6] = 0;for (i=0; i<4; i++){ucComMF522Buf[i+2] = *(pSnr+i);ucComMF522Buf[6] ^= *(pSnr+i);}CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]); //########ClearBitMask(Status2Reg,0x08);//清零MFcryonstatus = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);if ((status == MI_OK) && (unLen == 0x18)){ status = MI_OK; }else{ status = MI_ERR; }return status;}///////////////////////////////////////////////////////////////////////功能:验证卡片密码//参数说明: auth_mode[IN]: 密码验证模式// 0x60 = 验证A密钥// 0x61 = 验证B密钥// addr[IN]:块地址// pKey[IN]:密码// pSnr[IN]:卡片序列号,4字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdAuthState(unsigned char data auth_mode,unsigned char data addr,unsigned char *pKey,unsigned char *pSnr){char data status;unsigned int data unLen;unsigned char data i,ucComMF522Buf[MAXRLEN];ucComMF522Buf[0] = auth_mode; //验证A密钥ucComMF522Buf[1] = addr; //addr[IN]:块地址for (i=0; i<6; i++){ ucComMF522Buf[i+2] = *(pKey+i); }for (i=0; i<6; i++){ ucComMF522Buf[i+8] = *(pSnr+i); }// memcpy(&ucComMF522Buf[2], pKey, 6);// memcpy(&ucComMF522Buf[8], pSnr, 4);status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08))){ status = MI_ERR; }return status;///////////////////////////////////////////////////////////////////////功能:读取M1卡一块数据//参数说明: addr[IN]:块地址// pData[OUT]:读出的数据,16字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdRead(unsigned char data addr,unsigned char *pData){char data status;unsigned int data unLen;unsigned char data i,ucComMF522Buf[MAXRLEN];ucComMF522Buf[0] = PICC_READ;ucComMF522Buf[1] = addr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if ((status == MI_OK) && (unLen == 0x90))// { memcpy(pData, ucComMF522Buf, 16); }{for (i=0; i<16; i++){ *(pData+i) = ucComMF522Buf[i]; }}else{ status = MI_ERR; }return status;}///////////////////////////////////////////////////////////////////////功能:写数据到M1卡一块//参数说明: addr[IN]:块地址// pData[IN]:写入的数据,16字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdWrite(unsigned char data addr,unsigned char *pData){char data status;unsigned int data unLen;unsigned char data i,ucComMF522Buf[MAXRLEN];ucComMF522Buf[1] = addr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);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 data status;unsigned int data unLen;unsigned char data 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(unsigned char *pIndata,unsigned char data len,unsigned char *pOutData){unsigned char data i,n;ClearBitMask(DivIrqReg,0x04);WriteRawRC(CommandReg,PCD_IDLE); //取消当前命令SetBitMask(FIFOLevelReg,0x80);//FlushBuffer 清除ErrReg 的标志位for (i=0; i<len; i++){ WriteRawRC(FIFODataReg, *(pIndata+i)); }WriteRawRC(CommandReg, PCD_CALCCRC);i = 0xFF;do{n = ReadRawRC(DivIrqReg);i--;}while ((i!=0) && !(n&0x04)); //当CRCIRq 所有数据被处理完毕该位置位pOutData[0] = ReadRawRC(CRCResultRegL); //显示计算出来的CRC值pOutData[1] = ReadRawRC(CRCResultRegM);}///////////////////////////////////////////////////////////////////////功能:复位RC522//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////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(CommandReg,PCD_RESETPHASE);//#define PCD_RESETPHASE 0x0F //复位WriteRawRC(ModeReg,0x3D); //和Mifare卡通讯,CRC初始值0x6363 WriteRawRC(TReloadRegL,30); //定时器的低8位数据,WriteRawRC(TReloadRegH,0); //定时器的高8位数据,WriteRawRC(TModeReg,0x8D); //定时器模式寄存器,定时器减值计数WriteRawRC(TPrescalerReg,0x3E); //实际值是OXD3E 这部分主要是设置定时器寄存器,##############WriteRawRC(TxAutoReg,0x40);//必须要,设置逻辑1,强制100%ASK调制return MI_OK;}////////////////////////////////////////////////////////////////////////设置RC522的工作方式//////////////////////////////////////////////////////////////////////char M500PcdConfigISOType(unsigned char data type){if (type == 'A') //ISO14443_A{ClearBitMask(Status2Reg,0x08); //状态2寄存器WriteRawRC(ModeReg,0x3D);//3F //和Mifare卡通讯,CRC初始值0x6363WriteRawRC(RxSelReg,0x86);//84 选择内部接收器设置,内部模拟部分调制信号,发送数据后,延迟6个位时钟,接收WriteRawRC(RFCfgReg,0x7F); //4F 配置接收器48dB最大增益WriteRawRC(TReloadRegL,30);//tmoLength);// TReloadVal = 'h6a =tmoLength(dec)WriteRawRC(TReloadRegH,0); //实际值是OXD3E 这部分主要是设置定时器寄存器,##############WriteRawRC(TModeReg,0x8D);WriteRawRC(TPrescalerReg,0x3E);delay_ns(1000);PcdAntennaOn();}else{ return -1; }return MI_OK;}///////////////////////////////////////////////////////////////////////功能:读RC522寄存器//参数说明:Address[IN]:寄存器地址//返回:读出的值/////////////////////////////////////////////////////////////////////unsigned char ReadRawRC(unsigned char data Address){unsigned char data ucResult=0;CLR_SPI_CS;ucAddr = ((Address<<1)&0x7E)|0x80;//变化成有效的地址形式,最低位为0,最高位为1时候是,从MFRC522读出数据,参考39页SPIWriteByte(ucAddr);ucResult=SPIReadByte();SET_SPI_CS;return ucResult;}///////////////////////////////////////////////////////////////////////功能:写RC632寄存器//参数说明:Address[IN]:寄存器地址// value[IN]:写入的值/////////////////////////////////////////////////////////////////////void WriteRawRC(unsigned char data Address, unsigned char data value){unsigned char data ucAddr;CLR_SPI_CS;ucAddr = ((Address<<1)&0x7E);//变化成有效的地址形式,最低为为0,最高位为1时候是,写入MFRC522数据SPIWriteByte(ucAddr);SPIWriteByte(value);SET_SPI_CS;}///////////////////////////////////////////////////////////////////////功能:置RC522寄存器位//参数说明:reg[IN]:寄存器地址// mask[IN]:置位值/////////////////////////////////////////////////////////////////////void SetBitMask(unsigned char data reg,unsigned char data mask){char data tmp = 0x0;tmp = ReadRawRC(reg);WriteRawRC(reg,tmp | mask); // set bit mask}///////////////////////////////////////////////////////////////////////功能:清RC522寄存器位//参数说明:reg[IN]:寄存器地址// mask[IN]:清位值/////////////////////////////////////////////////////////////////////void ClearBitMask(unsigned char data reg,unsigned char data mask) {char data 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(unsigned char data Command,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 (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);//清除FIFO中的读写指针for (i=0; i<InLenByte; i++){ WriteRawRC(FIFODataReg, pInData[i]); }//写寻卡命令WriteRawRC(CommandReg, Command);//发送并接收数据if (Command == PCD_TRANSCEIVE){ SetBitMask(BitFramingReg,0x80); }//相当于启动发送STARTSENG//i = 600;//根据时钟频率调整,操作M1卡最大等待时间25msi = 2000;do{n = ReadRawRC(ComIrqReg);i--;}while ((i!=0) && !(n&0x01) && !(n&waitFor));ClearBitMask(BitFramingReg,0x80);//相当于清除发送STARTSENGif (i!=0)//定时时间到,i,没有递减到0{if(!(ReadRawRC(ErrorReg)&0x1B)){status = MI_OK;if (n & irqEn & 0x01){ status = MI_NOTAGERR; }if (Command == 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<n; i++){ pOutData[i] = ReadRawRC(FIFODataReg); }}}else{ status = MI_ERR; }}SetBitMask(ControlReg,0x80); // stop timer nowWriteRawRC(CommandReg,PCD_IDLE);return status;}///////////////////////////////////////////////////////////////////////开启天线//每次启动或关闭天险发射之间应至少有1ms的间隔/////////////////////////////////////////////////////////////////////void PcdAntennaOn(void){unsigned char data i;i = ReadRawRC(TxControlReg);if (!(i & 0x03)){SetBitMask(TxControlReg, 0x03); //tx12RFEN==11; ,打开发射管脚}}///////////////////////////////////////////////////////////////////////关闭天线/////////////////////////////////////////////////////////////////////void PcdAntennaOff(void){ClearBitMask(TxControlReg, 0x03); //tx12RFEN==00; ,禁止发射管脚}。

相关文档
最新文档