SG-RC522射频模块原理图

合集下载

基于RC522的非接触式IC卡读卡器设计(含程序)

基于RC522的非接触式IC卡读卡器设计(含程序)

1 绪论1.1 课题的研究背景工业3.0将世界带入信息化的时代,信息技术的发展日新月异,一个以电子商务为主要特征的经济时代成为主要潮流,智能射频卡是一种将用户数据最快捷地送入到环球信息互联网并获得信息的最有用的工具,智能IC卡成为了人们身份识别和实现电子支付的手段,影响了我们生活工作的方式。

智能IC卡与普通磁卡对比具有更高的安全性,所以,对智能IC卡的功能进行研究是非常有意义的。

智能IC卡,又是CPU卡。

顾名思义, 这种卡片上集成了存储器、通信接口及CPU,具有存储数据、对外交流和数据处理的能力,因此,又是一片卡上的单片机系统。

为了使这一系统中的硬件和软件资源充分得到利用, 卡上存放了进行数据读写和安全通信的协议,以及管理这些程序的Chip Operating system卡上操作系统。

这操作系统是按照IC卡性能特征而专门设计的操作系统,它极大地不同于计算机上常见的DOS和WINDOWS 等操作系统,IC 卡存储器的容量大小和CPU的性能的限制着Chip Operating system卡上操作系统。

主要功能是:控制IC卡与读卡器的数据交流;管理IC卡上各种存储器;在IC卡内执行读写器发来的各种操作命令。

有了CPU与COS系统,成就了智能IC卡。

所以,智能射频卡具有超强的管理性能,提供很高的数据安全性和可靠性[1]。

1.2 非接触式IC卡1.2.1 非接触式IC卡的简介非接触式IC卡又称射频卡,由IC芯片、感应天线组成,封装在一个标准的PVC卡片内,芯片及天线无外露部分[2]。

它是全球上最近发展成熟的一项技术,射频识别技术和IC卡技术被成功地结合起来,解决了无源和非接触这一难题,无源即卡中没有电源,这是电子科学领域的一大突破[2]。

卡片接近读写器天线产生电磁场的一定空间范围 (通常为50—100mm),通过电磁波的发送来完成数据的读写操作。

1.2.2 非接触式IC卡的特点(1)操作快捷卡与读卡器之间的通讯是非接触的。

TIDZ-RC522读卡模块使用说明

TIDZ-RC522读卡模块使用说明

TJDZ-RC522 RFID读卡模块
用户操作手册
Ver_1.0_20121101
RC522 RFID读卡模块使用说明
(以MSP430F149处理器为例)
第一步:将RFID模块与MSP430F149最小系统板采用杜邦线连接;
第二步:程序通过BSL下载到MSP430F149中;
第三步:将串口线USB-RS232连接计算机与开发板;
第四步:打开串口调试手(正确设置波特率以及串口号);
第五步:按MSP430F149最小系统板上的复位键,则串口调试手出现如下画面:
第六步:在串口发送区,输入A点击发送,为自动寻卡模式;若输入F点击发送则为单次寻卡模式;
第七步:将卡片放到读卡模块上,则可以看到读出卡的ID号。

测试完毕。

基于MFRC522的Mifare射频卡读写模块开发

基于MFRC522的Mifare射频卡读写模块开发

基于MFRC522的Mifare射频卡读写模块开发IC卡按卡与外界数据传送的形式不同,分为接触式 IC卡和非接触式IC卡。

接触式IC卡通过触点从读写模块获取能量和交换数据;非接触式IC卡通过射频感应从读写模块获取能量和交换数据,所以非接触式IC卡又叫射频卡。

与传统的接触式IC卡、磁卡相比较,利用射频识别技术(radio frequency identification)开发的非接触式IC识别器,在系统寿命、防监听、防解密等性能上具有很大的优势。

目前我国引进的射频 IC卡主要有 Philips公司的 Mifare卡和 ATMEL公司的 Temic 卡。

而PHILIPS公司的 Mifare卡现在是市场的主流产品,应用越来越广。

本文介绍的是利用基于 ARM7 CPU 的 LPC2132、MF RC522、Mifare卡等构建射频识别模块的设计,并在该读写模块基础上能很容易地开发出适用于各方面的自动识别系统。

1 MF RC522介绍MF RC522是 Philips公司针对三表最新推出的一款非接触式低功耗读写基站芯片,它是应用于13.56MHz非接触式通信中高集成读卡芯片系列中的一员。

该读卡芯片系列利用了先进的调制和解调概念,完全集成了13.56MHz下所有类型的被动非接触式通读方式和协议。

MF RC522支持ISO14443A所有的层,传输速度最高达424kbps,内部的发送器部分不需要增加有源电路就能够直接驱动近距离天线,接收部分提供了一个坚固而有效的解调和解码电路,用于接收ISO14443A兼容的应答信号。

数字处理部分提供奇偶和CRC检测功能。

RC522具有三种接口方式可方便地与任何 MCU通讯:SPI模式、UART模式、I2C模式。

甚至可通过RS232或 RS485通讯方式直接与PC机相联,给终端设计提供了前所未有的灵活性。

2 系统组成如图1所示,系统主要由MCU LPC2132、MF RC522、人机接口以及通信模块组成。

地铁直流开关柜二次原理图解析lp

地铁直流开关柜二次原理图解析lp

江苏长江电器股份有限公司直流开关柜二次原理图解析武汉市轨道交通公司总工办二OO三年五月目录1、直流柜主要元器件的符号......................................2、端子柜继电器一览表..........................................3、辅助电源MCB的编号及数量统计................................二、端子柜继电器作用简述.........................................三、SEPCOS的输入与输出 ..........................................1、端子柜......................................................2、馈线柜......................................................四、DS±、DSK及HSCB的控制逻辑框图(简化) .....................1、DSK的控制框图...............................................2、HSCB的控制框图..............................................3、DS-的控制框图...............................................4、DS+的控制框图...............................................五、直流供电运行操作.............................................1、供电操作顺序................................................2、DS—的合/分操作..............................................3、DS+的合/分操作..............................................4、DSK的合/分操作..............................................5.DSL柜K600的合/分操作.......................................6.HSCB的合/分操作..............................................7.HSCB手车位置的判断及解锁....................................8.DSL的合/分操作..............................................六、保护及联跳 ...................................................⒈线路测试及自动重合闸原理.....................................2、HSCB联跳原理................................................2.1同一区域供电联跳...........................................2.2越区供电联跳 ..............................................3.保护跳闸....................................................3.1框架泄漏保护(或正极接地)动作.................................3.2进线柜出现逆流.............................................3.3直流柜门打开 ..............................................3.4DS手柄解锁................................................3.5手车解锁..................................................3.6紧急分闸..................................................3.710KVCB跳闸联跳全部HSCB .....................................3.8不能满足合HSCB的联锁要求 ...................................4.保护信号.....................................................4.1750V母线电压测量(或正极接地监测)熔断器熔断.....................4.2线路测试熔断器故障 .........................................4.3馈线柜控制回路故障 .........................................4.4HSCB线圈回路故障...........................................4.5不允许合/分DSK的故障.......................................4.6DSK在“闭锁”或“手柄解锁”状态不能电动合/分 ...................4.7端子柜辅助电源故障 .........................................4.8DS±电路故障...............................................4.9DS±故障..................................................4.10DSL电路故障 ..............................................4.11DSL故障..................................................一、元器件的分类符号及编号1、直流柜主要元器件的符号2、端子柜继电器一览表3、辅助电源MCB的编号及数量统计二、端子柜继电器作用简述三、SEPCOS的输入与输出1、端子柜(1) (2)14~15““““10“11(3)14~15DSDSDS闭锁2、馈线柜(1)“12~13”板“7”窗及“14~15”板“2”窗内容:故障——“10“10 “10“10”板“6”窗状态:外部(F14/1“9”板“1”窗状态:DS 马达回路故障(2)“14~15”板“10~11DSK 位置故障“9”板“3“9”板“2“9”板“4四、DS ±、DSK 及HSCB 的控制逻辑框图(简化)1、DSK 的控制框图DS DS 分闸DS 状态故障DS 合/分6窗/9板状态:DS 合闸 DS 分闸命令命令故障 DS 分闸状态 DS 合闸状态 DS 分闸命令 DS 分闸位置1窗/9板状态:DS2窗/9板状态:DS 3窗/9板状态:DS 4窗/9板状态:DS 接入记忆装置 HSCB 在分闸位置 DS 分闸位置DS DS 合闸命令2、HSCB 2.1HSCB HSCB 合闸→→HSCB 状态故障HSCB 合/HSCB 分闸→→HSCB 未接通HSCB 断开位置→HSCB分闸状态HSCB2窗/12~13DSK DSK (2窗/9断开2.2△U 保护12窗/101窗/11HSCB8窗/10板命令:HSCB 状态故障DSK 手车位置故障2窗/9HSCB 2.34窗/107窗/102.4馈线绝缘低2窗/10F14/11窗/103窗/102.5I max+ I max_DDL_HSCB 2.62.7板)(接灯)2.8直接脱扣信号HSCB(4窗/14~15板)(接遥信)3、DS-的控制框图状态:DS —状态:DS —状态:DS —状态:DS —状态:状态:HSCB 命令:DS —DS +4、DS+的控制框图状态:DS +状态:DS +状态:DS +状态:DS +状态:状态:HSCB 命令:DS +DS —状态:框泄保护动作五、直流供电运行操作假设:1.10KV 二次进线CB 已合闸;2.750V 直流供电采用遥控操作。

51单片机RC522射频卡驱动

51单片机RC522射频卡驱动

/*-----------------------------------------------.H文件-----------------------------------------*/#ifndef __RC522_H_#define __RC522_H_///////////////////////////////////////////////////////////////////////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#define MAXRLEN 18///////////////////////////////////////////////////////////////////////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 #define FIFOLevelReg 0x0A #define WaterLevelReg 0x0B #define ControlReg 0x0C #define BitFramingReg 0x0D #define CollReg 0x0E #define RFU0F 0x0F // PAGE 1#define RFU10 0x10 #define ModeReg 0x11 #define TxModeReg 0x12 #define RxModeReg 0x13 #define TxControlReg 0x14 #define TxAutoReg 0x15 #define TxSelReg 0x16 #define RxSelReg 0x17 #define RxThresholdReg 0x18 #define DemodReg 0x19 #define RFU1A 0x1A #define RFU1B 0x1B #define MifareReg 0x1C #define RFU1D 0x1D #define RFU1E 0x1E #define SerialSpeedReg 0x1F// PAGE 2#define RFU20 0x20 #define CRCResultRegM 0x21 #define CRCResultRegL 0x22 #define RFU23 0x23 #define ModWidthReg 0x24 #define RFU25 0x25 #define RFCfgReg 0x26 #define GsNReg 0x27 #define CWGsCfgReg 0x28 #define ModGsCfgReg 0x29 #define TModeReg 0x2A #define TPrescalerReg 0x2B#define TReloadRegH 0x2C#define TReloadRegL 0x2D#define TCounterValueRegH 0x2E#define TCounterValueRegL 0x2F// PAGE 3#define RFU30 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 RFU3C 0x3C#define RFU3D 0x3D#define RFU3E 0x3E#define RFU3F0x3F///////////////////////////////////////////////////////////////////// //和MF522通讯时返回的错误代码///////////////////////////////////////////////////////////////////// #define MI_OK 0#define MI_NOTAGERR (-1)#define MI_ERR (-2)#define SHAQU10X01#define KUAI40X04#define KUAI70X07#define REGCARD0xa1#define CONSUME0xa2#define READCARD0xa3#define ADDMONEY0xa4//void delay_ns(uint16 ns);void delay10us(void);void delay1ms(void);uint8 SPIReadByte(void);void SPIWriteByte(uint8 SPIData);char PcdRequest(uint8 req_code,uint8 *pTagType);char PcdAnticoll(uint8 *pSnr);char PcdSelect(unsigned char *pSnr);char PcdAuthState(uint8 auth_mode,uint8 addr,uint8 *pKey,uint8 *pSnr);char PcdRead(uint8 addr,uint8 *pData);char PcdWrite(uint8 addr,uint8 *pData);char PcdHalt(void);void CalulateCRC(uint8 *pIndata,uint8 len,uint8 *pOutData);char PcdReset(void);char M500PcdConfigISOType(uint8 type);uint8 ReadRawRC(uint8 Address);void WriteRawRC(uint8 Address, uint8 value);void SetBitMask(uint8 reg,uint8 mask);void ClearBitMask(uint8 reg,uint8 mask);char PcdComMF522(uint8 Command,uint8 *pInData,uint8 InLenByte,uint8 *pOutData,uint16 *pOutLenBit);void PcdAntennaOn(void);void PcdAntennaOff(void);void InitRc522(void);void delay1ms500us(void);sbit SPI_CS = P1^3;sbit SPI_CK = P1^4;sbit SPI_MOSI = P1^5;sbit SPI_MISO = P1^6;sbit SPI_RST = P1^7;#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 SET_SPI_MISO SPI_MISO#define SET_RC522RST SPI_RST=1#define CLR_RC522RST SPI_RST=0#endif/*-----------------------------------------------.c文件-----------------------------------------*/#include "rc522.h"/*void delay_ns(uint16 ns){uint16 xdata i;for(i=0;i<ns;i++){nop();nop();nop();}}*/void delay10us(void) //误差0us{unsigned char a,b;for(b=1;b>0;b--)for(a=2;a>0;a--);}void delay1ms(void) //误差0us{unsigned char a,b,c;for(c=1;c>0;c--)for(b=142;b>0;b--)for(a=2;a>0;a--);}void delay1ms500us(void) //误差0us{uint8 xdata a,b;for(b=115;b>0;b--)for(a=5;a>0;a--);}uint8 SPIReadByte(void){uint8 xdata SPICount; // Counter used to clock out the datauint8 xdata 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(SET_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(uint8 SPIData){uint8 xdata 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(uint8 req_code,uint8 *pTagType){char xdata status;uint16 xdata unLen;uint8 xdata ucComMF522Buf[MAXRLEN];ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x07);SetBitMask(TxControlReg,0x03);ucComMF522Buf[0] = req_code;status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);if ((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(uint8 *pSnr){char xdata status;uint8 xdata i,snr_check=0;uint16 xdata unLen;uint8 xdata ucComMF522Buf[MAXRLEN];ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x00);ClearBitMask(CollReg,0x80);ucComMF522Buf[0] = PICC_ANTICOLL1;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);return status;}///////////////////////////////////////////////////////////////////////功能:选定卡片//参数说明: pSnr[IN]:卡片序列号,4字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdSelect(uint8 *pSnr){char xdata status;uint8 xdata i;uint16 xdata unLen;uint8 xdata 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);status = 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(uint8 auth_mode,uint8 addr,uint8 *pKey,uint8 *pSnr){char xdata status;uint16 xdata unLen;uint8 xdata i,ucComMF522Buf[MAXRLEN];ucComMF522Buf[0] = auth_mode;ucComMF522Buf[1] = addr;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(uint8 addr,uint8 *pData){char xdata status;uint16 xdata unLen;uint8 xdata 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(uint8 addr,uint8 *pData){char xdata status;uint16 xdata unLen;uint8 xdata i,ucComMF522Buf[MAXRLEN];ucComMF522Buf[0] = PICC_WRITE;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 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<len; 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<<RC522RST);SET_RC522RST;delay10us();//PORTD&=~(1<<RC522RST);CLR_RC522RST;delay10us();//PORTD|=(1<<RC522RST);SET_RC522RST;delay10us();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);//3FWriteRawRC(RxSelReg,0x86);//84WriteRawRC(RFCfgReg,0x7F); //4FWriteRawRC(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<InLenByte; i++){ WriteRawRC(FIFODataReg, pInData[i]); }WriteRawRC(CommandReg, Command);if (Command == PCD_TRANSCEIVE){ SetBitMask(BitFramingReg,0x80); }//i = 600;//根据时钟频率调整,操作M1卡最大等待时间25msi = 2000;do{n = ReadRawRC(ComIrqReg);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 (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){uint8 xdata i;i = ReadRawRC(TxControlReg);if (!(i & 0x03)){SetBitMask(TxControlReg, 0x03);}}///////////////////////////////////////////////////////////////////// //关闭天线///////////////////////////////////////////////////////////////////// void PcdAntennaOff(void){ClearBitMask(TxControlReg, 0x03);}///////////////////////////////////////////////////////////////////// //rc522初始化///////////////////////////////////////////////////////////////////// void InitRc522(void){PcdReset();PcdAntennaOff();delay1ms500us();PcdAntennaOn();M500PcdConfigISOType( 'A' );}。

射频电路原理框图PPT课件

射频电路原理框图PPT课件

.
18
射频电路的主要元件及工作原理
• MT6129系列采用非常低中频结构(与零中频相比,能够改 善阻塞抑制、AM抑制、邻道选择性,不需DC偏移校正,对 SAW FILTER共模平衡的要求降低),采用镜像抑制(35dB 抑制比)混频滤波下变频到IF,第1中频频率为:GSM 200KHZ,DCS/PCS 100KHZ。第1IF信号通过镜像抑制滤 波器和PGA(每步2dB共78dB动态范围)进行滤波放大,经 第2混频器下变频到基带IQ信号,频率为67.708KHz。
.
21
射频电路的主要元件及工作原理
当混频器的输出信号为信号频率与本振信号之差,且 比信号频率高时,所用的变频器被称为下边带上变频。
• 在接收机电路中的混频器是下变频器,即混频器输出 的信号频率比输入信号频率低;在发射机电路中的混 频器通常用于发射上变频,它将发射中频信号与 UHFVCO(或RXVCO)信号进行混频,得到最终发射信 号。
.
27
射频电路的主要元件及工作原理
• 在GSM 系统中,有一个公共的广播控制信道(BCCH), 它包含频率校正信息与同步信息等。手机一开机,就会在 逻辑电路的控制下扫描这个信道,从中获取同步与频率校 正信息,如手机系统检测到手机的时钟与系统不同步,手 机逻辑电路就会输出AFC 信号。AFC 信号改变 13MHz/26MHz 电路中VCO 两端的反偏压,从而使该 VCO 电路的输出频率发生变化,进而保证手机与系统同 步。
.
3
手机通用的接收与发射流程
1、信号接收流程: 天线接收——天线匹配电路——双工器——滤波(声 表面滤波器SAWfilter)——放大(低噪声放大器 LNA)——RX_VCO混频(混频器Mixer)——放大 (可编程增益放大器PGA)——滤波——IQ解调(IQ 调制器)——(进入基带部分)GMSK解调——信道均 衡——解密——去交织——语音解码——滤波—— DAC——放大——话音输出。

RFID-MFRC522

RFID-MFRC522

RFID一、概述 (2)二、系统组成 (2)三、非接触式IC卡—M1卡 (3)1、外观 (3)2、结构 (3)3、功能 (4)4、Mifare 1 S50卡存储EEPROM (7)四、读卡器—MFRC522 (9)1、内部框图 (10)2、电路图 (11)3、MFRC522支持的三种接口 (12)4、工作过程 (12)五、结果 (17)一、概述通过点名、磁卡和接触式IC卡等方式对学生的到课情况进行考勤、记录管理,既耗时又相互干扰;而非接触式RFID学生考勤系统实现了利用无线射频识别技术对学生考勤管理,既方便、快捷,又省时。

而且通过物联网和PC机终端对数据进行处理。

二、系统组成学生智能考勤系统由四大部分组成,非接触式IC卡、读卡器、单片机及PC 终端。

如下图学生考勤系统组成1.当保存有学生基本信息的IC卡进入读卡器天线作用范围内时,卡片获得能量以维持卡内部电路工作;2.单片机负责控制读卡器进行一系列“寻卡→防冲突→选卡→读/写卡”操作,如果成功,将读取到卡片上的学生信息;3.单片机将学生信息发送到PC终端,由PC机对一步对数据进行处理。

三、非接触式IC卡—Mifare One卡1、外观非接触式IC卡2、结构非接触式IC卡的薄膜结构卡内部结构3、功能功能框图读卡器通过天线发射激励信号(一组固定频率的电磁波),IC卡进入读写器工作区内,被读写器信号激励。

在电磁波的激励下,卡内的LC串联谐振电路产生共振,从而使电容内有了电荷,在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内储存,当所积累的电荷达到2 V时,此电容可以作为电源为其他电路提供工作电压,供卡内集成电路工作所需。

(1)ATR模块:Answer To Request(“请求之应答”)当一张MIFARE 1卡处在读写器的天线工作范围之内时,程序员控制读写器向卡发出Request all(或Request std)命令后,卡的ATR将启动,将卡片块0 中2个字节的卡类型号(TagType)传送给读写器,建立卡与读写器的第一步通信联络。

RFID_MFRC522要点

RFID_MFRC522要点

RFID一、概述 (2)二、系统组成 (2)三、非接触式IC卡—M1卡 (2)1、外观 (2)2、结构 (3)3、功能 (3)4、Mifare 1 S50卡存储EEPROM (5)四、读卡器—MFRC522 (7)1、内部框图 (7)2、电路图 (8)3、MFRC522支持的三种接口 (9)4、工作过程 (9)五、结果 (13)一、概述通过点名、磁卡和接触式IC卡等方式对学生的到课情况进行考勤、记录管理,既耗时又相互干扰;而非接触式RFID学生考勤系统实现了利用无线射频识别技术对学生考勤管理,既方便、快捷,又省时。

而且通过物联网和PC机终端对数据进行处理。

二、系统组成学生智能考勤系统由四大部分组成,非接触式IC卡、读卡器、单片机及PC 终端。

如下图学生考勤系统组成1.当保存有学生基本信息的IC卡进入读卡器天线作用范围内时,卡片获得能量以维持卡内部电路工作;2.单片机负责控制读卡器进行一系列“寻卡→防冲突→选卡→读/写卡”操作,如果成功,将读取到卡片上的学生信息;3.单片机将学生信息发送到PC终端,由PC机对一步对数据进行处理。

三、非接触式IC卡—Mifare One卡1、外观非接触式IC卡2、结构非接触式IC卡的薄膜结构卡内部结构3、功能功能框图读卡器通过天线发射激励信号(一组固定频率的电磁波),IC卡进入读写器工作区内,被读写器信号激励。

在电磁波的激励下,卡内的LC串联谐振电路产生共振,从而使电容内有了电荷,在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内储存,当所积累的电荷达到2 V时,此电容可以作为电源为其他电路提供工作电压,供卡内集成电路工作所需。

(1)ATR模块:Answer To Request(“请求之应答”)当一张MIFARE 1卡处在读写器的天线工作范围之内时,程序员控制读写器向卡发出Request all(或Request std)命令后,卡的ATR将启动,将卡片块 0 中2个字节的卡类型号(TagType)传送给读写器,建立卡与读写器的第一步通信联络。

RFID RC522和PN532的区别

RFID RC522和PN532的区别

RFID RC522和PN532的区别简单的说,就是协议支持的类型PN 比RC系列更多。

PN支持NFC协议,RC主要是支持ISO14443A/B。

RC522是一款NXP 公司的支持ISO14443A协议的高频的射频芯片,PN532这个款芯片是支持NFC功能一款射频芯片,也是NXP公司的。

RC522特性◆高集成度的调制解调电路;◆采用少量外部器件,即可将输出驱动级接至天线;◆支持ISO/IEC 14443 TypeA 和MIFARE®通信协议;◆读写器模式中与ISO 14443A/MIFARE®的通信距离高达50mm,取决于天线的长度和调谐。

◆支持ISO 14443 212kbit/s 和424kbit/s 的更高传输速率的通信。

◆支持MIFARE® Classic 加密;◆支持的主机接口:-10Mbit/s 的SPI 接口-I2C 接口,快速模式的速率为400kbit/s,高速模式的速率为3400kbit/s-串行UART,传输速率高达1228.8kbit/s,帧取决于RS232 接口,电压电平取决于提供的管脚电压◆64 字节的发送和接收FIFO 缓冲区;◆灵活的中断模式;◆可编程定时器。

◆具备硬件掉电、软件掉电和发送器掉电 3 种节电模式,前两种模式雷同于MFRC500 和CL RC400,其特有的“发送器掉电”则可关闭内部天线驱动器,即关闭RF 场;◆内置温度传感器,以便在芯片温度过高时自动停止RF 发射;◆采用相互独立的多组电源供电,以避免模块间的相互干扰,提高工作的稳定性;◆具备CRC 和奇偶校验功能,CRC 协处理器的16 位长CRC 计算多项式固定为:x16+x12+x5+1,符合ISO/1EC14443 和CCTITT 协议;◆内部振荡器,连接27.12MHz 的晶体;◆2.5~3.3V 的低电压低功耗设计;◆工作温度范围-30~+85℃;◆5mm&TImes;5mm&TImes;0.85mm 的超小体积。

rc522天线

rc522天线

1 系统组成读卡器模块包括MCU、读卡器芯片、天线及其滤波匹配电路。

MCU选用TI公司的超低功耗单片机MSP430F149,该单片机支持多种低功耗模式,并能够快速唤醒,具有60 KB+256 B的Flash、2 KB的RAM、两个既可做异步UART又可以做SPI使用的串行通讯口、6组I/O口、一个内部DCO和2 个外部时钟,非常适合开发低功耗高性能的产品[3]。

在本模块中MCU通过SPI方式与MFRC522连接,供电电压均为3.3 V,所以不再需要外围的电压转换电路,外接一个天线及简单的滤波匹配电路,即可实现与卡片的通信。

2 工作原理MCU通过对读卡器芯片内寄存器的读写来控制读卡器芯片,读卡器芯片收到MCU发来的命令后,按照非接触式射频卡协议格式,通过天线及其匹配电路向附近发出一组固定频率的调制信号(13.56 MHz)进行寻卡,若此范围内有卡片存在,卡片内部的LC谐振电路(谐振频率与读卡器发送的电磁波频率相同)在电磁波的激励下,产生共振,在卡片内部电压泵的作用下不断为其另一端的电容充电,获得能量,当该电容电压达到2 V时,即可作为电源为卡片的其他电路提供工作电压。

当有卡片处在读卡器的有效工作范围内时,MCU向卡片发出寻卡命令,卡片将回复卡片类型,建立卡片与读卡器的第一步联系,若同时有多张卡片在天线的工作范围内,读卡器通过启动防冲撞机制,根据卡片序列号来选定一张卡片,被选中的卡片再与读卡器进行密码校验,确保读卡器对卡片有操作权限以及卡片的合法性,而未被选中的则仍然处在闲置状态,等待下一次寻卡命令。

密码验证通过之后,就可以对卡片进行读写等应用操作。

3 MF RC522与MCU接口实现MF RC522提供了3种接口模式:高达10 Mb/s的SPI、I2C总线模式(快速模式下能达400 kb/s,而高速模式下能达3.4 Mb/s)、最高达1228.8 kb/s的UART模式。

每次上电或硬件重启之后MFRC522复位其接口,并通过检测控制引脚上的电平信号来判别当前与主机的接口模式,这样给读写设备的开发带来了极大的可选择性。

MFRC522

MFRC522

MFRC522预付费水表、预付费燃气表、预付费热量表等接触式卡表受到环境温度、湿度、油污等外界条件的影响,大大缩短了对卡表的使用寿命,因此非接触卡表已成为当前发展趋势。

这里给出了一种基于射频器件MFRC522的智能仪表设计,提高了智能仪表的使命寿命。

1 MFRC522简介1.1 MFRC522的特点MFRC522采用串行通信方式与主机通信,可根据用户需求,选用SPI、I2C或串行UART工作模式,有利于减少连线,缩小PCB板面积,降低成本。

MFRC522主要特点如下:高度集成的调制解调电路,采用少量外部器件,即可将输出驱动级接至天线;支持ISO/IEC 14443 FypeA接口和MIFARE通信协议:支持多种主机接口:10 Mbit/s的SPI接口;I2C接口,快速模式的速率为400 Kbit/s,高速模式的速率为3 400 Kbit/s;串行UART,传输速率可以高达1 228.8 Kbit/s,帧取决于RS232接口;特有的发送器掉电机制可关闭内部天线驱动器,即关闭RF场,达到低功耗;内置温度传感器,在过热时自动停止RF发射;独立的多组电源供电,避免相互干扰,优化EMC特性和信号退耦性能;2.5 V~3.6 V的低压、低功耗,采用5 mm×5 mm×0.85 mm的超小型HVQFN32封装。

1.2 MFRC522的内部结构MFRC522的内部结构框图如图1所示。

MFRC522支持可直接相连的各种微控制器接口,如SPI、I2C 和串行UART。

MFRC522能使其接口复位自动检测上电或硬复位的当前微控制器接口类型。

可通过复位控制引脚的逻辑电平来识别微控制器接口。

数据处理部分实现数据并行一串行转换。

可支持CRC和奇偶校验。

由于MFRC522以完全透明的模式操作,因而支持ISO14443A所有层。

状态和控制部分用于配置器件,以适应环境影响并使性能达到最佳。

当MFRC522与MIFARE通信时,使用高速CRYPTO1流密码单元和一个可靠的非易失性密钥存储器。

51单片机RC522射频卡驱动

51单片机RC522射频卡驱动

/*-----------------------------------------------.H文件-----------------------------------------*/#ifndef __RC522_H_#define __RC522_H_///////////////////////////////////////////////////////////////////////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#define MAXRLEN 18///////////////////////////////////////////////////////////////////////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 #define FIFOLevelReg 0x0A #define WaterLevelReg 0x0B #define ControlReg 0x0C #define BitFramingReg 0x0D #define CollReg 0x0E #define RFU0F 0x0F // PAGE 1#define RFU10 0x10 #define ModeReg 0x11 #define TxModeReg 0x12 #define RxModeReg 0x13 #define TxControlReg 0x14 #define TxAutoReg 0x15 #define TxSelReg 0x16 #define RxSelReg 0x17 #define RxThresholdReg 0x18 #define DemodReg 0x19 #define RFU1A 0x1A #define RFU1B 0x1B #define MifareReg 0x1C #define RFU1D 0x1D #define RFU1E 0x1E #define SerialSpeedReg 0x1F// PAGE 2#define RFU20 0x20 #define CRCResultRegM 0x21 #define CRCResultRegL 0x22 #define RFU23 0x23 #define ModWidthReg 0x24 #define RFU25 0x25 #define RFCfgReg 0x26 #define GsNReg 0x27 #define CWGsCfgReg 0x28 #define ModGsCfgReg 0x29 #define TModeReg 0x2A #define TPrescalerReg 0x2B#define TReloadRegH 0x2C#define TReloadRegL 0x2D#define TCounterValueRegH 0x2E#define TCounterValueRegL 0x2F// PAGE 3#define RFU30 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 RFU3C 0x3C#define RFU3D 0x3D#define RFU3E 0x3E#define RFU3F0x3F///////////////////////////////////////////////////////////////////// //和MF522通讯时返回的错误代码///////////////////////////////////////////////////////////////////// #define MI_OK 0#define MI_NOTAGERR (-1)#define MI_ERR (-2)#define SHAQU10X01#define KUAI40X04#define KUAI70X07#define REGCARD0xa1#define CONSUME0xa2#define READCARD0xa3#define ADDMONEY0xa4//void delay_ns(uint16 ns);void delay10us(void);void delay1ms(void);uint8 SPIReadByte(void);void SPIWriteByte(uint8 SPIData);char PcdRequest(uint8 req_code,uint8 *pTagType);char PcdAnticoll(uint8 *pSnr);char PcdSelect(unsigned char *pSnr);char PcdAuthState(uint8 auth_mode,uint8 addr,uint8 *pKey,uint8 *pSnr);char PcdRead(uint8 addr,uint8 *pData);char PcdWrite(uint8 addr,uint8 *pData);char PcdHalt(void);void CalulateCRC(uint8 *pIndata,uint8 len,uint8 *pOutData);char PcdReset(void);char M500PcdConfigISOType(uint8 type);uint8 ReadRawRC(uint8 Address);void WriteRawRC(uint8 Address, uint8 value);void SetBitMask(uint8 reg,uint8 mask);void ClearBitMask(uint8 reg,uint8 mask);char PcdComMF522(uint8 Command,uint8 *pInData,uint8 InLenByte,uint8 *pOutData,uint16 *pOutLenBit);void PcdAntennaOn(void);void PcdAntennaOff(void);void InitRc522(void);void delay1ms500us(void);sbit SPI_CS = P1^3;sbit SPI_CK = P1^4;sbit SPI_MOSI = P1^5;sbit SPI_MISO = P1^6;sbit SPI_RST = P1^7;#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 SET_SPI_MISO SPI_MISO#define SET_RC522RST SPI_RST=1#define CLR_RC522RST SPI_RST=0#endif/*-----------------------------------------------.c文件-----------------------------------------*/#include "rc522.h"/*void delay_ns(uint16 ns){uint16 xdata i;for(i=0;i<ns;i++){nop();nop();nop();}}*/void delay10us(void) //误差0us{unsigned char a,b;for(b=1;b>0;b--)for(a=2;a>0;a--);}void delay1ms(void) //误差0us{unsigned char a,b,c;for(c=1;c>0;c--)for(b=142;b>0;b--)for(a=2;a>0;a--);}void delay1ms500us(void) //误差0us{uint8 xdata a,b;for(b=115;b>0;b--)for(a=5;a>0;a--);}uint8 SPIReadByte(void){uint8 xdata SPICount; // Counter used to clock out the datauint8 xdata 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(SET_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(uint8 SPIData){uint8 xdata 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(uint8 req_code,uint8 *pTagType){char xdata status;uint16 xdata unLen;uint8 xdata ucComMF522Buf[MAXRLEN];ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x07);SetBitMask(TxControlReg,0x03);ucComMF522Buf[0] = req_code;status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);if ((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(uint8 *pSnr){char xdata status;uint8 xdata i,snr_check=0;uint16 xdata unLen;uint8 xdata ucComMF522Buf[MAXRLEN];ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x00);ClearBitMask(CollReg,0x80);ucComMF522Buf[0] = PICC_ANTICOLL1;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);return status;}///////////////////////////////////////////////////////////////////////功能:选定卡片//参数说明: pSnr[IN]:卡片序列号,4字节//返回: 成功返回MI_OK/////////////////////////////////////////////////////////////////////char PcdSelect(uint8 *pSnr){char xdata status;uint8 xdata i;uint16 xdata unLen;uint8 xdata 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);status = 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(uint8 auth_mode,uint8 addr,uint8 *pKey,uint8 *pSnr){char xdata status;uint16 xdata unLen;uint8 xdata i,ucComMF522Buf[MAXRLEN];ucComMF522Buf[0] = auth_mode;ucComMF522Buf[1] = addr;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(uint8 addr,uint8 *pData){char xdata status;uint16 xdata unLen;uint8 xdata 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(uint8 addr,uint8 *pData){char xdata status;uint16 xdata unLen;uint8 xdata i,ucComMF522Buf[MAXRLEN];ucComMF522Buf[0] = PICC_WRITE;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 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<len; 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<<RC522RST);SET_RC522RST;delay10us();//PORTD&=~(1<<RC522RST);CLR_RC522RST;delay10us();//PORTD|=(1<<RC522RST);SET_RC522RST;delay10us();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);//3FWriteRawRC(RxSelReg,0x86);//84WriteRawRC(RFCfgReg,0x7F); //4FWriteRawRC(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<InLenByte; i++){ WriteRawRC(FIFODataReg, pInData[i]); }WriteRawRC(CommandReg, Command);if (Command == PCD_TRANSCEIVE){ SetBitMask(BitFramingReg,0x80); }//i = 600;//根据时钟频率调整,操作M1卡最大等待时间25msi = 2000;do{n = ReadRawRC(ComIrqReg);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 (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){uint8 xdata i;i = ReadRawRC(TxControlReg);if (!(i & 0x03)){SetBitMask(TxControlReg, 0x03);}}///////////////////////////////////////////////////////////////////// //关闭天线///////////////////////////////////////////////////////////////////// void PcdAntennaOff(void){ClearBitMask(TxControlReg, 0x03);}///////////////////////////////////////////////////////////////////// //rc522初始化///////////////////////////////////////////////////////////////////// void InitRc522(void){PcdReset();PcdAntennaOff();delay1ms500us();PcdAntennaOn();M500PcdConfigISOType( 'A' );}。

RC522教程(基于mps430)

RC522教程(基于mps430)

RFID-RC522速成教程(基于msp430单片机的程序讲解)学习一种模块,有很多种方法,其中一种方式是先去弄明白怎么使用这个模块,亲自体验了这个模块的大体功能之后,再回过头来了解该模块的工作原理,再去深层次的研究该模块。

在这里,着重介绍怎么用程序实现RC522模块的一些功能,而RC522的结构,功能等便不再介绍。

这个程序的讲解是基于MSP430F149/169单片机的。

模块使用的是SPI接口,与单片机接口如下:#define RF_LPCTL BIT3 // P2.3 射频卡休眠控制------RST#define RF_SS BIT7 // p2.7 射频卡从机选择(SS)---SDA#define RF_SCLK BIT6 // p2.6 射频卡数据时钟输出(SCLK)#define RF_DATA_OUT BIT5 // p2.5 射频卡数据输出(MOSI)#define RF_DATA_IN BIT1 // p2.1 射频模块输入(MISO)要想对模块内部的数据块进行读写,需要完成4个步骤:寻卡→防冲突→选卡→读/写卡;第一步:寻卡。

status2=PcdRequest(0x52,Temp);////寻卡参数Temp为返回的卡类型if(status2== MI_OK){tochar(Temp[0]);tochar(Temp[1]);//输出卡类型}其中0x52代表寻天线区内全部卡。

卡类型(TagType):0x4400 = Mifare_UltraLight0x0400 = Mifare_One(S50)0x0200 = Mifare_One(S70)0x0800 = Mifare_Pro(X)0x4403 = Mifare_DESFire比如,当Temp[0]=04,Temp[1]=00时,卡类型为S50。

第二步:防冲突。

status2 = PcdAnticoll(UID); //防冲撞处理,输出卡片序列号,4字节if(status2==MI_OK){PutString0("Card Id is:");tochar(UID[0]);tochar(UID[1]);tochar(UID[2]);tochar(UID[3]); //输出卡片序列号}第三步:选卡。

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. 天线的底层不能进行腹铜。

RC522

RC522

本文设计的读卡器系统以PICl6F7x单片机作为主控芯片,选用MIFARE S50卡片,读卡器与卡片间以106kbps速率通信,同时实现读卡过程中的防冲突处理和对卡E2PROM块内容的读/写等功能。

读卡器内部设置了FLASH存储器以存放卡数据,在FLASH容量满的情况下可通过读卡器的以太网口读出全部数据到管理中心上位机,便于建立对卡数据的综合管理系统。

1 硬件系统设计读卡器硬件框图如图1所示。

单片机PICl6F7x通过SPI总线与RC522和FLASH芯片AT45D011相连,同时用简化的ISA 总线连接以太网接口芯片C58900,以提供连接到局域网的能力。

AT45D0ll存储容量为lMb,可同时存储7400多组MIFARE的E2PROM块和UID号,提供了足够读卡器一天内读取的信息量的存放容量。

对于RC522天线部分的设计,PHILIPS公司有专门的手册详细介绍,本文不再赘述。

RC522的SPI总线接口有其自身的时序要求。

它只能工作于从模式,最高传输速率为10 Mbps,数据与时钟相位关系满足“空闲态时钟为低电平,在时钟上升沿同步接收和发送数据,在下降沿数据转换”的约束关系。

PICl6F7x系列单片机的片上外设包括1个SSP模块。

该模块可配置为SPI接口使用,通过相应的寄存器可控制SPI接口的数据传输率、数据一时钟相位天系等通信参数。

本文中配置SSP模块工作于SPI主模式下,时钟为1/4单片机主频,接收和发送数据都在时钟上升沿发生。

需要注意的是,由于RC522支持的数字接口形式多种多样,因此芯片在每次复位时都会检测外部引脚连接关系。

对于SPI接口,RC522的相关引脚必须按照图2所示的连接关系配置。

除了通用的4条SPI信号线(时钟线SCK、输入数据线MOSI、输出数据线MOSO和选通线NSS)以外,RC522要求额外的2个引脚I2C和EA分别固定接低电平和高电平。

这2个引脚不参与SPI总线传输,只起设定RC522数字界面采用SPI接口的作用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档