PN532 Driver library This library provides an abstract API to drive the pn532 nfc chip, with I2C/HSU/SPI interface. Its based on the Seeed Studio's Arduino version.

Dependents:   PN532_ReadUid Nfctest2

Committer:
dotnfc
Date:
Tue Sep 13 06:17:35 2016 +0000
Revision:
1:b5922b3b3257
Parent:
0:db8030e71f55
Remove ununsed files.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dotnfc 0:db8030e71f55 1 ////////////////////////////////////////////////////////////////////////////////
dotnfc 0:db8030e71f55 2 // pn532 i2c interface for mbed platform
dotnfc 0:db8030e71f55 3 //
dotnfc 0:db8030e71f55 4 // by dotnfc@163.com
dotnfc 0:db8030e71f55 5 // 2016/09/10 18:16:00
dotnfc 0:db8030e71f55 6
dotnfc 0:db8030e71f55 7 #include "PN532_I2C.h"
dotnfc 0:db8030e71f55 8 #include "PN532_debug.h"
dotnfc 0:db8030e71f55 9 #include "Arduino.h"
dotnfc 0:db8030e71f55 10
dotnfc 0:db8030e71f55 11
dotnfc 0:db8030e71f55 12 PN532_I2C::PN532_I2C(mbed::I2C &wire)
dotnfc 0:db8030e71f55 13 {
dotnfc 0:db8030e71f55 14 _wire = &wire;
dotnfc 0:db8030e71f55 15 command = 0;
dotnfc 0:db8030e71f55 16 }
dotnfc 0:db8030e71f55 17
dotnfc 0:db8030e71f55 18 void PN532_I2C::begin()
dotnfc 0:db8030e71f55 19 {
dotnfc 0:db8030e71f55 20
dotnfc 0:db8030e71f55 21 }
dotnfc 0:db8030e71f55 22
dotnfc 0:db8030e71f55 23 void PN532_I2C::wakeup()
dotnfc 0:db8030e71f55 24 {
dotnfc 0:db8030e71f55 25
dotnfc 0:db8030e71f55 26 }
dotnfc 0:db8030e71f55 27
dotnfc 0:db8030e71f55 28 int8_t PN532_I2C::writeCommand(const uint8_t *header, uint8_t hlen, const uint8_t *body, uint8_t blen)
dotnfc 0:db8030e71f55 29 {
dotnfc 0:db8030e71f55 30 command = header[0];
dotnfc 0:db8030e71f55 31 MyBuffer <uint8_t> tBuf;
dotnfc 0:db8030e71f55 32
dotnfc 0:db8030e71f55 33 tBuf.put (PN532_PREAMBLE);
dotnfc 0:db8030e71f55 34 tBuf.put (PN532_STARTCODE1);
dotnfc 0:db8030e71f55 35 tBuf.put (PN532_STARTCODE2);
dotnfc 0:db8030e71f55 36
dotnfc 0:db8030e71f55 37 uint8_t length = hlen + blen + 1; // length of data field: TFI + DATA
dotnfc 0:db8030e71f55 38 tBuf.put (length);
dotnfc 0:db8030e71f55 39 tBuf.put (~length + 1); // checksum of length
dotnfc 0:db8030e71f55 40
dotnfc 0:db8030e71f55 41 tBuf.put (PN532_HOSTTOPN532);
dotnfc 0:db8030e71f55 42 uint8_t sum = PN532_HOSTTOPN532; // sum of TFI + DATA
dotnfc 0:db8030e71f55 43
dotnfc 0:db8030e71f55 44 DMSG("write: ");
dotnfc 0:db8030e71f55 45
dotnfc 0:db8030e71f55 46 for (uint8_t i = 0; i < hlen; i++) {
dotnfc 0:db8030e71f55 47 tBuf.put (header[i]);
dotnfc 0:db8030e71f55 48 sum += header[i];
dotnfc 0:db8030e71f55 49 DMSG_HEX(header[i]);
dotnfc 0:db8030e71f55 50 }
dotnfc 0:db8030e71f55 51
dotnfc 0:db8030e71f55 52 for (uint8_t i = 0; i < blen; i++) {
dotnfc 0:db8030e71f55 53 tBuf.put (body[i]);
dotnfc 0:db8030e71f55 54 sum += body[i];
dotnfc 0:db8030e71f55 55 DMSG_HEX(body[i]);
dotnfc 0:db8030e71f55 56 }
dotnfc 0:db8030e71f55 57
dotnfc 0:db8030e71f55 58 uint8_t checksum = ~sum + 1; // checksum of TFI + DATA
dotnfc 0:db8030e71f55 59 tBuf.put (checksum);
dotnfc 0:db8030e71f55 60 tBuf.put (PN532_POSTAMBLE);
dotnfc 0:db8030e71f55 61
dotnfc 0:db8030e71f55 62 _wire->write (PN532_I2C_ADDRESS, (const char *)tBuf.head(), tBuf.getLength());
dotnfc 0:db8030e71f55 63
dotnfc 0:db8030e71f55 64 DMSG("\n");
dotnfc 0:db8030e71f55 65
dotnfc 0:db8030e71f55 66 return readAckFrame();
dotnfc 0:db8030e71f55 67 }
dotnfc 0:db8030e71f55 68
dotnfc 0:db8030e71f55 69
dotnfc 0:db8030e71f55 70 int16_t PN532_I2C::readResponse(uint8_t buf[], uint8_t len, uint16_t timeout)
dotnfc 0:db8030e71f55 71 {
dotnfc 0:db8030e71f55 72 uint8_t stat;
dotnfc 0:db8030e71f55 73 uint16_t tlen = 256 + 5;
dotnfc 0:db8030e71f55 74 MyBuffer <uint8_t> tBuf(256 + 5);
dotnfc 0:db8030e71f55 75 Timer timer;
dotnfc 0:db8030e71f55 76 if (timeout !=0) {
dotnfc 0:db8030e71f55 77 timer.start();
dotnfc 0:db8030e71f55 78 }
dotnfc 0:db8030e71f55 79
dotnfc 0:db8030e71f55 80 do {
dotnfc 0:db8030e71f55 81 if (_wire->read (PN532_I2C_ADDRESS, (char *)&stat, 1) == 0) {
dotnfc 0:db8030e71f55 82
dotnfc 0:db8030e71f55 83 if (stat & 1) { // check the STATUS byte
dotnfc 0:db8030e71f55 84 wait_ms (2);
dotnfc 0:db8030e71f55 85
dotnfc 0:db8030e71f55 86 if (tlen > len)
dotnfc 0:db8030e71f55 87 tlen = len;
dotnfc 0:db8030e71f55 88
dotnfc 0:db8030e71f55 89 if (_wire->read(PN532_I2C_ADDRESS, (char *)tBuf.head(), tlen) == 0) {
dotnfc 0:db8030e71f55 90 break;
dotnfc 0:db8030e71f55 91 }
dotnfc 0:db8030e71f55 92 }
dotnfc 0:db8030e71f55 93 }
dotnfc 0:db8030e71f55 94
dotnfc 0:db8030e71f55 95 if (0 != timeout) {
dotnfc 0:db8030e71f55 96 if (timer.read_ms() > timeout) {
dotnfc 0:db8030e71f55 97 timer.stop ();
dotnfc 0:db8030e71f55 98 return -1;
dotnfc 0:db8030e71f55 99 }
dotnfc 0:db8030e71f55 100 }
dotnfc 0:db8030e71f55 101
dotnfc 0:db8030e71f55 102 } while (1);
dotnfc 0:db8030e71f55 103
dotnfc 0:db8030e71f55 104 if (0x01 != tBuf.get() || // STATUS
dotnfc 0:db8030e71f55 105 0x00 != tBuf.get() || // PREAMBLE
dotnfc 0:db8030e71f55 106 0x00 != tBuf.get() || // STARTCODE1
dotnfc 0:db8030e71f55 107 0xFF != tBuf.get() // STARTCODE2
dotnfc 0:db8030e71f55 108 ) {
dotnfc 0:db8030e71f55 109
dotnfc 0:db8030e71f55 110 return PN532_INVALID_FRAME;
dotnfc 0:db8030e71f55 111 }
dotnfc 0:db8030e71f55 112
dotnfc 0:db8030e71f55 113 uint8_t length = tBuf.get();
dotnfc 0:db8030e71f55 114 if (0 != (uint8_t)(length + tBuf.get())) { // checksum of length
dotnfc 0:db8030e71f55 115 return PN532_INVALID_FRAME;
dotnfc 0:db8030e71f55 116 }
dotnfc 0:db8030e71f55 117
dotnfc 0:db8030e71f55 118 uint8_t cmd = command + 1; // response command
dotnfc 0:db8030e71f55 119 if (PN532_PN532TOHOST != tBuf.get() || (cmd) != tBuf.get()) {
dotnfc 0:db8030e71f55 120 return PN532_INVALID_FRAME;
dotnfc 0:db8030e71f55 121 }
dotnfc 0:db8030e71f55 122
dotnfc 0:db8030e71f55 123 length -= 2;
dotnfc 0:db8030e71f55 124 if (length > len) {
dotnfc 0:db8030e71f55 125 return PN532_NO_SPACE; // not enough space
dotnfc 0:db8030e71f55 126 }
dotnfc 0:db8030e71f55 127
dotnfc 0:db8030e71f55 128 DMSG("read: ");
dotnfc 0:db8030e71f55 129 DMSG_HEX(cmd);
dotnfc 0:db8030e71f55 130
dotnfc 0:db8030e71f55 131 uint8_t sum = PN532_PN532TOHOST + cmd;
dotnfc 0:db8030e71f55 132 for (uint8_t i = 0; i < length; i++) {
dotnfc 0:db8030e71f55 133 buf[i] = tBuf.get();
dotnfc 0:db8030e71f55 134 sum += buf[i];
dotnfc 0:db8030e71f55 135
dotnfc 0:db8030e71f55 136 DMSG_HEX(buf[i]);
dotnfc 0:db8030e71f55 137 }
dotnfc 0:db8030e71f55 138 DMSG("\n");
dotnfc 0:db8030e71f55 139
dotnfc 0:db8030e71f55 140 uint8_t checksum = tBuf.get();
dotnfc 0:db8030e71f55 141 if (0 != (uint8_t)(sum + checksum)) {
dotnfc 0:db8030e71f55 142 DMSG("checksum is not ok\n");
dotnfc 0:db8030e71f55 143 return PN532_INVALID_FRAME;
dotnfc 0:db8030e71f55 144 }
dotnfc 0:db8030e71f55 145 //tBuf.get(); // POSTAMBLE
dotnfc 0:db8030e71f55 146
dotnfc 0:db8030e71f55 147 return length;
dotnfc 0:db8030e71f55 148 }
dotnfc 0:db8030e71f55 149
dotnfc 0:db8030e71f55 150 int8_t PN532_I2C::readAckFrame()
dotnfc 0:db8030e71f55 151 {
dotnfc 0:db8030e71f55 152 const uint8_t PN532_ACK[] = {0, 0, 0xFF, 0, 0xFF, 0};
dotnfc 0:db8030e71f55 153 MyBuffer <uint8_t> ackBuf(sizeof(PN532_ACK) + 1);
dotnfc 0:db8030e71f55 154
dotnfc 0:db8030e71f55 155 Timer timer;
dotnfc 0:db8030e71f55 156 timer.start();
dotnfc 0:db8030e71f55 157
dotnfc 0:db8030e71f55 158 do {
dotnfc 0:db8030e71f55 159 // if (_wire->requestFrom(PN532_I2C_ADDRESS, sizeof(PN532_ACK) + 1)) {
dotnfc 0:db8030e71f55 160 if (_wire->read(PN532_I2C_ADDRESS, (char *)ackBuf.head(), sizeof(PN532_ACK) + 1) == 0) {
dotnfc 0:db8030e71f55 161 if (ackBuf.get() & 1) { // check first byte --- status
dotnfc 0:db8030e71f55 162 break; // PN532 is ready
dotnfc 0:db8030e71f55 163 }
dotnfc 0:db8030e71f55 164 }
dotnfc 0:db8030e71f55 165
dotnfc 0:db8030e71f55 166 if (timer.read_ms() > PN532_ACK_WAIT_TIME) {
dotnfc 0:db8030e71f55 167 DMSG("Time out when waiting for ACK\n");
dotnfc 0:db8030e71f55 168 timer.stop ();
dotnfc 0:db8030e71f55 169 return PN532_TIMEOUT;
dotnfc 0:db8030e71f55 170 }
dotnfc 0:db8030e71f55 171 } while (1);
dotnfc 0:db8030e71f55 172
dotnfc 0:db8030e71f55 173 for (uint8_t i = 0; i < sizeof(PN532_ACK); i++) {
dotnfc 0:db8030e71f55 174 if (ackBuf.get() != PN532_ACK[i])
dotnfc 0:db8030e71f55 175 return PN532_INVALID_ACK;
dotnfc 0:db8030e71f55 176 }
dotnfc 0:db8030e71f55 177
dotnfc 0:db8030e71f55 178 return 0;
dotnfc 0:db8030e71f55 179 }