/* * RFID.cpp - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT. * Based on code Dr.Leong ( WWW.B2CQSHOP.COM ) * Created by Miguel Balboa, Jan, 2012. * Released into the public domain. * 整理者:极客工坊bg1lsy (lsy@sogou.com) * 整理时间:2013.05.25 */ /****************************************************************************** * 包含文件 ******************************************************************************/ #include #include /****************************************************************************** * 构造 RFID * int chipSelectPin RFID /ENABLE pin ******************************************************************************/ RFID::RFID(int chipSelectPin, int NRSTPD) { _chipSelectPin = chipSelectPin; _NRSTPD = NRSTPD; pinMode(_chipSelectPin,OUTPUT); // 设置管脚_chipSelectPin为输出并连接到模块使能口 digitalWrite(_chipSelectPin, LOW); pinMode(_NRSTPD,OUTPUT); // 设置管脚NRSTPD为输出,非重置或掉电 digitalWrite(_NRSTPD, HIGH); } /****************************************************************************** * 用户 API ******************************************************************************/ /****************************************************************************** * 函 数 名:isCard * 功能描述:寻卡 * 输入参数:无 * 返 回 值:成功返回ture 失败返回false ******************************************************************************/ bool RFID::isCard() { unsigned char status; unsigned char str[MAX_LEN]; status = MFRC522Request(PICC_REQIDL, str); if (status == MI_OK) return true; else return false; } /****************************************************************************** * 函 数 名:readCardSerial * 功能描述:返回卡的序列号 4字节 * 输入参数:无 * 返 回 值:成功返回ture 失败返回false ******************************************************************************/ bool RFID::readCardSerial(){ unsigned char status; unsigned char str[MAX_LEN]; // 防冲撞,返回卡的序列号 4字节,存入serNum中 status = anticoll(str); memcpy(serNum, str, 5); if (status == MI_OK) return true; else return false; } /****************************************************************************** * 函 数 名:init * 功能描述:初始化RC522 * 输入参数:无 * 返 回 值:无 ******************************************************************************/ void RFID::init() { digitalWrite(_NRSTPD,HIGH); reset(); //Timer: TPrescaler*TreloadVal/6.78MHz = 24ms writeMFRC522(TModeReg, 0x8D); //Tauto=1; f(Timer) = 6.78MHz/TPreScaler writeMFRC522(TPrescalerReg, 0x3E); //TModeReg[3..0] + TPrescalerReg writeMFRC522(TReloadRegL, 30); writeMFRC522(TReloadRegH, 0); writeMFRC522(TxAutoReg, 0x40); //100%ASK writeMFRC522(ModeReg, 0x3D); // CRC valor inicial de 0x6363 //ClearBitMask(Status2Reg, 0x08); //MFCrypto1On=0 //writeMFRC522(RxSelReg, 0x86); //RxWait = RxSelReg[5..0] //writeMFRC522(RFCfgReg, 0x7F); //RxGain = 48dB antennaOn(); //打开天线 } /****************************************************************************** * 函 数 名:reset * 功能描述:复位RC522 * 输入参数:无 * 返 回 值:无 ******************************************************************************/ void RFID::reset() { writeMFRC522(CommandReg, PCD_RESETPHASE); } /****************************************************************************** * 函 数 名:writeMFRC522 * 功能描述:向MFRC522的某一寄存器写一个字节数据 * 输入参数:addr--寄存器地址;val--要写入的值 * 返 回 值:无 ******************************************************************************/ void RFID::writeMFRC522(unsigned char addr, unsigned char val) { digitalWrite(_chipSelectPin, LOW); //地址格式:0XXXXXX0 SPI.transfer((addr<<1)&0x7E); SPI.transfer(val); digitalWrite(_chipSelectPin, HIGH); } /****************************************************************************** * 函 数 名:readMFRC522 * 功能描述:从MFRC522的某一寄存器读一个字节数据 * 输入参数:addr--寄存器地址 * 返 回 值:返回读取到的一个字节数据 ******************************************************************************/ unsigned char RFID::readMFRC522(unsigned char addr) { unsigned char val; digitalWrite(_chipSelectPin, LOW); SPI.transfer(((addr<<1)&0x7E) | 0x80); val =SPI.transfer(0x00); digitalWrite(_chipSelectPin, HIGH); return val; } /****************************************************************************** * 函 数 名:setBitMask * 功能描述:置RC522寄存器位 * 输入参数:reg--寄存器地址;mask--置位值 * 返 回 值:无 ******************************************************************************/ void RFID::setBitMask(unsigned char reg, unsigned char mask) { unsigned char tmp; tmp = readMFRC522(reg); writeMFRC522(reg, tmp | mask); // set bit mask } /****************************************************************************** * 函 数 名:clearBitMask * 功能描述:清RC522寄存器位 * 输入参数:reg--寄存器地址;mask--清位值 * 返 回 值:无 ******************************************************************************/ void RFID::clearBitMask(unsigned char reg, unsigned char mask) { unsigned char tmp; tmp = readMFRC522(reg); writeMFRC522(reg, tmp & (~mask)); // clear bit mask } /****************************************************************************** * 函 数 名:antennaOn * 功能描述:开启天线,每次启动或关闭天险发射之间应至少有1ms的间隔 * 输入参数:无 * 返 回 值:无 ******************************************************************************/ void RFID::antennaOn(void) { unsigned char temp; temp = readMFRC522(TxControlReg); if (!(temp & 0x03)) { setBitMask(TxControlReg, 0x03); } } /****************************************************************************** * 函 数 名:antennaOff * 功能描述:关闭天线,每次启动或关闭天险发射之间应至少有1ms的间隔 * 输入参数:无 * 返 回 值:无 ******************************************************************************/ void RFID::antennaOff(void) { unsigned char temp; temp = readMFRC522(TxControlReg); if (!(temp & 0x03)) { clearBitMask(TxControlReg, 0x03); } } /****************************************************************************** * 函 数 名:calculateCRC * 功能描述:用MF522计算CRC * 输入参数:pIndata--要读数CRC的数据,len--数据长度,pOutData--计算的CRC结果 * 返 回 值:无 ******************************************************************************/ void RFID::calculateCRC(unsigned char *pIndata, unsigned char len, unsigned char *pOutData) { unsigned char i, n; clearBitMask(DivIrqReg, 0x04); //CRCIrq = 0 setBitMask(FIFOLevelReg, 0x80); //清FIFO指针 //Write_MFRC522(CommandReg, PCD_IDLE); //向FIFO中写入数据 for (i=0; i MAX_LEN) n = MAX_LEN; //读取FIFO中接收到的数据 for (i=0; i