forked from Seeed-Studio/NFC_Tag_M24LR6E
-
Notifications
You must be signed in to change notification settings - Fork 0
/
NfcTag.cpp
164 lines (138 loc) · 4.53 KB
/
NfcTag.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#include "NfcTag.h"
void NfcTag::init() {
Wire.begin(4, 16, 400000U);
}
void NfcTag::submitPassWd(byte* passWd) {
Wire.beginTransmission(eeAddr);
Wire.write(0x09);
Wire.write(0x00);
for (int i = 0; i < PASSWORD_LENGTH; i++) {
Wire.write(passWd[i]);
}
Wire.write(0x09);
for (int i = 0; i < PASSWORD_LENGTH; i++) {
Wire.write(passWd[i]);
}
Wire.endTransmission();// stop transmitting
}
void NfcTag::writePassWd(byte* passWd) {
Wire.beginTransmission(eeAddr);
Wire.write(0x09);
Wire.write(0x00);
for (int i = 0; i < PASSWORD_LENGTH; i++) {
Wire.write(passWd[i]);
}
Wire.write(0x07);
for (int i = 0; i < PASSWORD_LENGTH; i++) {
Wire.write(passWd[i]);
}
Wire.endTransmission(); // stop transmitting
}
void NfcTag::sectorProtectConfig(unsigned int sectorNumber, bool protectEnable, SectorAccessRight accessRight,
SectorSelectPassWd passWd) {
if (!protectEnable) {
_EEPROM_Write_Byte(sectorNumber, 0x0);
} else {
_EEPROM_Write_Byte(sectorNumber, protectEnable | (accessRight << 1) | (passWd << 2));
}
}
void NfcTag::clearSectorProtect(void) {
byte buf[64] = {0x0};
_EEPROM_Write_Bytes(0, buf, 64);
}
void NfcTag::sectorWriteSockConfig(unsigned int sectorNumber, bool sockEnable) {
unsigned int sectorAddress = SECTOR_SECURITY_STATUS_BASE_ADDR + (sectorNumber / 8);
byte sectorBit = sectorNumber % 8;
byte preStatus = _EEPROM_Read_Byte(sectorAddress);
//bool status = (preStatus|(1<<sectorBit))>>sectorBit;
bool status = (preStatus >> sectorBit) & 0x01;
if (status != sockEnable) {
if (status == true) {
writeByte(sectorAddress, preStatus & (~(1 << sectorBit)));
} else {
writeByte(sectorAddress, preStatus | (1 << sectorBit));
}
}
}
byte NfcTag::getDSFID() {
return _EEPROM_Read_Byte(DSFID_ADDR);
}
byte NfcTag::getAFI() {
return _EEPROM_Read_Byte(AFI_ADDR);
}
uint16_t NfcTag::getRFU() {
uint16_t rfu = 0x00;
rfu = _EEPROM_Read_Byte(RFU_ADDR);
return (rfu << 8 | _EEPROM_Read_Byte(RFU_ADDR + 1));
}
byte NfcTag::getUID(byte* buf) {
_EEPROM_Read_Bytes(UID_ADDR, buf, UID_LENGTH);
return UID_LENGTH;
}
uint32_t NfcTag::getMemoryVolume() {
uint32_t volume = 0x0;
volume = _EEPROM_Read_Byte(MEMORY_VOLUME_ADDR);
volume = volume << 8 | _EEPROM_Read_Byte(MEMORY_VOLUME_ADDR + 1);
volume = volume << 8 | _EEPROM_Read_Byte(MEMORY_VOLUME_ADDR + 2);
return volume;
}
byte NfcTag::getICNumber() {
return _EEPROM_Read_Byte(IC_NUMBER_ADDR);
}
void NfcTag::clearMemory() {
for (int i = 0; i < EEPROM_I2C_LENGTH; i++) {
writeByte(i, 0x0);
}
}
void NfcTag::writeByte(unsigned int address, byte data) {
_EEPROM_Write_Byte(address, data);
}
void NfcTag::writeBytes(unsigned int address, byte* buf, unsigned int len) {
_EEPROM_Write_Bytes(address, buf, len);
}
byte NfcTag::readByte(unsigned int address) {
return _EEPROM_Read_Byte(address);
}
void NfcTag::readBytes(unsigned int address, byte* buf, unsigned int len) {
_EEPROM_Read_Bytes(address, buf, len);
}
void NfcTag::_EEPROM_Write_Byte(unsigned int address, byte data) {
Wire.beginTransmission(eeAddr);
Wire.write((int)(address >> 8)); // MSB
Wire.write((int)(address & 0xFF));// LSB
Wire.write(data); // sends one byte
//delay(5);
Wire.endTransmission(); // stop transmitting
}
void NfcTag::_EEPROM_Write_Bytes(unsigned int address, byte* buf, unsigned int len) {
Wire.beginTransmission(eeAddr);
Wire.write((int)(address >> 8)); // MSB
Wire.write((int)(address & 0xFF));// LSB
for (int i = 0; i < len; i++) {
Wire.write(buf[i]); // sends one byte
}
Wire.endTransmission(); // stop transmitting
}
byte NfcTag::_EEPROM_Read_Byte(unsigned int address) {
byte rdata = 0x7F;
Wire.beginTransmission(eeAddr); //Device Address
Wire.write((int)(address >> 8)); // EEPROM_MSB
Wire.write((int)(address & 0xFF)); // EEPROM_LSB
Wire.endTransmission();
Wire.requestFrom(eeAddr, 1);
rdata = Wire.read();
return rdata;
}
unsigned int NfcTag::_EEPROM_Read_Bytes(unsigned int address, byte* buf, unsigned int len) {
byte rdata = 0x7F;
Wire.beginTransmission(eeAddr); //Device Address
Wire.write((int)(address >> 8)); // EEPROM_MSB
Wire.write((int)(address & 0xFF)); // EEPROM_LSB
Wire.endTransmission();
int i = 0;
Wire.requestFrom(eeAddr, len);
while (Wire.available()) {
buf[i++] = Wire.read();
}
return i;
}