Dependencies:   mbed

Committer:
sheralikhan
Date:
Tue Jun 06 10:13:06 2017 +0000
Revision:
4:9d923c6e6c14
Parent:
3:f9ed412458d5
Child:
5:93f22f8fdcd2
RFID

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sheralikhan 3:f9ed412458d5 1 /*--------------------------------------------------------Reading Writing MIFARE Tags---------------------------------------------------------------
sheralikhan 4:9d923c6e6c14 2
sheralikhan 3:f9ed412458d5 3 1.This program is for reading and writing from /to MIFARE Classic 1k ,MIFARE Ultralight MF0ICU1,MIFARE Ultralight NTAG213,MIFARE Ultralight NTAG203
sheralikhan 3:f9ed412458d5 4 2.Generally we are using MBED model WIZnet WIZWiki W7500 to interfacng with MFRC522 Rader and writer device using SPI protocol
sheralikhan 4:9d923c6e6c14 5 3.This program is designed such a way that it will take input 1,2 for reading or writing from serial monitor
sheralikhan 3:f9ed412458d5 6 4.Once user can entering input based on input it will call read and write function respectively...
sheralikhan 4:9d923c6e6c14 7
sheralikhan 3:f9ed412458d5 8 ----------------------------------------------------------------------------------------------------------------------------------------------------*/
sheralikhan 3:f9ed412458d5 9
sheralikhan 3:f9ed412458d5 10 /*Test of cheap 13.56Mhz RFID-RC522 module
sheralikhan 3:f9ed412458d5 11 Connect as follows:
sheralikhan 3:f9ed412458d5 12 RFID pins -> WIZWiki-W7500 header CN5 (Arduino-compatible header)
sheralikhan 3:f9ed412458d5 13 --------------------------------------------------------------------------
sheralikhan 3:f9ed412458d5 14 1.RFID IRQ -> Not used. Leave open
sheralikhan 3:f9ed412458d5 15 2.RFID MISO -> WIZWiki-W7500 SPI_MISO =D12
sheralikhan 3:f9ed412458d5 16 3.RFID MOSI -> WIZWiki-W7500 SPI_MOSI =D11
sheralikhan 3:f9ed412458d5 17 4.RFID SCK -> WIZWiki-W7500 SPI_SCK =D13
sheralikhan 3:f9ed412458d5 18 5.RFID SDA -> WIZWiki-W7500 SPI_CS =D10
sheralikhan 3:f9ed412458d5 19 6.RFID RST -> WIZWiki-W7500 =D9
sheralikhan 4:9d923c6e6c14 20 3.3V and Gnd to the respective pins
sheralikhan 4:9d923c6e6c14 21 -------------------------------------------------------------------------*/
sheralikhan 3:f9ed412458d5 22
sheralikhan 3:f9ed412458d5 23
sheralikhan 0:4b5aa5fe3ff4 24
sheralikhan 1:27fb38198323 25
sheralikhan 1:27fb38198323 26 //Adding Library for Mbed
sheralikhan 0:4b5aa5fe3ff4 27 #include "mbed.h"
sheralikhan 1:27fb38198323 28 //Adding Library for MFRC522
sheralikhan 0:4b5aa5fe3ff4 29 #include "MFRC522.h"
sheralikhan 1:27fb38198323 30 //Adding Library for SPI protocol
sheralikhan 0:4b5aa5fe3ff4 31 #include "SPI.h"
sheralikhan 3:f9ed412458d5 32
sheralikhan 3:f9ed412458d5 33 //Define RFID version and date
sheralikhan 0:4b5aa5fe3ff4 34 #define VERSION "RFID_2017_03_20"
sheralikhan 3:f9ed412458d5 35 //Define board
sheralikhan 4:9d923c6e6c14 36 #define BOARD "WIZwiki-W7500"
sheralikhan 4:9d923c6e6c14 37 //Adding Library for RFID tags read and Write
sheralikhan 4:9d923c6e6c14 38 #include "RFIDRW.h"
sheralikhan 0:4b5aa5fe3ff4 39
sheralikhan 0:4b5aa5fe3ff4 40
sheralikhan 0:4b5aa5fe3ff4 41 // ARMmbed WIZwiki W7500 Pin for MFRC522 SPI Communication
sheralikhan 0:4b5aa5fe3ff4 42 #define SPI_MOSI D11
sheralikhan 0:4b5aa5fe3ff4 43 #define SPI_MISO D12
sheralikhan 0:4b5aa5fe3ff4 44 #define SPI_SCLK D13
sheralikhan 0:4b5aa5fe3ff4 45 #define SPI_CS D10
sheralikhan 0:4b5aa5fe3ff4 46
sheralikhan 1:27fb38198323 47 // WIZWiki-W7500 Pin for MFRC522 reset(pick another D pin if you need D8)
sheralikhan 0:4b5aa5fe3ff4 48 #define MF_RESET D9
sheralikhan 0:4b5aa5fe3ff4 49
sheralikhan 3:f9ed412458d5 50 //Define led for identification
sheralikhan 0:4b5aa5fe3ff4 51 DigitalOut LedGreen(D7);
sheralikhan 3:f9ed412458d5 52
sheralikhan 4:9d923c6e6c14 53 //Serial connection to cp for output
sheralikhan 4:9d923c6e6c14 54 Serial cp(USBTX, USBRX);
sheralikhan 0:4b5aa5fe3ff4 55
sheralikhan 4:9d923c6e6c14 56 //Creating MFRC522 class abject and passing pin as a argument
sheralikhan 4:9d923c6e6c14 57 MFRC522 RfChip(SPI_MOSI, SPI_MISO, SPI_SCLK, SPI_CS, MF_RESET);
sheralikhan 4:9d923c6e6c14 58
sheralikhan 0:4b5aa5fe3ff4 59 /**
sheralikhan 0:4b5aa5fe3ff4 60 * Dumps debug info about the selected PICC to Serial.
sheralikhan 0:4b5aa5fe3ff4 61 * On success the PICC is halted after dumping the data.
sheralikhan 0:4b5aa5fe3ff4 62 * For MIFARE Classic the factory default key of 0xFFFFFFFFFFFF is tried.
sheralikhan 0:4b5aa5fe3ff4 63 */
sheralikhan 4:9d923c6e6c14 64 //Declaring MIFARE Classic 1k key
sheralikhan 4:9d923c6e6c14 65 MFRC522::MIFARE_Key key;
sheralikhan 0:4b5aa5fe3ff4 66
sheralikhan 0:4b5aa5fe3ff4 67 void DumpToSerial(MFRC522::Uid *uid)
sheralikhan 0:4b5aa5fe3ff4 68 {
sheralikhan 4:9d923c6e6c14 69
sheralikhan 0:4b5aa5fe3ff4 70
sheralikhan 0:4b5aa5fe3ff4 71 // Print Card UID
sheralikhan 0:4b5aa5fe3ff4 72 printf("Card UID: ");
sheralikhan 0:4b5aa5fe3ff4 73 for (uint8_t i = 0; i < RfChip.uid.size; i++) {
sheralikhan 0:4b5aa5fe3ff4 74 printf(" %X", RfChip.uid.uidByte[i]);
sheralikhan 0:4b5aa5fe3ff4 75 }
sheralikhan 0:4b5aa5fe3ff4 76 printf("\n\r");
sheralikhan 0:4b5aa5fe3ff4 77
sheralikhan 0:4b5aa5fe3ff4 78 // Print Card type
sheralikhan 0:4b5aa5fe3ff4 79 uint8_t piccType = RfChip.PICC_GetType(RfChip.uid.sak);
sheralikhan 0:4b5aa5fe3ff4 80 printf("PICC Type: %s \n\r", RfChip.PICC_GetTypeName(piccType));
sheralikhan 2:e27413743e1b 81 wait_ms(50);
sheralikhan 0:4b5aa5fe3ff4 82
sheralikhan 0:4b5aa5fe3ff4 83 // Dump contents
sheralikhan 0:4b5aa5fe3ff4 84 switch (piccType) {
sheralikhan 0:4b5aa5fe3ff4 85 case MFRC522::PICC_TYPE_MIFARE_MINI:
sheralikhan 0:4b5aa5fe3ff4 86 case MFRC522::PICC_TYPE_MIFARE_1K:
sheralikhan 0:4b5aa5fe3ff4 87 case MFRC522::PICC_TYPE_MIFARE_4K:
sheralikhan 0:4b5aa5fe3ff4 88 // All keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
sheralikhan 0:4b5aa5fe3ff4 89 for (uint8_t i = 0; i < 6; i++) {
sheralikhan 0:4b5aa5fe3ff4 90 key.keyByte[i] = 0xFF;
sheralikhan 0:4b5aa5fe3ff4 91 }
sheralikhan 3:f9ed412458d5 92 //Calling MIFARE Classic 1k memory block and sector
sheralikhan 0:4b5aa5fe3ff4 93 DumpMifareClassicToSerial(uid, piccType, &key);
sheralikhan 0:4b5aa5fe3ff4 94 break;
sheralikhan 0:4b5aa5fe3ff4 95
sheralikhan 0:4b5aa5fe3ff4 96 case MFRC522::PICC_TYPE_MIFARE_UL:
sheralikhan 3:f9ed412458d5 97 //Calling MIFARE Ultralight memory block,block data and sector,sector data
sheralikhan 0:4b5aa5fe3ff4 98 DumpMifareUltralightToSerial();
sheralikhan 0:4b5aa5fe3ff4 99 break;
sheralikhan 0:4b5aa5fe3ff4 100
sheralikhan 0:4b5aa5fe3ff4 101 default:
sheralikhan 0:4b5aa5fe3ff4 102 break; // No memory dump here
sheralikhan 0:4b5aa5fe3ff4 103 }
sheralikhan 0:4b5aa5fe3ff4 104
sheralikhan 0:4b5aa5fe3ff4 105 printf("\n\r");
sheralikhan 0:4b5aa5fe3ff4 106
sheralikhan 3:f9ed412458d5 107 RfChip.PICC_HaltA(); // Instructs a PICC in state ACTIVE(*) to go to state HALT.
sheralikhan 0:4b5aa5fe3ff4 108 } // End PICC_DumpToSerial()
sheralikhan 0:4b5aa5fe3ff4 109
sheralikhan 0:4b5aa5fe3ff4 110
sheralikhan 0:4b5aa5fe3ff4 111 /**
sheralikhan 0:4b5aa5fe3ff4 112 * Dumps memory contents of a MIFARE Ultralight PICC.
sheralikhan 0:4b5aa5fe3ff4 113 */
sheralikhan 2:e27413743e1b 114
sheralikhan 2:e27413743e1b 115 //Create function for writting data
sheralikhan 2:e27413743e1b 116 void WriteToRfidTag(MFRC522::Uid *uid)
sheralikhan 2:e27413743e1b 117 {
sheralikhan 2:e27413743e1b 118
sheralikhan 2:e27413743e1b 119 // Print Card UID
sheralikhan 2:e27413743e1b 120 printf("Card UID: ");
sheralikhan 2:e27413743e1b 121 for (uint8_t i = 0; i < RfChip.uid.size; i++) {
sheralikhan 2:e27413743e1b 122 printf(" %X", RfChip.uid.uidByte[i]);
sheralikhan 2:e27413743e1b 123 }
sheralikhan 2:e27413743e1b 124 printf("\n\r");
sheralikhan 2:e27413743e1b 125
sheralikhan 2:e27413743e1b 126 // Print Card type
sheralikhan 2:e27413743e1b 127 uint8_t piccType = RfChip.PICC_GetType(RfChip.uid.sak);
sheralikhan 2:e27413743e1b 128 printf("PICC Type: %s \n\r", RfChip.PICC_GetTypeName(piccType));
sheralikhan 2:e27413743e1b 129 wait_ms(50);
sheralikhan 2:e27413743e1b 130
sheralikhan 2:e27413743e1b 131 // Dump contents
sheralikhan 2:e27413743e1b 132 switch (piccType) {
sheralikhan 2:e27413743e1b 133 case MFRC522::PICC_TYPE_MIFARE_MINI:
sheralikhan 2:e27413743e1b 134 case MFRC522::PICC_TYPE_MIFARE_1K:
sheralikhan 2:e27413743e1b 135 case MFRC522::PICC_TYPE_MIFARE_4K:
sheralikhan 2:e27413743e1b 136 // All keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
sheralikhan 2:e27413743e1b 137 for (uint8_t i = 0; i < 6; i++) {
sheralikhan 2:e27413743e1b 138 key.keyByte[i] = 0xFF;
sheralikhan 2:e27413743e1b 139 }
sheralikhan 4:9d923c6e6c14 140 writeDataClassic1k(uid); // WriteToRfidTag(&(RfChip.uid))
sheralikhan 2:e27413743e1b 141 break;
sheralikhan 2:e27413743e1b 142
sheralikhan 2:e27413743e1b 143 case MFRC522::PICC_TYPE_MIFARE_UL:
sheralikhan 4:9d923c6e6c14 144 writeDataUL(uid);
sheralikhan 2:e27413743e1b 145 break;
sheralikhan 2:e27413743e1b 146 default:
sheralikhan 2:e27413743e1b 147 break; // No memory dump here
sheralikhan 2:e27413743e1b 148 }
sheralikhan 2:e27413743e1b 149 printf("\n\r");
sheralikhan 2:e27413743e1b 150 }
sheralikhan 2:e27413743e1b 151
sheralikhan 0:4b5aa5fe3ff4 152 int main()
sheralikhan 0:4b5aa5fe3ff4 153 {
sheralikhan 0:4b5aa5fe3ff4 154 /* Set debug UART speed */
sheralikhan 0:4b5aa5fe3ff4 155 printf("\n\rUART 9600 baud\n\r");
sheralikhan 4:9d923c6e6c14 156 cp.baud(9600);
sheralikhan 4:9d923c6e6c14 157 printf("\n\r%s %s\n\r",VERSION,BOARD);
sheralikhan 0:4b5aa5fe3ff4 158
sheralikhan 0:4b5aa5fe3ff4 159 /* Init. RC522 Chip */
sheralikhan 0:4b5aa5fe3ff4 160 RfChip.PCD_Init();
sheralikhan 0:4b5aa5fe3ff4 161
sheralikhan 0:4b5aa5fe3ff4 162 /* Read RC522 version */
sheralikhan 0:4b5aa5fe3ff4 163 uint8_t temp = RfChip.PCD_ReadRegister(MFRC522::VersionReg);
sheralikhan 4:9d923c6e6c14 164 printf("MFRC522 version: %d\n\r", temp);
sheralikhan 0:4b5aa5fe3ff4 165 printf("\n\r");
sheralikhan 4:9d923c6e6c14 166 cp.printf("Enter 1 Reading \n");
sheralikhan 4:9d923c6e6c14 167 cp.printf("Enter 2 Writing \n");
sheralikhan 0:4b5aa5fe3ff4 168
sheralikhan 2:e27413743e1b 169
sheralikhan 2:e27413743e1b 170 while(true) {
sheralikhan 2:e27413743e1b 171
sheralikhan 0:4b5aa5fe3ff4 172 LedGreen = 1;
sheralikhan 0:4b5aa5fe3ff4 173
sheralikhan 0:4b5aa5fe3ff4 174 // Look for new cards
sheralikhan 0:4b5aa5fe3ff4 175 if ( ! RfChip.PICC_IsNewCardPresent()) {
sheralikhan 2:e27413743e1b 176 wait_ms(50);
sheralikhan 0:4b5aa5fe3ff4 177 continue;
sheralikhan 0:4b5aa5fe3ff4 178 }
sheralikhan 2:e27413743e1b 179 LedGreen = 0;
sheralikhan 2:e27413743e1b 180 wait_ms(50);
sheralikhan 0:4b5aa5fe3ff4 181 // Select one of the cards
sheralikhan 0:4b5aa5fe3ff4 182 if ( ! RfChip.PICC_ReadCardSerial()) {
sheralikhan 2:e27413743e1b 183 wait_ms(50);
sheralikhan 0:4b5aa5fe3ff4 184 continue;
sheralikhan 0:4b5aa5fe3ff4 185 }
sheralikhan 2:e27413743e1b 186 LedGreen = 1;
sheralikhan 2:e27413743e1b 187 wait_ms(50);
sheralikhan 4:9d923c6e6c14 188 char ch=cp.getc();
sheralikhan 2:e27413743e1b 189 if(ch=='1') {
sheralikhan 4:9d923c6e6c14 190 cp.printf("reading..........\n");
sheralikhan 2:e27413743e1b 191 // Dump debug info about the card. PICC_HaltA() is automatically called.
sheralikhan 2:e27413743e1b 192 DumpToSerial(&(RfChip.uid));
sheralikhan 2:e27413743e1b 193 wait_ms(20);
sheralikhan 2:e27413743e1b 194 } else if(ch=='2') {
sheralikhan 4:9d923c6e6c14 195 cp.printf("Writing..... \n");
sheralikhan 2:e27413743e1b 196 //Calling WriteToRfidTag()
sheralikhan 2:e27413743e1b 197 WriteToRfidTag(&(RfChip.uid));
sheralikhan 2:e27413743e1b 198 wait_ms(50);
sheralikhan 0:4b5aa5fe3ff4 199
sheralikhan 2:e27413743e1b 200 }
sheralikhan 0:4b5aa5fe3ff4 201
sheralikhan 0:4b5aa5fe3ff4 202 }
sheralikhan 0:4b5aa5fe3ff4 203 }