grove nfc_tag sample program

Dependencies:   mbed

Revision:
0:b939441bcdc7
Child:
1:c492babe8dc3
diff -r 000000000000 -r b939441bcdc7 nfc_tag.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nfc_tag.cpp	Tue Mar 28 10:21:09 2017 +0000
@@ -0,0 +1,304 @@
+/*
+ * 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;
+        }else{
+            eeAddr = EEPROM_ADDR_E2_ENABLE;
+        }     
+  _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;   
+}
\ No newline at end of file