Arduino中MFRC-522射频IC卡感应模块使用

来源:互联网 发布:sql server 2008r2语句 编辑:程序博客网 时间:2024/05/03 20:00

 连接图和 http://blog.csdn.net/zitech/article/details/24130405 中的一样


在这次试验中,我们会进行写与读两种操作,全部代码如下:

#include <SPI.h>#include <RFID.h>RFID rfid(10,5);    //D10--读卡器MOSI引脚、D5--读卡器RST引脚//4字节卡序列号,第5字节为校验字节unsigned char serNum[5];//写卡数据unsigned char writeDate[16] ={'G', 'e', 'e', 'k', '-', 'W', 'o', 'r', 'k', 'S', 'h', 'o', 'p', 0, 0, 0};//原扇区A密码,16个扇区,每个扇区密码6Byteunsigned char sectorKeyA[16][16] = {        {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},        {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},        {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};//新扇区A密码,16个扇区,每个扇区密码6Byteunsigned char sectorNewKeyA[16][16] = {        {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},        {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},        {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};void setup(){  Serial.begin(9600);  SPI.begin();  rfid.init();}void loop(){  unsigned char i,tmp;  unsigned char status;  unsigned char str[MAX_LEN];  unsigned char RC_size;  unsigned char blockAddr;        //选择操作的块地址0~63  //找卡  rfid.isCard();  //读取卡序列号  if (rfid.readCardSerial())  {    Serial.print("The card's number is  : ");    Serial.print(rfid.serNum[0],HEX);    Serial.print(rfid.serNum[1],HEX);    Serial.print(rfid.serNum[2],HEX);    Serial.print(rfid.serNum[3],HEX);    Serial.print(rfid.serNum[4],HEX);    Serial.println(" ");  }  //选卡,返回卡容量(锁定卡片,防止多次读写)  rfid.selectTag(rfid.serNum);    //写数据卡  blockAddr = 7;                //数据块7  if (rfid.auth(PICC_AUTHENT1A, blockAddr, sectorKeyA[blockAddr/4], rfid.serNum) == MI_OK)  //认证  {    //写数据    status = rfid.write(blockAddr, sectorNewKeyA[blockAddr/4]);    Serial.print("set the new card password, and can modify the data of the Sector: ");    Serial.println(blockAddr/4,DEC);    //写数据    blockAddr = blockAddr - 3 ; //数据块4    status = rfid.write(blockAddr, writeDate);    if(status == MI_OK)    {      Serial.println("Write card OK!");    }  }  //读卡  blockAddr = 7;                //数据块7  status = rfid.auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], rfid.serNum);  if (status == MI_OK)  //认证  {    //读数据    blockAddr = blockAddr - 3 ; //数据块4    if( rfid.read(blockAddr, str) == MI_OK)    {      Serial.print("Read from the card ,the data is : ");      Serial.println((char *)str);    }  }    rfid.halt();}

在这里我们写了一个专门用于 Arduino中MFRC-522射频IC卡感应模块使用的RC522库文件。
#include <RFID.h>

所有代码(库文件)下载: RFID_MFRC522库文件


库文件 见:

#ifndef RFID_h#define RFID_h#include <Arduino.h>#include <SPI.h>/****************************************************************************** * 定义 ******************************************************************************/#define MAX_LEN 16   // 数组最大长度//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_ANTICOLL         0x93               //防冲撞#define PICC_SElECTTAG        0x93               //选卡#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通讯时返回的错误代码#define MI_OK                 0#define MI_NOTAGERR           1#define MI_ERR                2//------------------MFRC522寄存器---------------//Page 0:Command and Status#define     Reserved00            0x00    #define     CommandReg            0x01    #define     CommIEnReg            0x02    #define     DivlEnReg             0x03    #define     CommIrqReg            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     Reserved01            0x0F//Page 1:Command     #define     Reserved10            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     Reserved11            0x1A#define     Reserved12            0x1B#define     MifareReg             0x1C#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//-----------------------------------------------class RFID{  public:RFID(int chipSelectPin, int NRSTPD);  //读卡器MOSI引脚、读卡器RST引脚bool isCard();bool readCardSerial();void init();void reset();void setBitMask(unsigned char reg, unsigned char mask);void clearBitMask(unsigned char reg, unsigned char mask);void antennaOn(void);void antennaOff(void);void calculateCRC(unsigned char *pIndata, unsigned char len, unsigned char *pOutData);void writeMFRC522(unsigned char addr, unsigned char val);unsigned char readMFRC522(unsigned char addr);unsigned char MFRC522Request(unsigned char reqMode, unsigned char *TagType);unsigned char MFRC522ToCard(unsigned char command, unsigned char *sendData, unsigned char sendLen, unsigned char *backData, unsigned int *backLen);unsigned char anticoll(unsigned char *serNum);unsigned char auth(unsigned char authMode, unsigned char BlockAddr, unsigned char *Sectorkey, unsigned char *serNum);unsigned char read(unsigned char blockAddr, unsigned char *recvData);unsigned char write(unsigned char blockAddr, unsigned char *writeData);unsigned char selectTag(unsigned char *serNum);void halt();unsigned char serNum[5];       // 4字节卡序列号,第5字节为校验字节  private:int _chipSelectPin;int _NRSTPD;};#endif

头文件中函数的实现是在一个名为 RFID.cpp 的文件中,具体为:

****************************************************************************** * 包含文件 ******************************************************************************/#include <Arduino.h>#include <RFID.h>/****************************************************************************** * 构造 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<len; i++)    writeMFRC522(FIFODataReg, *(pIndata+i));  writeMFRC522(CommandReg, PCD_CALCCRC);  //等待CRC计算完成  i = 0xFF;  do  {    n = readMFRC522(DivIrqReg);    i--;  }  while ((i!=0) && !(n&0x04));      //CRCIrq = 1  //读取CRC计算结果  pOutData[0] = readMFRC522(CRCResultRegL);  pOutData[1] = readMFRC522(CRCResultRegM);}/****************************************************************************** * 函 数 名:MFRC522ToCard * 功能描述:RC522和ISO14443卡通讯 * 输入参数:command--MF522命令字, *           sendData--通过RC522发送到卡片的数据, *                     sendLen--发送的数据长度 *                     backData--接收到的卡片返回数据, *                     backLen--返回数据的位长度 * 返 回 值:成功返回MI_OK ******************************************************************************/unsigned char RFID::MFRC522ToCard(unsigned char command, unsigned char *sendData, unsigned char sendLen, unsigned char *backData, unsigned int *backLen){  unsigned char status = MI_ERR;  unsigned char irqEn = 0x00;  unsigned char waitIRq = 0x00;  unsigned char lastBits;  unsigned char n;  unsigned int i;  switch (command)  {    case PCD_AUTHENT:   //认证卡密    {      irqEn = 0x12;      waitIRq = 0x10;      break;    }    case PCD_TRANSCEIVE:  //发送FIFO中数据    {      irqEn = 0x77;      waitIRq = 0x30;      break;    }    default:      break;  }  writeMFRC522(CommIEnReg, irqEn|0x80); //允许中断请求  clearBitMask(CommIrqReg, 0x80);       //清除所有中断请求位  setBitMask(FIFOLevelReg, 0x80);       //FlushBuffer=1, FIFO初始化  writeMFRC522(CommandReg, PCD_IDLE);   //无动作,取消当前命令  //向FIFO中写入数据  for (i=0; i<sendLen; i++)    writeMFRC522(FIFODataReg, sendData[i]);  //执行命令  writeMFRC522(CommandReg, command);  if (command == PCD_TRANSCEIVE)    setBitMask(BitFramingReg, 0x80);    //StartSend=1,transmission of data starts  //等待接收数据完成  i = 2000; //i根据时钟频率调整,操作M1卡最大等待时间25ms  do  {    //CommIrqReg[7..0]    //Set1 TxIRq RxIRq IdleIRq HiAlerIRq LoAlertIRq ErrIRq TimerIRq    n = readMFRC522(CommIrqReg);    i--;  }  while ((i!=0) && !(n&0x01) && !(n&waitIRq));  clearBitMask(BitFramingReg, 0x80);      //StartSend=0  if (i != 0)  {    if(!(readMFRC522(ErrorReg) & 0x1B)) //BufferOvfl Collerr CRCErr ProtecolErr    {      status = MI_OK;      if (n & irqEn & 0x01)        status = MI_NOTAGERR;     //??      if (command == PCD_TRANSCEIVE)      {        n = readMFRC522(FIFOLevelReg);        lastBits = readMFRC522(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] = readMFRC522(FIFODataReg);      }    }    else      status = MI_ERR;  }  //SetBitMask(ControlReg,0x80);           //timer stops  //Write_MFRC522(CommandReg, PCD_IDLE);  return status;}/****************************************************************************** * 函 数 名:MFRC522Request * 功能描述:寻卡,读取卡类型号 * 输入参数:reqMode--寻卡方式, *           TagType--返回卡片类型 *                    0x4400 = Mifare_UltraLight *                    0x0400 = Mifare_One(S50) *                    0x0200 = Mifare_One(S70) *                    0x0800 = Mifare_Pro(X) *                    0x4403 = Mifare_DESFire * 返 回 值:成功返回MI_OK ******************************************************************************/unsigned char RFID::MFRC522Request(unsigned char reqMode, unsigned char *TagType){  unsigned char status;  unsigned int backBits;      //接收到的数据位数  writeMFRC522(BitFramingReg, 0x07);    //TxLastBists = BitFramingReg[2..0] ???  TagType[0] = reqMode;  status = MFRC522ToCard(PCD_TRANSCEIVE, TagType, 1, TagType, &backBits);  if ((status != MI_OK) || (backBits != 0x10))    status = MI_ERR;  return status;}/****************************************************************************** * 函 数 名:anticoll * 功能描述:防冲突检测,读取选中卡片的卡序列号 * 输入参数:serNum--返回4字节卡序列号,第5字节为校验字节 * 返 回 值:成功返回MI_OK ******************************************************************************/unsigned char RFID::anticoll(unsigned char *serNum){  unsigned char status;  unsigned char i;  unsigned char serNumCheck=0;  unsigned int unLen;  //ClearBitMask(Status2Reg, 0x08);   //TempSensclear  //ClearBitMask(CollReg,0x80);     //ValuesAfterColl  writeMFRC522(BitFramingReg, 0x00);    //TxLastBists = BitFramingReg[2..0]  serNum[0] = PICC_ANTICOLL;  serNum[1] = 0x20;  status = MFRC522ToCard(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=1  return status;}/****************************************************************************** * 函 数 名:auth * 功能描述:验证卡片密码 * 输入参数:authMode--密码验证模式 *                     0x60 = 验证A密钥 *                     0x61 = 验证B密钥 *           BlockAddr--块地址 *           Sectorkey--扇区密码 *           serNum--卡片序列号,4字节 * 返 回 值:成功返回MI_OK ******************************************************************************/unsigned char RFID::auth(unsigned char authMode, unsigned char BlockAddr, unsigned char *Sectorkey, unsigned char *serNum){  unsigned char status;  unsigned int recvBits;  unsigned char i;  unsigned char 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 = MFRC522ToCard(PCD_AUTHENT, buff, 12, buff, &recvBits);  if ((status != MI_OK) || (!(readMFRC522(Status2Reg) & 0x08)))    status = MI_ERR;  return status;}/****************************************************************************** * 函 数 名:read * 功能描述:读块数据 * 输入参数:blockAddr--块地址;recvData--读出的块数据 * 返 回 值:成功返回MI_OK ******************************************************************************/unsigned char RFID::read(unsigned char blockAddr, unsigned char *recvData){  unsigned char status;  unsigned int unLen;  recvData[0] = PICC_READ;  recvData[1] = blockAddr;  calculateCRC(recvData,2, &recvData[2]);  status = MFRC522ToCard(PCD_TRANSCEIVE, recvData, 4, recvData, &unLen);  if ((status != MI_OK) || (unLen != 0x90))    status = MI_ERR;  return status;}/****************************************************************************** * 函 数 名:write * 功能描述:写块数据 * 输入参数:blockAddr--块地址;writeData--向块写16字节数据 * 返 回 值:成功返回MI_OK ******************************************************************************/unsigned char RFID::write(unsigned char blockAddr, unsigned char *writeData){  unsigned char status;  unsigned int recvBits;  unsigned char i;  unsigned char buff[18];  buff[0] = PICC_WRITE;  buff[1] = blockAddr;  calculateCRC(buff, 2, &buff[2]);  status = MFRC522ToCard(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?? Datos a la FIFO 16Byte escribir      buff[i] = *(writeData+i);          calculateCRC(buff, 16, &buff[16]);    status = MFRC522ToCard(PCD_TRANSCEIVE, buff, 18, buff, &recvBits);    if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A))      status = MI_ERR;  }  return status;}/****************************************************************************** * 函 数 名:selectTag * 功能描述:选卡,读取卡存储器容量 * 输入参数:serNum--传入卡序列号 * 返 回 值:成功返回卡容量 ******************************************************************************/unsigned char RFID::selectTag(unsigned char *serNum){  unsigned char i;  unsigned char status;  unsigned char size;  unsigned int recvBits;  unsigned char buffer[9];  //ClearBitMask(Status2Reg, 0x08);                        //MFCrypto1On=0  buffer[0] = PICC_SElECTTAG;  buffer[1] = 0x70;  for (i=0; i<5; i++)    buffer[i+2] = *(serNum+i);  calculateCRC(buffer, 7, &buffer[7]);    status = MFRC522ToCard(PCD_TRANSCEIVE, buffer, 9, buffer, &recvBits);  if ((status == MI_OK) && (recvBits == 0x18))    size = buffer[0];  else    size = 0;  return size;}/****************************************************************************** * 函 数 名:Halt * 功能描述:命令卡片进入休眠状态 * 输入参数:无 * 返 回 值:无 ******************************************************************************/void RFID::halt(){  unsigned char status;  unsigned int unLen;  unsigned char buff[4];  buff[0] = PICC_HALT;  buff[1] = 0;  calculateCRC(buff, 2, &buff[2]);  status = MFRC522ToCard(PCD_TRANSCEIVE, buff, 4, buff,&unLen);}


所有代码(库文件)下载: RFID_MFRC522库文件


0 0
原创粉丝点击