Advertisement
Guest User

rfidrc522

a guest
May 15th, 2014
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 21.59 KB | None | 0 0
  1. /*
  2. * File name: RFID.ino
  3. * Creatory: Dr.Leong ( WWW.B2CQSHOP.COM )
  4. * Creation date: 2011.09.19
  5. * Modified by: Eng. Robson (robson.eletronico@gmail.com)
  6. * Modified date: 2013.09.10
  7. * Modified: Translation from Chinese to English (by google)
  8. * Functional Description: Mifare1 Anti-collision find cards → → → Select card reader interface
  9. */
  10. // the sensor communicates using SPI, so include the library:
  11. #include <SPI.h>
  12.  
  13. #define uchar unsigned char
  14. #define uint unsigned int
  15.  
  16. //Maximum length of the array
  17. #define MAX_LEN 16
  18.  
  19. /////////////////////////////////////////////////////////////////////
  20. //set the pin
  21. /////////////////////////////////////////////////////////////////////
  22. const int chipSelectPin = 53;
  23. const int NRSTPD = 5;
  24.  
  25. //MF522 Command word
  26. #define PCD_IDLE 0x00 //NO action; Cancel the current command
  27. #define PCD_AUTHENT 0x0E //Authentication Key
  28. #define PCD_RECEIVE 0x08 //Receive Data
  29. #define PCD_TRANSMIT 0x04 //Transmit data
  30. #define PCD_TRANSCEIVE 0x0C //Transmit and receive data,
  31. #define PCD_RESETPHASE 0x0F //Reset
  32. #define PCD_CALCCRC 0x03 //CRC Calculate
  33.  
  34. // Mifare_One card command word
  35. # define PICC_REQIDL 0x26 // find the antenna area does not enter hibernation
  36. # define PICC_REQALL 0x52 // find all the cards antenna area
  37. # define PICC_ANTICOLL 0x93 // anti-collision
  38. # define PICC_SElECTTAG 0x93 // election card
  39. # define PICC_AUTHENT1A 0x60 // authentication key A
  40. # define PICC_AUTHENT1B 0x61 // authentication key B
  41. # define PICC_READ 0x30 // Read Block
  42. # define PICC_WRITE 0xA0 // write block
  43. # define PICC_DECREMENT 0xC0 // debit
  44. # define PICC_INCREMENT 0xC1 // recharge
  45. # define PICC_RESTORE 0xC2 // transfer block data to the buffer
  46. # define PICC_TRANSFER 0xB0 // save the data in the buffer
  47. # define PICC_HALT 0x50 // Sleep
  48.  
  49.  
  50. //And MF522 The error code is returned when communication
  51. #define MI_OK 0
  52. #define MI_NOTAGERR 1
  53. #define MI_ERR 2
  54.  
  55.  
  56. //------------------MFRC522 Register---------------
  57. //Page 0:Command and Status
  58. #define Reserved00 0x00
  59. #define CommandReg 0x01
  60. #define CommIEnReg 0x02
  61. #define DivlEnReg 0x03
  62. #define CommIrqReg 0x04
  63. #define DivIrqReg 0x05
  64. #define ErrorReg 0x06
  65. #define Status1Reg 0x07
  66. #define Status2Reg 0x08
  67. #define FIFODataReg 0x09
  68. #define FIFOLevelReg 0x0A
  69. #define WaterLevelReg 0x0B
  70. #define ControlReg 0x0C
  71. #define BitFramingReg 0x0D
  72. #define CollReg 0x0E
  73. #define Reserved01 0x0F
  74. //Page 1:Command
  75. #define Reserved10 0x10
  76. #define ModeReg 0x11
  77. #define TxModeReg 0x12
  78. #define RxModeReg 0x13
  79. #define TxControlReg 0x14
  80. #define TxAutoReg 0x15
  81. #define TxSelReg 0x16
  82. #define RxSelReg 0x17
  83. #define RxThresholdReg 0x18
  84. #define DemodReg 0x19
  85. #define Reserved11 0x1A
  86. #define Reserved12 0x1B
  87. #define MifareReg 0x1C
  88. #define Reserved13 0x1D
  89. #define Reserved14 0x1E
  90. #define SerialSpeedReg 0x1F
  91. //Page 2:CFG
  92. #define Reserved20 0x20
  93. #define CRCResultRegM 0x21
  94. #define CRCResultRegL 0x22
  95. #define Reserved21 0x23
  96. #define ModWidthReg 0x24
  97. #define Reserved22 0x25
  98. #define RFCfgReg 0x26
  99. #define GsNReg 0x27
  100. #define CWGsPReg 0x28
  101. #define ModGsPReg 0x29
  102. #define TModeReg 0x2A
  103. #define TPrescalerReg 0x2B
  104. #define TReloadRegH 0x2C
  105. #define TReloadRegL 0x2D
  106. #define TCounterValueRegH 0x2E
  107. #define TCounterValueRegL 0x2F
  108. //Page 3:TestRegister
  109. #define Reserved30 0x30
  110. #define TestSel1Reg 0x31
  111. #define TestSel2Reg 0x32
  112. #define TestPinEnReg 0x33
  113. #define TestPinValueReg 0x34
  114. #define TestBusReg 0x35
  115. #define AutoTestReg 0x36
  116. #define VersionReg 0x37
  117. #define AnalogTestReg 0x38
  118. #define TestDAC1Reg 0x39
  119. #define TestDAC2Reg 0x3A
  120. #define TestADCReg 0x3B
  121. #define Reserved31 0x3C
  122. #define Reserved32 0x3D
  123. #define Reserved33 0x3E
  124. #define Reserved34 0x3F
  125. //-----------------------------------------------
  126.  
  127. //4 bytes card serial number, the first 5 bytes for the checksum byte
  128. uchar serNum[5];
  129.  
  130. uchar writeData[16]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100}; //Initialization 100 dollars
  131. uchar moneyConsume = 18 ; //Consumption of 18 yuan
  132. uchar moneyAdd = 10 ; //Recharge 10 yuan
  133. //Sector A password, 16 sectors, each sector password 6Byte
  134. uchar sectorKeyA[16][16] = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  135. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  136. //{0x19, 0x84, 0x07, 0x15, 0x76, 0x14},
  137. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  138. };
  139. uchar sectorNewKeyA[16][16] = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  140. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0x19,0x84,0x07,0x15,0x76,0x14},
  141. //you can set another ket , such as " 0x19, 0x84, 0x07, 0x15, 0x76, 0x14 "
  142. //{0x19, 0x84, 0x07, 0x15, 0x76, 0x14, 0xff,0x07,0x80,0x69, 0x19,0x84,0x07,0x15,0x76,0x14},
  143. // but when loop, please set the sectorKeyA, the same key, so that RFID module can read the card
  144. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0x19,0x33,0x07,0x15,0x34,0x14},
  145. };
  146.  
  147. void setup() {
  148. Serial.begin(9600); // RFID reader SOUT pin connected to Serial RX pin at 2400bps
  149. // start the SPI library:
  150. SPI.begin();
  151.  
  152. pinMode(chipSelectPin,OUTPUT); // Set digital pin 10 as OUTPUT to connect it to the RFID /ENABLE pin
  153. digitalWrite(chipSelectPin, LOW); // Activate the RFID reader
  154. pinMode(NRSTPD,OUTPUT); // Set digital pin 10 , Not Reset and Power-down
  155. digitalWrite(NRSTPD, HIGH);
  156.  
  157. MFRC522_Init();
  158. Serial.println("OK");
  159. }
  160.  
  161. void loop()
  162. {
  163. uchar i,tmp, checksum1;
  164. uchar status;
  165. uchar str[MAX_LEN];
  166. uchar RC_size;
  167. uchar blockAddr; //Selection operation block address 0 to 63
  168. String mynum = "";
  169.  
  170.  
  171. //Find cards, return card type
  172. status = MFRC522_Request(PICC_REQIDL, str);
  173. if (status == MI_OK)
  174. {
  175. //Serial.println("Card detected");
  176. //Serial.print(str[0],BIN);
  177. //Serial.print(" , ");
  178. //Serial.print(str[1],BIN);
  179. //Serial.println(" ");
  180. }
  181.  
  182. //Anti-collision, return card serial number 4 bytes
  183. status = MFRC522_Anticoll(str);
  184. memcpy(serNum, str, 5);
  185. if (status == MI_OK)
  186. {
  187. checksum1 = serNum[0] ^ serNum[1] ^ serNum[2] ^ serNum[3];
  188. //Serial.println("The card's number is : ");
  189. Serial.print(2);
  190. Serial.print(serNum[0]);
  191. //Serial.print(" , ");
  192. Serial.print(serNum[1],BIN);
  193. //Serial.print(" , ");
  194. Serial.print(serNum[2],BIN);
  195. //Serial.print(" , ");
  196. Serial.print(serNum[3],BIN);
  197. //Serial.print(" , ");
  198. Serial.print(serNum[4],BIN);
  199. Serial.print(checksum1);
  200. Serial.println(3);
  201. //Serial.println(" ");
  202.  
  203. // Should really check all pairs, but for now we'll just use the first
  204.  
  205. // if(serNum[0] == 88) {
  206. // Serial.println("Hello Grant");
  207. // } else if(serNum[0] == 173) {
  208. // Serial.println("Hello David");
  209. // }
  210. delay(1000);
  211. }
  212. //Serial.println(" ");
  213. MFRC522_Halt(); //Command card into hibernation
  214.  
  215. }
  216.  
  217. /*
  218. * Function Name:Write_MFRC5200
  219. * Function Description: To a certain MFRC522 register to write a byte of data
  220. * Input Parameters:addr - register address; val - the value to be written
  221. * Return value: None
  222. */
  223. void Write_MFRC522(uchar addr, uchar val)
  224. {
  225. digitalWrite(chipSelectPin, LOW);
  226.  
  227. //Address Format:0XXXXXX0
  228. SPI.transfer((addr<<1)&0x7E);
  229. SPI.transfer(val);
  230.  
  231. digitalWrite(chipSelectPin, HIGH);
  232. }
  233.  
  234.  
  235. /*
  236. * Function Name:Read_MFRC522
  237. * Description: From a certain MFRC522 read a byte of data register
  238. * Input Parameters: addr - register address
  239. * Returns: a byte of data read from the
  240. */
  241. uchar Read_MFRC522(uchar addr)
  242. {
  243. uchar val;
  244.  
  245. digitalWrite(chipSelectPin, LOW);
  246.  
  247. //Address Format:1XXXXXX0
  248. SPI.transfer(((addr<<1)&0x7E) | 0x80);
  249. val =SPI.transfer(0x00);
  250.  
  251. digitalWrite(chipSelectPin, HIGH);
  252.  
  253. return val;
  254. }
  255.  
  256. /*
  257. * Function Name:SetBitMask
  258. * Description: Set RC522 register bit
  259. * Input parameters: reg - register address; mask - set value
  260. * Return value: None
  261. */
  262. void SetBitMask(uchar reg, uchar mask)
  263. {
  264. uchar tmp;
  265. tmp = Read_MFRC522(reg);
  266. Write_MFRC522(reg, tmp | mask); // set bit mask
  267. }
  268.  
  269.  
  270. /*
  271. * Function Name: ClearBitMask
  272. * Description: clear RC522 register bit
  273. * Input parameters: reg - register address; mask - clear bit value
  274. * Return value: None
  275. */
  276. void ClearBitMask(uchar reg, uchar mask)
  277. {
  278. uchar tmp;
  279. tmp = Read_MFRC522(reg);
  280. Write_MFRC522(reg, tmp & (~mask)); // clear bit mask
  281. }
  282.  
  283.  
  284. /*
  285. * Function Name:AntennaOn
  286. * Description: Open antennas, each time you start or shut down the natural barrier between the transmitter should be at least 1ms interval
  287. * Input: None
  288. * Return value: None
  289. */
  290. void AntennaOn(void)
  291. {
  292. uchar temp;
  293.  
  294. temp = Read_MFRC522(TxControlReg);
  295. if (!(temp & 0x03))
  296. {
  297. SetBitMask(TxControlReg, 0x03);
  298. }
  299. }
  300.  
  301.  
  302. /*
  303. * Function Name: AntennaOff
  304. * Description: Close antennas, each time you start or shut down the natural barrier between the transmitter should be at least 1ms interval
  305. * Input: None
  306. * Return value: None
  307. */
  308. void AntennaOff(void)
  309. {
  310. ClearBitMask(TxControlReg, 0x03);
  311. }
  312.  
  313.  
  314. /*
  315. * Function Name: ResetMFRC522
  316. * Description: Reset RC522
  317. * Input: None
  318. * Return value: None
  319. */
  320. void MFRC522_Reset(void)
  321. {
  322. Write_MFRC522(CommandReg, PCD_RESETPHASE);
  323. }
  324.  
  325.  
  326. /*
  327. * Function Name:InitMFRC522
  328. * Description: Initialize RC522
  329. * Input: None
  330. * Return value: None
  331. */
  332. void MFRC522_Init(void)
  333. {
  334. digitalWrite(NRSTPD,HIGH);
  335.  
  336. MFRC522_Reset();
  337.  
  338. //Timer: TPrescaler*TreloadVal/6.78MHz = 24ms
  339. Write_MFRC522(TModeReg, 0x8D); //Tauto=1; f(Timer) = 6.78MHz/TPreScaler
  340. Write_MFRC522(TPrescalerReg, 0x3E); //TModeReg[3..0] + TPrescalerReg
  341. Write_MFRC522(TReloadRegL, 30);
  342. Write_MFRC522(TReloadRegH, 0);
  343.  
  344. Write_MFRC522(TxAutoReg, 0x40); //100%ASK
  345. Write_MFRC522(ModeReg, 0x3D); //CRC Initial value 0x6363 ???
  346.  
  347. //ClearBitMask(Status2Reg, 0x08); //MFCrypto1On=0
  348. //Write_MFRC522(RxSelReg, 0x86); //RxWait = RxSelReg[5..0]
  349. //Write_MFRC522(RFCfgReg, 0x7F); //RxGain = 48dB
  350.  
  351. AntennaOn(); //Open the antenna
  352. }
  353.  
  354.  
  355. /*
  356. * Function Name:MFRC522_Request
  357. * Description: Find cards, read the card type number
  358. * Input parameters: reqMode - find cards way
  359. * TagType - Return Card Type
  360. * 0x4400 = Mifare_UltraLight
  361. * 0x0400 = Mifare_One(S50)
  362. * 0x0200 = Mifare_One(S70)
  363. * 0x0800 = Mifare_Pro(X)
  364. * 0x4403 = Mifare_DESFire
  365. * Return value: the successful return MI_OK
  366. */
  367. uchar MFRC522_Request(uchar reqMode, uchar *TagType)
  368. {
  369. uchar status;
  370. uint backBits; //The received data bits
  371.  
  372. Write_MFRC522(BitFramingReg, 0x07); //TxLastBists = BitFramingReg[2..0] ???
  373.  
  374. TagType[0] = reqMode;
  375. status = MFRC522_ToCard(PCD_TRANSCEIVE, TagType, 1, TagType, &backBits);
  376.  
  377. if ((status != MI_OK) || (backBits != 0x10))
  378. {
  379. status = MI_ERR;
  380. }
  381.  
  382. return status;
  383. }
  384.  
  385.  
  386. /*
  387. * Function Name: MFRC522_ToCard
  388. * Description: RC522 and ISO14443 card communication
  389. * Input Parameters: command - MF522 command word,
  390. * sendData--RC522 sent to the card by the data
  391. * sendLen--Length of data sent
  392. * backData--Received the card returns data,
  393. * backLen--Return data bit length
  394. * Return value: the successful return MI_OK
  395. */
  396. uchar MFRC522_ToCard(uchar command, uchar *sendData, uchar sendLen, uchar *backData, uint *backLen)
  397. {
  398. uchar status = MI_ERR;
  399. uchar irqEn = 0x00;
  400. uchar waitIRq = 0x00;
  401. uchar lastBits;
  402. uchar n;
  403. uint i;
  404.  
  405. switch (command)
  406. {
  407. case PCD_AUTHENT: //Certification cards close
  408. {
  409. irqEn = 0x12;
  410. waitIRq = 0x10;
  411. break;
  412. }
  413. case PCD_TRANSCEIVE: //Transmit FIFO data
  414. {
  415. irqEn = 0x77;
  416. waitIRq = 0x30;
  417. break;
  418. }
  419. default:
  420. break;
  421. }
  422.  
  423. Write_MFRC522(CommIEnReg, irqEn|0x80); //Interrupt request
  424. ClearBitMask(CommIrqReg, 0x80); //Clear all interrupt request bit
  425. SetBitMask(FIFOLevelReg, 0x80); //FlushBuffer=1, FIFO Initialization
  426.  
  427. Write_MFRC522(CommandReg, PCD_IDLE); //NO action; Cancel the current command???
  428.  
  429. //Writing data to the FIFO
  430. for (i=0; i<sendLen; i++)
  431. {
  432. Write_MFRC522(FIFODataReg, sendData[i]);
  433. }
  434.  
  435. //Execute the command
  436. Write_MFRC522(CommandReg, command);
  437. if (command == PCD_TRANSCEIVE)
  438. {
  439. SetBitMask(BitFramingReg, 0x80); //StartSend=1,transmission of data starts
  440. }
  441.  
  442. //Waiting to receive data to complete
  443. i = 2000; //i according to the clock frequency adjustment, the operator M1 card maximum waiting time 25ms???
  444. do
  445. {
  446. //CommIrqReg[7..0]
  447. //Set1 TxIRq RxIRq IdleIRq HiAlerIRq LoAlertIRq ErrIRq TimerIRq
  448. n = Read_MFRC522(CommIrqReg);
  449. i--;
  450. }
  451. while ((i!=0) && !(n&0x01) && !(n&waitIRq));
  452.  
  453. ClearBitMask(BitFramingReg, 0x80); //StartSend=0
  454.  
  455. if (i != 0)
  456. {
  457. if(!(Read_MFRC522(ErrorReg) & 0x1B)) //BufferOvfl Collerr CRCErr ProtecolErr
  458. {
  459. status = MI_OK;
  460. if (n & irqEn & 0x01)
  461. {
  462. status = MI_NOTAGERR; //??
  463. }
  464.  
  465. if (command == PCD_TRANSCEIVE)
  466. {
  467. n = Read_MFRC522(FIFOLevelReg);
  468. lastBits = Read_MFRC522(ControlReg) & 0x07;
  469. if (lastBits)
  470. {
  471. *backLen = (n-1)*8 + lastBits;
  472. }
  473. else
  474. {
  475. *backLen = n*8;
  476. }
  477.  
  478. if (n == 0)
  479. {
  480. n = 1;
  481. }
  482. if (n > MAX_LEN)
  483. {
  484. n = MAX_LEN;
  485. }
  486.  
  487. //Reading the received data in FIFO
  488. for (i=0; i<n; i++)
  489. {
  490. backData[i] = Read_MFRC522(FIFODataReg);
  491. }
  492. }
  493. }
  494. else
  495. {
  496. status = MI_ERR;
  497. }
  498.  
  499. }
  500.  
  501. //SetBitMask(ControlReg,0x80); //timer stops
  502. //Write_MFRC522(CommandReg, PCD_IDLE);
  503.  
  504. return status;
  505. }
  506.  
  507.  
  508. /*
  509. * Function Name: MFRC522_Anticoll
  510. * Description: Anti-collision detection, reading selected card serial number card
  511. * Input parameters: serNum - returns 4 bytes card serial number, the first 5 bytes for the checksum byte
  512. * Return value: the successful return MI_OK
  513. */
  514. uchar MFRC522_Anticoll(uchar *serNum)
  515. {
  516. uchar status;
  517. uchar i;
  518. uchar serNumCheck=0;
  519. uint unLen;
  520.  
  521.  
  522. //ClearBitMask(Status2Reg, 0x08); //TempSensclear
  523. //ClearBitMask(CollReg,0x80); //ValuesAfterColl
  524. Write_MFRC522(BitFramingReg, 0x00); //TxLastBists = BitFramingReg[2..0]
  525.  
  526. serNum[0] = PICC_ANTICOLL;
  527. serNum[1] = 0x20;
  528. status = MFRC522_ToCard(PCD_TRANSCEIVE, serNum, 2, serNum, &unLen);
  529.  
  530. if (status == MI_OK)
  531. {
  532. //Check card serial number
  533. for (i=0; i<4; i++)
  534. {
  535. serNumCheck ^= serNum[i];
  536. }
  537. if (serNumCheck != serNum[i])
  538. {
  539. status = MI_ERR;
  540. }
  541. }
  542.  
  543. //SetBitMask(CollReg, 0x80); //ValuesAfterColl=1
  544.  
  545. return status;
  546. }
  547.  
  548.  
  549. /*
  550. * Function Name: CalulateCRC
  551. * Description: CRC calculation with MF522
  552. * Input parameters: pIndata - To read the CRC data, len - the data length, pOutData - CRC calculation results
  553. * Return value: None
  554. */
  555. void CalulateCRC(uchar *pIndata, uchar len, uchar *pOutData)
  556. {
  557. uchar i, n;
  558.  
  559. ClearBitMask(DivIrqReg, 0x04); //CRCIrq = 0
  560. SetBitMask(FIFOLevelReg, 0x80); //Clear the FIFO pointer
  561. //Write_MFRC522(CommandReg, PCD_IDLE);
  562.  
  563. //Writing data to the FIFO
  564. for (i=0; i<len; i++)
  565. {
  566. Write_MFRC522(FIFODataReg, *(pIndata+i));
  567. }
  568. Write_MFRC522(CommandReg, PCD_CALCCRC);
  569.  
  570. //Wait CRC calculation is complete
  571. i = 0xFF;
  572. do
  573. {
  574. n = Read_MFRC522(DivIrqReg);
  575. i--;
  576. }
  577. while ((i!=0) && !(n&0x04)); //CRCIrq = 1
  578.  
  579. //Read CRC calculation result
  580. pOutData[0] = Read_MFRC522(CRCResultRegL);
  581. pOutData[1] = Read_MFRC522(CRCResultRegM);
  582. }
  583.  
  584.  
  585. /*
  586. * Function Name: MFRC522_SelectTag
  587. * Description: election card, read the card memory capacity
  588. * Input parameters: serNum - Incoming card serial number
  589. * Return value: the successful return of card capacity
  590. */
  591. uchar MFRC522_SelectTag(uchar *serNum)
  592. {
  593. uchar i;
  594. uchar status;
  595. uchar size;
  596. uint recvBits;
  597. uchar buffer[9];
  598.  
  599. //ClearBitMask(Status2Reg, 0x08); //MFCrypto1On=0
  600.  
  601. buffer[0] = PICC_SElECTTAG;
  602. buffer[1] = 0x70;
  603. for (i=0; i<5; i++)
  604. {
  605. buffer[i+2] = *(serNum+i);
  606. }
  607. CalulateCRC(buffer, 7, &buffer[7]); //??
  608. status = MFRC522_ToCard(PCD_TRANSCEIVE, buffer, 9, buffer, &recvBits);
  609.  
  610. if ((status == MI_OK) && (recvBits == 0x18))
  611. {
  612. size = buffer[0];
  613. }
  614. else
  615. {
  616. size = 0;
  617. }
  618.  
  619. return size;
  620. }
  621.  
  622.  
  623. /*
  624. * Function Name: MFRC522_Auth
  625. * Description: Verify card password
  626. * Input parameters: authMode - Password Authentication Mode
  627. 0x60 = A key authentication
  628. 0x61 = Authentication Key B
  629. BlockAddr--Block address
  630. Sectorkey--Sector password
  631. serNum--Card serial number, 4-byte
  632. * Return value: the successful return MI_OK
  633. */
  634. uchar MFRC522_Auth(uchar authMode, uchar BlockAddr, uchar *Sectorkey, uchar *serNum)
  635. {
  636. uchar status;
  637. uint recvBits;
  638. uchar i;
  639. uchar buff[12];
  640.  
  641. //Verify the command block address + sector + password + card serial number
  642. buff[0] = authMode;
  643. buff[1] = BlockAddr;
  644. for (i=0; i<6; i++)
  645. {
  646. buff[i+2] = *(Sectorkey+i);
  647. }
  648. for (i=0; i<4; i++)
  649. {
  650. buff[i+8] = *(serNum+i);
  651. }
  652. status = MFRC522_ToCard(PCD_AUTHENT, buff, 12, buff, &recvBits);
  653.  
  654. if ((status != MI_OK) || (!(Read_MFRC522(Status2Reg) & 0x08)))
  655. {
  656. status = MI_ERR;
  657. }
  658.  
  659. return status;
  660. }
  661.  
  662.  
  663. /*
  664. * Function Name: MFRC522_Read
  665. * Description: Read block data
  666. * Input parameters: blockAddr - block address; recvData - read block data
  667. * Return value: the successful return MI_OK
  668. */
  669. uchar MFRC522_Read(uchar blockAddr, uchar *recvData)
  670. {
  671. uchar status;
  672. uint unLen;
  673.  
  674. recvData[0] = PICC_READ;
  675. recvData[1] = blockAddr;
  676. CalulateCRC(recvData,2, &recvData[2]);
  677. status = MFRC522_ToCard(PCD_TRANSCEIVE, recvData, 4, recvData, &unLen);
  678.  
  679. if ((status != MI_OK) || (unLen != 0x90))
  680. {
  681. status = MI_ERR;
  682. }
  683.  
  684. return status;
  685. }
  686.  
  687.  
  688. /*
  689. * Function Name: MFRC522_Write
  690. * Description: Write block data
  691. * Input parameters: blockAddr - block address; writeData - to 16-byte data block write
  692. * Return value: the successful return MI_OK
  693. */
  694. uchar MFRC522_Write(uchar blockAddr, uchar *writeData)
  695. {
  696. uchar status;
  697. uint recvBits;
  698. uchar i;
  699. uchar buff[18];
  700.  
  701. buff[0] = PICC_WRITE;
  702. buff[1] = blockAddr;
  703. CalulateCRC(buff, 2, &buff[2]);
  704. status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff, &recvBits);
  705.  
  706. if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A))
  707. {
  708. status = MI_ERR;
  709. }
  710.  
  711. if (status == MI_OK)
  712. {
  713. for (i=0; i<16; i++) //Data to the FIFO write 16Byte
  714. {
  715. buff[i] = *(writeData+i);
  716. }
  717. CalulateCRC(buff, 16, &buff[16]);
  718. status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 18, buff, &recvBits);
  719.  
  720. if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A))
  721. {
  722. status = MI_ERR;
  723. }
  724. }
  725.  
  726. return status;
  727. }
  728.  
  729.  
  730. /*
  731. * Function Name: MFRC522_Halt
  732. * Description: Command card into hibernation
  733. * Input: None
  734. * Return value: None
  735. */
  736. void MFRC522_Halt(void)
  737. {
  738. uchar status;
  739. uint unLen;
  740. uchar buff[4];
  741.  
  742. buff[0] = PICC_HALT;
  743. buff[1] = 0;
  744. CalulateCRC(buff, 2, &buff[2]);
  745.  
  746. status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff,&unLen);
  747. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement