LibPN532 for mbed sample - Read Tag Uid

Dependencies:   LibPN532 mbed

Fork of PN532_ReadUid by dotnfc Tang

Committer:
brainliang
Date:
Wed Oct 17 10:36:55 2018 +0000
Revision:
1:18f5ba9fb718
Parent:
0:54a12c4b19c2
PN532_ReadUID

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dotnfc 0:54a12c4b19c2 1 // Basic example show how to read a tag uid.
dotnfc 0:54a12c4b19c2 2 // you can use i2c, spi, hsu interface.
dotnfc 0:54a12c4b19c2 3 //
dotnfc 0:54a12c4b19c2 4 // Assembled by dotnfc as Arducleo Sample
dotnfc 0:54a12c4b19c2 5 // 2016/09/10
dotnfc 0:54a12c4b19c2 6
dotnfc 0:54a12c4b19c2 7
dotnfc 0:54a12c4b19c2 8
dotnfc 0:54a12c4b19c2 9 #include "mbed.h"
dotnfc 0:54a12c4b19c2 10 #include "PN532.h"
dotnfc 0:54a12c4b19c2 11 #include "PN532_HSU.h"
dotnfc 0:54a12c4b19c2 12 #include "PN532_SPI.h"
dotnfc 0:54a12c4b19c2 13 #include "PN532_I2C.h"
dotnfc 0:54a12c4b19c2 14
brainliang 1:18f5ba9fb718 15 DigitalOut ledBrd (PC_13); // 板载led
brainliang 1:18f5ba9fb718 16 DigitalOut ledNFC (PC_7); // 状态led
brainliang 1:18f5ba9fb718 17 DigitalOut rstNFC (PB_5); // pn532读卡器复位控制
dotnfc 0:54a12c4b19c2 18
dotnfc 0:54a12c4b19c2 19 PwmOut buz(PB_1);
dotnfc 0:54a12c4b19c2 20
brainliang 1:18f5ba9fb718 21 Serial pc(PB_10, PB_11); //调试串口
dotnfc 0:54a12c4b19c2 22
dotnfc 0:54a12c4b19c2 23 // ----------------------------------------- HSU
brainliang 1:18f5ba9fb718 24 HardwareSerial pn532_hsu (PA_2, PA_3); //pn532连接的串口,需要时取消这两句注释
brainliang 1:18f5ba9fb718 25 PN532_HSU pn532_if (pn532_hsu);
dotnfc 0:54a12c4b19c2 26
dotnfc 0:54a12c4b19c2 27 // ----------------------------------------- SPI
brainliang 1:18f5ba9fb718 28 //SPI pn532_spi (SPI_MOSI, SPI_MISO, SPI_SCK); //pn532连接的SPI,需要时取消这两句注释
brainliang 1:18f5ba9fb718 29 //PN532_SPI pn532_if (pn532_spi, SPI_CS);
dotnfc 0:54a12c4b19c2 30
dotnfc 0:54a12c4b19c2 31 // ----------------------------------------- I2C
brainliang 1:18f5ba9fb718 32 //I2C pn532_i2c (I2C_SDA, I2C_SCL); //pn532连接的I2C,需要时取消这两句注释
dotnfc 0:54a12c4b19c2 33 //PN532_I2C pn532_if (pn532_i2c);
dotnfc 0:54a12c4b19c2 34
dotnfc 0:54a12c4b19c2 35
dotnfc 0:54a12c4b19c2 36
dotnfc 0:54a12c4b19c2 37 PN532 nfc(pn532_if);
dotnfc 0:54a12c4b19c2 38
dotnfc 0:54a12c4b19c2 39 /*==============================================================================
brainliang 1:18f5ba9fb718 40 * \复位pn532数卡器
dotnfc 0:54a12c4b19c2 41 */
dotnfc 0:54a12c4b19c2 42 void reset_chip (void)
dotnfc 0:54a12c4b19c2 43 {
dotnfc 0:54a12c4b19c2 44 rstNFC = 0;
dotnfc 0:54a12c4b19c2 45 wait_ms (100);
dotnfc 0:54a12c4b19c2 46 rstNFC = 1;
dotnfc 0:54a12c4b19c2 47 }
dotnfc 0:54a12c4b19c2 48
dotnfc 0:54a12c4b19c2 49
dotnfc 0:54a12c4b19c2 50 /*==============================================================================
brainliang 1:18f5ba9fb718 51 * \初始化外设
dotnfc 0:54a12c4b19c2 52 */
dotnfc 0:54a12c4b19c2 53 void setup(void)
dotnfc 0:54a12c4b19c2 54 {
dotnfc 0:54a12c4b19c2 55 ledBrd = 0;
dotnfc 0:54a12c4b19c2 56 ledNFC = 0;
dotnfc 0:54a12c4b19c2 57 reset_chip ();
dotnfc 0:54a12c4b19c2 58
dotnfc 0:54a12c4b19c2 59 uint32_t versiondata = 0;
brainliang 1:18f5ba9fb718 60 pc.baud(115200); //波特率设置为115200
brainliang 1:18f5ba9fb718 61 pc.printf ("Hello!\r\n");
dotnfc 0:54a12c4b19c2 62
brainliang 1:18f5ba9fb718 63 /*while (1) {
dotnfc 0:54a12c4b19c2 64 nfc.begin();
dotnfc 0:54a12c4b19c2 65 //nfc.SAMConfig();
dotnfc 0:54a12c4b19c2 66 versiondata = nfc.getFirmwareVersion();
dotnfc 0:54a12c4b19c2 67 if (! versiondata) {
dotnfc 0:54a12c4b19c2 68 pc.printf("Didn't find PN53x board\n\n");
dotnfc 0:54a12c4b19c2 69 wait_ms(500);
dotnfc 0:54a12c4b19c2 70 } else {
dotnfc 0:54a12c4b19c2 71 break;
dotnfc 0:54a12c4b19c2 72 }
brainliang 1:18f5ba9fb718 73 }*/
brainliang 1:18f5ba9fb718 74 nfc.begin();
dotnfc 0:54a12c4b19c2 75
dotnfc 0:54a12c4b19c2 76 // Got ok data, print it out!
brainliang 1:18f5ba9fb718 77 pc.printf ("Found chip PN5%02X , Firmware ver. %d.%d\r\n",
dotnfc 0:54a12c4b19c2 78 (versiondata>>24) & 0xFF,
dotnfc 0:54a12c4b19c2 79 (versiondata>>16) & 0xFF,
dotnfc 0:54a12c4b19c2 80 (versiondata>>8) & 0xFF);
dotnfc 0:54a12c4b19c2 81
brainliang 1:18f5ba9fb718 82 // 设置从卡片读取的c重复尝试的最大重试次数。
brainliang 1:18f5ba9fb718 83 // 这使我们避免永远的等待读取一个卡,永远等待是PN532默认行为
dotnfc 0:54a12c4b19c2 84 nfc.setPassiveActivationRetries(0xFF);
dotnfc 0:54a12c4b19c2 85
brainliang 1:18f5ba9fb718 86 // 配置板读取RFID标签
dotnfc 0:54a12c4b19c2 87 nfc.SAMConfig();
dotnfc 0:54a12c4b19c2 88
brainliang 1:18f5ba9fb718 89 pc.printf ("\nWaiting for an ISO14443A card\r\n");
dotnfc 0:54a12c4b19c2 90 }
dotnfc 0:54a12c4b19c2 91
dotnfc 0:54a12c4b19c2 92
dotnfc 0:54a12c4b19c2 93 /*==============================================================================
brainliang 1:18f5ba9fb718 94 * \发现标签
dotnfc 0:54a12c4b19c2 95 */
dotnfc 0:54a12c4b19c2 96 void loop(void)
dotnfc 0:54a12c4b19c2 97 {
dotnfc 0:54a12c4b19c2 98 bool success;
brainliang 1:18f5ba9fb718 99 uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // 存储返回UID值的缓冲
brainliang 1:18f5ba9fb718 100 uint8_t uidLength; // UID的长度(根据ISO14443A卡类型4或7个字节)
dotnfc 0:54a12c4b19c2 101
brainliang 1:18f5ba9fb718 102 // 配置板读取RFID标签
dotnfc 0:54a12c4b19c2 103 nfc.SAMConfig();
dotnfc 0:54a12c4b19c2 104
brainliang 1:18f5ba9fb718 105 // 等待一个ISO14443A类型的卡(如Mifare卡等). 当发现一个时,'uid'会被UID填充,并且uid长度会指出该uid是4字节(典型的Mifare)或7字节(超轻Mifare),100是超时时间(单位是毫秒,ms)
brainliang 1:18f5ba9fb718 106 success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength, 100);
dotnfc 0:54a12c4b19c2 107
brainliang 1:18f5ba9fb718 108 printf ("\r\n");
dotnfc 0:54a12c4b19c2 109
dotnfc 0:54a12c4b19c2 110 if (success) {
brainliang 1:18f5ba9fb718 111 tone (buz, 800); // 打开蜂鸣器
brainliang 1:18f5ba9fb718 112 ledNFC = 1; // 打开led
dotnfc 0:54a12c4b19c2 113
brainliang 1:18f5ba9fb718 114 pc.printf("Found a card!\r\n");
brainliang 1:18f5ba9fb718 115
brainliang 1:18f5ba9fb718 116 // nfc.writeGPIOP7((1<<PN532_GPIO_P71)); //把P70,P72设置为1,其余P7设置为0
brainliang 1:18f5ba9fb718 117 nfc.writeGPIOP3((1<<PN532_GPIO_P31)|(1<<PN532_GPIO_P30)); //把P30,P32设置为1,其余P3设置为0
brainliang 1:18f5ba9fb718 118 nfc.writeGPIOP7((1<<PN532_GPIO_P71)); //把P70,P72设置为1,其余P7设置为0
brainliang 1:18f5ba9fb718 119 // nfc.writeGPIOP7(0); //把P7全部设置为0
dotnfc 0:54a12c4b19c2 120
brainliang 1:18f5ba9fb718 121 pc.printf("UID Length: %d bytes\r\n", uidLength);
dotnfc 0:54a12c4b19c2 122 pc.printf("UID Value: ");
dotnfc 0:54a12c4b19c2 123
dotnfc 0:54a12c4b19c2 124 for (uint8_t i=0; i < uidLength; i++)
dotnfc 0:54a12c4b19c2 125 pc.printf(" 0x%02X", uid[i]);
dotnfc 0:54a12c4b19c2 126
brainliang 1:18f5ba9fb718 127 pc.printf("\r\n");
dotnfc 0:54a12c4b19c2 128
dotnfc 0:54a12c4b19c2 129 wait_ms (100);
brainliang 1:18f5ba9fb718 130 tone (buz, 0); // 关闭蜂鸣器
dotnfc 0:54a12c4b19c2 131
brainliang 1:18f5ba9fb718 132 // 等到移开卡时
brainliang 1:18f5ba9fb718 133 while (nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength, 500)) {}
brainliang 1:18f5ba9fb718 134 nfc.writeGPIOP3(0);
brainliang 1:18f5ba9fb718 135 nfc.writeGPIOP7(0);
brainliang 1:18f5ba9fb718 136 ledNFC = 0; // 关闭led
dotnfc 0:54a12c4b19c2 137 } else {
brainliang 1:18f5ba9fb718 138 // PN532可能等待卡片超时
brainliang 1:18f5ba9fb718 139 pc.printf("\nTimed out waiting for a card\r\n");
dotnfc 0:54a12c4b19c2 140 ledNFC = 0;
dotnfc 0:54a12c4b19c2 141 wait_ms (200);
dotnfc 0:54a12c4b19c2 142 }
dotnfc 0:54a12c4b19c2 143 }
dotnfc 0:54a12c4b19c2 144
dotnfc 0:54a12c4b19c2 145
dotnfc 0:54a12c4b19c2 146 /*==============================================================================
brainliang 1:18f5ba9fb718 147 * \main入口
dotnfc 0:54a12c4b19c2 148 */
dotnfc 0:54a12c4b19c2 149 int main()
dotnfc 0:54a12c4b19c2 150 {
dotnfc 0:54a12c4b19c2 151 setup();
dotnfc 0:54a12c4b19c2 152
dotnfc 0:54a12c4b19c2 153 while (1)
dotnfc 0:54a12c4b19c2 154 loop ();
dotnfc 0:54a12c4b19c2 155 }
dotnfc 0:54a12c4b19c2 156