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卡的工作流程

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组网实验说明-射频卡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

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 读卡器设计重点讲义资料

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卡,成为智能卡领域的新潮流。研究、开发射频识别卡的读写技术与读写设备,对其推广有着重要的实际意义。

rc522例程的基本使用

rc522例程的基本使用

rc522例程的基本使用一、引言RC522是一种常用的射频识别(RFID)读写卡芯片,广泛应用于身份识别、门禁系统、物流管理等领域。

本文将介绍如何使用RC522例程进行基本的读写卡操作。

二、硬件准备1. MFRC522模块:包括RC522芯片、天线、天线接口等;2. 串口模块:用于连接PC和MFRC522模块进行通信;3. 电源模块:为MFRC522模块提供电源。

三、例程编写1. 导入相关库文件:根据使用的开发环境和编程语言,导入相应的库文件,例如Arduino IDE中需要导入“MFRC522”库。

2. 初始化串口:配置串口通信参数,例如波特率、数据位、停止位等,以便与PC进行通信。

3. 初始化MFRC522模块:配置MFRC522模块的参数,例如频率、时序等,以便与RFID卡进行通信。

4. 读写RFID卡:* 读卡:通过MFRC522模块读取RFID卡的UID(唯一标识符),并将其发送给PC。

* 写卡:将需要写入RFID卡的数据发送给MFRC522模块,由模块写入RFID 卡。

四、代码示例以下是一个使用Arduino IDE和MFRC522库的示例代码:```arduino#include <SPI.h>#include <MFRC522.h>#define SS_PIN 10 // 设置SS引脚为10号引脚#define RST_PIN 9 // 设置RST引脚为9号引脚MFRC522 rfid(SS_PIN, RST_PIN); // 创建MFRC522对象void setup() {Serial.begin(9600); // 初始化串口通信,波特率为9600SPI.begin(); // 初始化SPI总线rfid.PCD_Init(); // 初始化MFRC522模块}void loop() {if ( ! rfid.PICC_IsNewCardPresent()) { // 检查是否有新卡存在return;}if ( ! rfid.PICC_ReadCardSerial()) { // 读取新卡的UID并发送给PCSerial.println("Failed to read card serial.");return;}Serial.print("Card UID:"); // 输出卡的UIDString uid = rfid.uid.toString(); // 将UID转换为字符串格式并输出Serial.println(uid); // 输出UID字符串}```五、注意事项1. 在使用MFRC522模块之前,需要先了解其工作原理和通信协议,以便正确地编写例程和调试程序。

mfrc522程序注释

mfrc522程序注释

mfrc522程序注释#include#include\#include\#include\#include#definemaxrlen18/*******rxmodereg预设为106kbit/s的通信速率******************//************************************************************************功能:寻卡*参数表明: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***********************************************************************/charpc drequest(unsignedcharreq_code,unsignedchar*ptagtype){charstatus;unsignedintunlen;clearbitmask(status2reg,0x08);//清mfcrypto1on,就可以通过软件清零,该位用以命令crypto1的拨打情况,mfauthent(检验密钥)命令顺利继续执行后置1writerawrc(bitframingreg,0x07);//txlastbits([2-0])表示发送的最后一个字节7位发送//xtest=readrawrc(bitframingreg);//if(xtest==0x07)//{led_green=0;}//else{led_green=1;while(1){}}setbitmask(txcontrolreg,0x03);//txcontrolreg 低2位(tx2rfen和tx1rfen)置1,tx2和tx1管脚输出信号调制在13.56mhz的载波上//if(status==mi_ok)//{led_green=0;}//else{led_green=1;}if((status==mi_ok)&&(unlen==0x10))//发送成功并且接收16位数据{{status=mi_err;}returnstatus;}/***********************************************************************功能:严防冲撞*参数说明:psnr[out]:卡片序列号,4字节*返回:成功返回mi_ok**********************************************************************/charpcd anticoll(unsignedchar*psnr){charstatus;unsignedchari,snr_check=0;unsignedintunlen;clearbitmask(status2reg,0x08);//清mfcrypto1on,只能通过软件清零,该位用来指示crypto1的接通情况,mfauthent(验证密钥)命令成功执行后置1writerawrc(bitframingreg,0x00);//txlastbits([2-0])则表示传送的最后一个字节的所有位都传送clearbitmask(collreg,0x80);//高位置0,所有接收的位在冲突后清除if(status==mi_ok){for(i=0;i<4;i++){}setbitmask(collreg,0x80);//置1,回归正常returnstatus;}/***********************************************************************功能:选取卡片*参数说明:psnr[in]:卡片序列号,4字节*返回:成功返回mi_ok**********************************************************************/charpcd select(unsignedchar*psnr){charstatus;unsignedchari;unsignedintunlen;clearbitmask(status2reg,0x08);//清mfcrypto1on,就可以通过软件清零,该位用以命令crypto1的拨打情况,mfauthent(检验密钥)命令顺利继续执行后置1if((status==mi_ok)&&(unlen==0x18))//接收24位{status=mi_ok;}else{status=mi_err;}returnstatus;}/***********************************************************************功能:检验卡片密码*参数说明:auth_mode[in]:密码验证模式*0x60=验证a密钥*0x61=验证b密钥*addr[in]:块地址*pkey[in]:密码*psnr[in]:卡片序列号,4字节*回到:顺利回到mi_ok**********************************************************************/charpcd authstate(unsignedcharauth_mode,unsignedcharaddr,unsignedchar*pkey,unsignedchar*psnr){charstatus;unsignedintunlen;for(i=0;i<4;i++)/*源代码就是6,不晓得正不恰当*/returnstatus;}/***********************************************************************功能:加载m1卡一块数据*参数表明:addr[in]:块地址*pdata[out]:读出的数据,16字节*返回:成功返回mi_ok***********************************************************************/charpc dread(unsignedcharaddr,unsignedchar*pdata){charstatus;unsignedintunlen;for(i=0;i<16;i++){status=mi_err;}returnstatus;}/*********************************************************************功能:写下数据至m1卡一块*参数表明:addr[in]:块地址*pdata[in]:写入的数据,16字节*返回:成功返回mi_ok********************************************************************/charpcdwr ite(unsignedcharaddr,unsignedchar*pdata){charstatus;unsignedintunlen;{status=mi_err;}。

rc522读写程序

rc522读写程序

rc522读写程序RC522读写程序是一篇关于如何使用RC522读写器进行RFID卡片读写操作的教程。

RC522是一款高性能、低功耗的NFC和RFID读写器,广泛应用于智能家居、物联网、门禁系统等领域。

本文将详细介绍MFRC522模块的工作原理,带领读者一步步掌握读写程序的步骤,并提供实战应用案例。

一、RC522读写器简介RC522是一款由NXP公司推出的射频识别读写器,支持多种通信协议,如ISO/IEC 18000-3、ISO/IEC 14443、ISO/IEC 15693等。

它具有小巧的体积、高性能、低功耗等特点,易于集成到各种应用系统中。

二、MFRC522模块工作原理MFRC522模块是RC522读写器的核心部分,主要负责与RFID卡片进行通信。

其工作原理如下:1.发射信号:模块通过天线发射一定频率的射频信号,用于激活在其工作范围内的RFID卡片。

2.接收信号:当RFID卡片进入工作范围时,卡片会发送响应信号,包含卡片的信息。

3.数据解调:MFRC522模块接收到响应信号后,对其进行解调、解码,提取出卡片中的有效数据。

4.数据处理:将提取出的数据进行处理,如验证、加密等操作。

5.数据传输:将处理后的数据发送给上位机,以便进行进一步的处理和控制。

三、读写程序步骤详解1.准备工具和材料:RC522读写器、RFID卡片、USB数据线、开发环境(如Arduino、Keil等)。

2.连接硬件:将RC522读写器与开发板连接,如Arduino、树莓派等。

3.安装驱动和库:根据开发环境安装相应的RC522驱动和库,如Arduino 库。

4.编写程序:使用开发环境编写读写程序,实现对RFID卡片的读取和写入操作。

5.调试和优化:通过实际测试,调试和优化程序,确保读写操作的稳定性和准确性。

四、实战应用案例1.智能家居:结合智能家居设备,实现对家电、照明等的远程控制。

2.门禁系统:通过RFID卡片实现员工、访客等人员的进出管理。

mfrc522 手册

mfrc522 手册

mfrc522手册MFRC522是一款常用的RFID读卡器模块,广泛应用于身份识别、门禁控制、移动支付等领域。

以下是对MFRC522的详细介绍:MFRC522是一款由NXP公司生产的低功耗、高灵敏度的RFID读卡器模块,其工作频率为13.56MHz,支持ISO14443A/MIFARE标准。

该模块具有SPI接口,可方便地与微控制器进行通信,从而实现快速、可靠地读取RFID卡的信息。

MFRC522的主要特点包括:1、支持多种RFID卡类型:MFRC522支持ISO14443A标准的RFID卡,包括MIFARE Classic、MIFARE Ultralight等常用卡型。

此外,它还支持多种加密算法,如DES、3DES等,确保数据的安全性。

2、高速数据传输:MFRC522的SPI接口数据传输速率最高可达800kbps,使得读卡器能够快速读取RFID卡的标签信息,提高了系统的响应速度。

3、自动寻卡功能:MFRC522具有自动寻卡功能,当有RFID卡靠近时,读卡器会自动唤醒并读取卡的信息,进一步简化了系统的设计。

4、低功耗设计:MFRC522采用低功耗设计,工作电流较小,有利于延长系统的使用寿命。

5、易于集成:MFRC522具有紧凑的尺寸和易于集成的特点,可方便地与其他电子元件一起应用于各种RFID读卡器设备中。

MFRC522的应用场景非常广泛,包括但不限于:1、身份识别:在门禁控制、考勤系统等应用中,MFRC522可以快速、准确地读取用户的RFID卡信息,从而实现身份的识别和验证。

2、移动支付:通过集成MFRC522,移动设备可以实现非接触式支付功能,为用户带来便捷的支付体验。

3、物流管理:在物流领域,MFRC522可以用于跟踪包裹的位置和状态,提高物流效率。

4、资产管理:在图书馆、仓储等场景中,MFRC522可以帮助管理者追踪和管理资产的位置和状态。

总之,MFRC522是一款功能强大、易于集成的RFID读卡器模块,可广泛应用于各种需要快速、可靠地读取RFID卡信息的场景中。

rc522读写程序

rc522读写程序

rc522读写程序
(最新版)
目录
1.RC522 读写程序简介
2.RC522 读写程序的工作原理
3.RC522 读写程序的应用领域
4.RC522 读写程序的发展前景
正文
RC522 读写程序是一种用于实现射频识别(RFID)技术读写器与标签之间通信的程序。

射频识别技术是一种无线通信技术,可以在不需要机械或光学接触的情况下,通过无线电波实现信息的读取和写入。

RC522 读写程序在很多领域都有广泛的应用,例如物流、零售、生产自动化等。

RC522 读写程序的工作原理非常简单。

首先,读写器会向标签发射一束无线电波,当标签进入电波的范围时,标签内部的天线和芯片会接收到这束电波。

接着,标签芯片会对接收到的电波进行解调,并从中提取出读写器发送的数据。

然后,标签芯片会根据接收到的数据,执行相应的操作,如更改存储在标签内部的数据,或者将标签内部的数据发送回读写器。

最后,读写器会接收到标签发送回来的数据,并进行相应的处理。

RC522 读写程序的应用领域非常广泛。

在物流领域,RC522 读写程序可以用于实现仓库货物的自动化管理,提高货物的出入库效率。

在零售领域,RC522 读写程序可以用于实现商品的自动售卖,提高顾客的购物体验。

在生产自动化领域,RC522 读写程序可以用于实现生产线上物料的自动追踪和管理,提高生产效率。

随着科技的不断发展,RC522 读写程序的发展前景也非常广阔。

未来,RC522 读写程序将会在更多的领域得到应用,如智能家居、智能交通等。

rc522资料

rc522资料
Serial.print("The card's number is: "); memcpy(serNum, str, 5); ShowCardID(serNum);
// Check people associated with card ID uchar* id = serNum; if( id[0]==0x4B && id[1]==0xE6 && id[2]==0xD1 && id[3]==0x3B ) {
#define Reserved13 0x1D #define Reserved14 0x1E #define SerialSpeedReg 0x1F //Page 2:CFG #define Reserved20 0x20 #define CRCResultRegM 0x21 #define CRCResultRegL 0x22 #define Reserved21 0x23 #define ModWidthReg 0x24 #define Reserved22 0x25 #define RFCfgReg 0x26 #define GsNReg 0x27 #define CWGsPReg 0x28 #define ModGsPReg 0x29 #define TModeReg 0x2A #define TPrescalerReg 0x2B #define TReloadRegH 0x2C #define TReloadRegL 0x2D #define TCounterValueRegH 0x2E #define TCounterValueRegL 0x2F //Page 3:TestRegister #define Reserved30 0x30 #define TestSel1Reg 0x31 #define TestSel2Reg 0x32 #define TestPinEnReg 0x33 #define TestPinValueReg 0x34 #define TestBusReg 0x35 #define AutoTestReg 0x36 #define VersionReg 0x37 #define AnalogTestReg 0x38 #define TestDAC1Reg 0x39 #define TestDAC2Reg 0x3A #define TestADCReg 0x3B #define Reserved31 0x3C #define Reserved32 0x3D #define Reserved33 0x3E #define Reserved34 0x3F //-----------------------------------------------

MF RC522应用说明书

MF RC522应用说明书
保留为将来之用 定义发送和接收的常用模式 定义发送过程的数据传输速率 定义接收过程中的数据传输速率 控制天线驱动器管脚 TX1 和 TX2 的逻辑特性 控制天线驱动器的设置 选择天线驱动器的内部源 选择内部的接收器设置 选择位译码器的阈值 定义解调器的设置 保留为将来之用 保留为将来之用 控制 ISO 14443/MIFARE 模式中 106kbit/s 的通信 保留为将来之用 保留为将来之用 选择串行 UART 接口的速率
不同的主机接口功能可满足不同用户的要求。
2.订购信息
待定。
3.管脚信息
3.1 封装
RC522 包含 QFN32 的封装形式。
表 1 封装信息
封装 QFN32
功能注 见第 19 章释的表面封装
2
RC522
3.2 管脚描述
表 2 管脚描述
注:管脚类型: I-输入;O-输出;PWR-电源
符号
QFN32
类型
3
DivIEnReg
4
ComIrqReg
5
DivIrqReg
6
ErrorReg
7
Status1Reg
8
Status2Reg
9
FIFODtataReg
A
FIFOLevelReg
B
WaterLevelReg
C
ControlRegDLeabharlann BitFramingReg
E
CollReg
F
RFU
PAGE1:命令
0
RFU
5.2.1.2 CommandReg 启动和停止命令的执行。
CommandReg 7
00
访问权限
RFU
表 7 CommandReg

RC522 13.56M开发详解一

RC522 13.56M开发详解一

13.56M读卡器开发详解一1.介绍开发方案13.56读写芯片:MFRC522芯片(NXP)QFN封装MCU: STC11F05Esop20封装通信端口:MAX3232esesop16封装天线类型:PCB板载2.硬件介绍2.1MFRC522硬件在每次上电或硬件复位后,MF RC522也复位其接口模式并检测当前微处理器的接口类型。

MF RC522 在复位阶段后根据控制脚的逻辑电平识别微处理器接口。

这是由固定管脚连接的组合和一个专门的初始化程序实现的。

表2.1 检测接口类型的连接配置注:L为低电平----本设计接地H为高电平----本设计接3.3VRC522硬件设计单元原理图1.I2C端口接为低电平,小编想用单片机的SPI通信和串口控制RC5222.EA端口设计为高低电平切换方式,就是想进行串口和SPI口通信切换3.设计的电容、电阻、电感都是已经调试成功的值。

调试注意:1.晶振电容值与晶振匹配值设计,此处需要根据晶振厂家的资料进行电容匹配。

2.VDD电源处电容需要注意,最好用示波器观察电源纹波值大小,如果有纹波建议更换大电容。

2.2 STC11F05E硬件STC11F05E单元原理图调试注意:1.晶振电容值与晶振匹配值设计,此处需要根据晶振厂家的资料进行电容匹配。

2.VCC电源处电容需要注意,最好用示波器观察电源纹波值大小,如果有纹波建议更换大电容或增加0.1UF电容。

3.RST复位端口电容电阻值设计,本设计为4.1V电压复位。

故R30电阻10K,C31电容2.2UF4.P1.0和P1.1 起初烧写程序时需要接低。

2.3MAX3232ESE设计注意:此原理图的5个电容值不要随意更改,详细请看数据手册2.4 PCB图片介绍13.56 PCB天线PCB图片1. 13.56M 频率的天线是通过产生磁场来读卡的。

所以影响此天线的主要因素是天线的电感值。

故天线的长度对电感值影响比较大。

2. 天线的底层不能进行腹铜。

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);}。

  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; ,禁止发射管脚}。

相关文档
最新文档