grove nfc_tag sample program
Dependencies: mbed
nfc_tag.cpp
- Committer:
- superphil06
- Date:
- 2017-03-31
- Revision:
- 1:c492babe8dc3
- Parent:
- 0:b939441bcdc7
File content as of revision 1:c492babe8dc3:
/* * NfcTag.cpp * a library to use NFC Tag * * Copyright (c) 2014 seeed technology inc. * Website : www.seeed.cc * Author : lawliet zou * Create Time: March 2014 * Change Log : * * The MIT License (MIT) * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #include "nfc_tag.h" /* void NfcTag::init() { Wire.begin(); }*/ // Class Constructor NfcTag::NfcTag(PinName sda,PinName scl,uint8_t address,AccessMode mode = USER_MODE): m_I2C(sda, scl) { if(mode == USER_MODE){ eeAddr = EEPROM_ADDR_E2_DISABLE<<1; }else{ eeAddr = EEPROM_ADDR_E2_ENABLE<<1; } _address = address; // m_I2C Module Address } NfcTag::~NfcTag() { } void NfcTag::submitPassWd(uint8_t* passWd) {/* Wire.beginTransmission(eeAddr); Wire.write(0x09); Wire.write(0x00); */ (void) m_I2C.start(); m_I2C.write(eeAddr); m_I2C.write(0x09); m_I2C.write(0x00); for(int i = 0; i < PASSWORD_LENGTH; i++){ // Wire.write(passWd[i]); m_I2C.write(passWd[i]); } //Wire.write(0x09); m_I2C.write(0x09); for(int i = 0; i < PASSWORD_LENGTH; i++){ //Wire.write(passWd[i]); m_I2C.write(passWd[i]); } //Wire.endTransmission();// stop transmitting m_I2C.stop(); } void NfcTag::writePassWd(uint8_t* passWd) { /*Wire.beginTransmission(eeAddr); Wire.write(0x09); Wire.write(0x00);*/ (void) m_I2C.start(); m_I2C.write(eeAddr); m_I2C.write(0x09); m_I2C.write(0x00); for(int i = 0; i < PASSWORD_LENGTH; i++){ // Wire.write(passWd[i]); m_I2C.write(passWd[i]); } //Wire.write(0x07); m_I2C.write(0x07); for(int i = 0; i < PASSWORD_LENGTH; i++){ // Wire.write(passWd[i]); m_I2C.write(passWd[i]); } // Wire.endTransmission(); // stop transmitting m_I2C.stop(); } void NfcTag::sectorProtectConfig(unsigned int sectorNumber, bool protectEnable, SectorAccessRight accessRight, SectorSelectPassWd passWd) { if(!protectEnable){ _EEPROM_Write_uint8_t(sectorNumber,0x0); }else{ _EEPROM_Write_uint8_t(sectorNumber,protectEnable|(accessRight<<1)|(passWd<<2)); } } void NfcTag::clearSectorProtect(void) { uint8_t buf[64]={0x0}; _EEPROM_Write_uint8_ts(0, buf, 64); } void NfcTag::sectorWriteSockConfig(unsigned int sectorNumber, bool sockEnable) { unsigned int sectorAddress = SECTOR_SECURITY_STATUS_BASE_ADDR + (sectorNumber/8); uint8_t sectorBit = sectorNumber%8; uint8_t preStatus = _EEPROM_Read_uint8_t(sectorAddress); //bool status = (preStatus|(1<<sectorBit))>>sectorBit; bool status = (preStatus>>sectorBit)&0x01; if(status != sockEnable){ if(status == true){ writeuint8_t(sectorAddress,preStatus&(~(1<<sectorBit))); }else{ writeuint8_t(sectorAddress,preStatus|(1<<sectorBit)); } } } uint8_t NfcTag::getDSFID() { return _EEPROM_Read_uint8_t(DSFID_ADDR); } uint8_t NfcTag::getAFI() { return _EEPROM_Read_uint8_t(AFI_ADDR); } uint16_t NfcTag::getRFU() { uint16_t rfu = 0x00; rfu = _EEPROM_Read_uint8_t(RFU_ADDR); return (rfu<<8|_EEPROM_Read_uint8_t(RFU_ADDR+1)); } uint8_t NfcTag::getUID(uint8_t* buf) { _EEPROM_Read_uint8_ts(UID_ADDR,buf,UID_LENGTH); return UID_LENGTH; } uint32_t NfcTag::getMemoryVolume() { uint32_t volume = 0x0; volume = _EEPROM_Read_uint8_t(MEMORY_VOLUME_ADDR); volume = volume<<8|_EEPROM_Read_uint8_t(MEMORY_VOLUME_ADDR+1); volume = volume<<8|_EEPROM_Read_uint8_t(MEMORY_VOLUME_ADDR+2); return volume; } uint8_t NfcTag::getICNumber() { return _EEPROM_Read_uint8_t(IC_NUMBER_ADDR); } void NfcTag::clearMemory() { for(int i = 0; i < EEPROM_I2C_LENGTH; i++){ writeuint8_t(i,0x0); } } void NfcTag::writeuint8_t(unsigned int address, uint8_t data) { _EEPROM_Write_uint8_t(address, data); } void NfcTag::writeuint8_ts(unsigned int address, uint8_t* buf, unsigned int len) { _EEPROM_Write_uint8_ts(address, buf, len); } uint8_t NfcTag::readuint8_t(unsigned int address) { return _EEPROM_Read_uint8_t(address); } void NfcTag::readuint8_ts(unsigned int address, uint8_t* buf, unsigned int len) { _EEPROM_Read_uint8_ts(address, buf, len); } void NfcTag::_EEPROM_Write_uint8_t(unsigned int address, uint8_t data) { /*Wire.beginTransmission(eeAddr); Wire.write((int)(address >> 8)); // MSB Wire.write((int)(address & 0xFF));// LSB Wire.write(data); // sends one uint8_t //delay(5); Wire.endTransmission(); // stop transmitting */ (void) m_I2C.start(); m_I2C.write(eeAddr); m_I2C.write((int)(address >> 8)); m_I2C.write((int)(address & 0xFF)); m_I2C.write(data); wait_ms(5); m_I2C.stop(); } void NfcTag::_EEPROM_Write_uint8_ts(unsigned int address, uint8_t* buf, unsigned int len) { /*Wire.beginTransmission(eeAddr); Wire.write((int)(address >> 8)); // MSB Wire.write((int)(address & 0xFF));// LSB */ (void) m_I2C.start(); m_I2C.write(eeAddr); m_I2C.write((int)(address >> 8)); m_I2C.write((int)(address & 0xFF)); for(int i = 0; i < len; i++){ // Wire.write(buf[i]); // sends one uint8_t m_I2C.write(buf[i]); // sends one uint8_t } //Wire.endTransmission(); // stop transmitting m_I2C.stop(); } uint8_t NfcTag::_EEPROM_Read_uint8_t(unsigned int address) { uint8_t rdata = 0x7F; /*Wire.beginTransmission(eeAddr); //Device Address Wire.write((int)(address >> 8)); // EEPROM_MSB Wire.write((int)(address & 0xFF)); // EEPROM_LSB Wire.endTransmission();*/ (void) m_I2C.start(); m_I2C.write(eeAddr); m_I2C.write((int)(address >> 8)); m_I2C.write((int)(address & 0xFF)); m_I2C.stop(); //Wire.beginTransmission(eeAddr); (void) m_I2C.start(); // Wire.requestFrom(eeAddr,1); m_I2C.write(eeAddr|1);// request read mode /*if (Wire.available()){ rdata = Wire.read(); }*/ rdata = m_I2C.read(0);// read byte no ack //Wire.endTransmission(); // end transmission m_I2C.stop(); return rdata; } unsigned int NfcTag::_EEPROM_Read_uint8_ts(unsigned int address, uint8_t* buf, unsigned int len) { uint8_t rdata = 0x7F; /*ire.beginTransmission(eeAddr); //Device Address Wire.write((int)(address >> 8)); // EEPROM_MSB Wire.write((int)(address & 0xFF)); // EEPROM_LSB Wire.endTransmission();*/ (void) m_I2C.start(); m_I2C.write(eeAddr); m_I2C.write((int)(address >> 8)); m_I2C.write((int)(address & 0xFF)); m_I2C.stop(); /* Wire.beginTransmission(eeAddr); Wire.requestFrom(eeAddr,len);*/ (void) m_I2C.start(); //Wire.requestFrom(eeAddr,1); m_I2C.write(eeAddr|1);// request read mode int i = 0; // while(Wire.available()){ while(i<len){ // buf[i++] = Wire.read(); buf[i++] = m_I2C.read(1);// read I2C with ack } // Wire.endTransmission(); // end transmission m_I2C.stop(); return i; }