This application provides a set of demos with X-NUCLEO-NFC01A1 expansion board.

Dependencies:   NDefLib X_NUCLEO_NFC01A1 mbed

Fork of X-MBED-NFC1 by Giovanni Visentini

This application provides a set of demos with X-NUCLEO-NFC01A1 expansion board.

The available demos are:

  • SAMPLE_WRITE_URL: write a tag with the ST home page URL
  • SAMPLE_COUNT_CLICK: create a custom tag to count and report the user button clicks.
  • SAMPLE_WRITE_AND_CHANGE_ALL: write a tag with all the supported records and update the tag contents when the user button is pressed.
  • SAMPLE_LOCK_TAG_CONTENT: use the M24SR component API to set the NFC tag as read-only.

To enable the different demos comment/uncomment the SAMPLE_* macros provided in main.cpp .

Committer:
giovannivisentini
Date:
Fri Nov 27 15:10:25 2015 +0000
Revision:
1:6d202b62ed68
Parent:
0:674813bd5ec9
Child:
2:0648c1561eb2
add the enable/disable read/write function

Who changed what in which revision?

UserRevisionLine numberNew contents of line
giovannivisentini 0:674813bd5ec9 1 #include <cstring>
giovannivisentini 0:674813bd5ec9 2 #include "mbed.h"
giovannivisentini 0:674813bd5ec9 3
giovannivisentini 0:674813bd5ec9 4 #include "m24sr/m24sr_class.h"
giovannivisentini 0:674813bd5ec9 5 //#include "lib_NDEF/lib_TagType4.h"
giovannivisentini 0:674813bd5ec9 6
giovannivisentini 0:674813bd5ec9 7 #include "Type4NfcTagSTM24SR.h"
giovannivisentini 0:674813bd5ec9 8
giovannivisentini 0:674813bd5ec9 9 #include "NDefLib/RecordType/RecordAAR.h"
giovannivisentini 0:674813bd5ec9 10 #include "NDefLib/RecordType/RecordSMS.h"
giovannivisentini 0:674813bd5ec9 11 #include "NDefLib/RecordType/RecordGeo.h"
giovannivisentini 1:6d202b62ed68 12 #include "NDefLib/RecordType/RecordURI.h"
giovannivisentini 0:674813bd5ec9 13 #include "NDefLib/RecordType/RecordMail.h"
giovannivisentini 0:674813bd5ec9 14 #include "NDefLib/RecordType/RecordText.h"
giovannivisentini 0:674813bd5ec9 15 #include "NDefLib/RecordType/RecordMimeType.h"
giovannivisentini 1:6d202b62ed68 16 #include "NDefLib/RecordType/RecordVCard.h"
giovannivisentini 0:674813bd5ec9 17
giovannivisentini 0:674813bd5ec9 18 #include "X_NUCLEO_NFC01A1.h"
giovannivisentini 0:674813bd5ec9 19
giovannivisentini 0:674813bd5ec9 20 Serial pc(SERIAL_TX, SERIAL_RX);
giovannivisentini 0:674813bd5ec9 21
giovannivisentini 0:674813bd5ec9 22 DigitalOut myled(LED1);
giovannivisentini 0:674813bd5ec9 23
giovannivisentini 0:674813bd5ec9 24 void shiftLed(DigitalOut &led1,DigitalOut &led2,DigitalOut &led3){
giovannivisentini 0:674813bd5ec9 25 const uint8_t prevLed1=led1;
giovannivisentini 0:674813bd5ec9 26 const uint8_t prevLed2=led2;
giovannivisentini 0:674813bd5ec9 27 const uint8_t prevLed3=led3;
giovannivisentini 0:674813bd5ec9 28 led1=prevLed3;
giovannivisentini 0:674813bd5ec9 29 led2=prevLed1;
giovannivisentini 0:674813bd5ec9 30 led3=prevLed2;
giovannivisentini 0:674813bd5ec9 31 }
giovannivisentini 0:674813bd5ec9 32
giovannivisentini 0:674813bd5ec9 33
giovannivisentini 0:674813bd5ec9 34 static const PinName M24SR_SDA=D14;
giovannivisentini 0:674813bd5ec9 35 static const PinName M24SR_SDL=D15;
giovannivisentini 0:674813bd5ec9 36
giovannivisentini 1:6d202b62ed68 37 static const uint32_t MAX_WRITE_TRY=1;
giovannivisentini 0:674813bd5ec9 38
giovannivisentini 0:674813bd5ec9 39 I2C i2cChannel(M24SR_SDA,M24SR_SDL);
giovannivisentini 0:674813bd5ec9 40 M24SR *m24srDrv;
giovannivisentini 0:674813bd5ec9 41
giovannivisentini 0:674813bd5ec9 42 void setNFCTag(){
giovannivisentini 0:674813bd5ec9 43
giovannivisentini 0:674813bd5ec9 44 Type4NfcTagSTM24SR tag(*m24srDrv);
giovannivisentini 0:674813bd5ec9 45 bool writeStatus,closeStatus;
giovannivisentini 0:674813bd5ec9 46 if(tag.openSession()){
giovannivisentini 0:674813bd5ec9 47 NDefLib::Message msg;
giovannivisentini 0:674813bd5ec9 48
giovannivisentini 0:674813bd5ec9 49 NDefLib::RecordAAR rAAR("com.st.BlueMS");
giovannivisentini 0:674813bd5ec9 50 msg.addRecord(&rAAR);
giovannivisentini 0:674813bd5ec9 51
giovannivisentini 0:674813bd5ec9 52 NDefLib::RecordSMS rSMS("123456789","st.com.BlueMS");
giovannivisentini 0:674813bd5ec9 53 msg.addRecord(&rSMS);
giovannivisentini 0:674813bd5ec9 54
giovannivisentini 0:674813bd5ec9 55 NDefLib::RecordGeo rGeo("123.123","456.789");
giovannivisentini 0:674813bd5ec9 56 msg.addRecord(&rGeo);
giovannivisentini 0:674813bd5ec9 57
giovannivisentini 1:6d202b62ed68 58 NDefLib::RecordURI rUri(NDefLib::RecordURI::HTTP_WWW,"http://www.st.com");
giovannivisentini 0:674813bd5ec9 59 msg.addRecord(&rUri);
giovannivisentini 0:674813bd5ec9 60
giovannivisentini 0:674813bd5ec9 61 NDefLib::RecordMail rMail("mail@st.com","ciao","da nfc tag");
giovannivisentini 0:674813bd5ec9 62 msg.addRecord(&rMail);
giovannivisentini 0:674813bd5ec9 63
giovannivisentini 1:6d202b62ed68 64 NDefLib::RecordMimeType rText1("text/plain","ciao");
giovannivisentini 0:674813bd5ec9 65 msg.addRecord(&rText1);
giovannivisentini 0:674813bd5ec9 66
giovannivisentini 0:674813bd5ec9 67 NDefLib::RecordText rText3(NDefLib::RecordText::UTF8,"it","ciao");
giovannivisentini 0:674813bd5ec9 68 msg.addRecord(&rText3);
giovannivisentini 0:674813bd5ec9 69
giovannivisentini 1:6d202b62ed68 70
giovannivisentini 1:6d202b62ed68 71 NDefLib::RecordVCard::VCardInfo_t cardInfo;
giovannivisentini 1:6d202b62ed68 72 cardInfo[NDefLib::RecordVCard::FORMATTED_NAME]="prova2 prova1";
giovannivisentini 1:6d202b62ed68 73 cardInfo[NDefLib::RecordVCard::ADDRESS_HOME]=";;1 Main St.;Springfield;IL;12345;USA";
giovannivisentini 1:6d202b62ed68 74 cardInfo[NDefLib::RecordVCard::ADDRESS_WORK]=";;2 Main St.;Springfield;IL;12345;USA";
giovannivisentini 1:6d202b62ed68 75 cardInfo[NDefLib::RecordVCard::EMAIL_WORK]="workmail@st.com";
giovannivisentini 1:6d202b62ed68 76 cardInfo[NDefLib::RecordVCard::EMAIL_HOME]="homemail@st.com";
giovannivisentini 1:6d202b62ed68 77 cardInfo[NDefLib::RecordVCard::GEO]="39.95;-75.1667";
giovannivisentini 1:6d202b62ed68 78 cardInfo[NDefLib::RecordVCard::IMPP]="aim:johndoe@aol.com";
giovannivisentini 1:6d202b62ed68 79 cardInfo[NDefLib::RecordVCard::NAME]="prova4;prova5";
giovannivisentini 1:6d202b62ed68 80 cardInfo[NDefLib::RecordVCard::NICKNAME]="test";
giovannivisentini 1:6d202b62ed68 81 cardInfo[NDefLib::RecordVCard::NOTE]="A good test";
giovannivisentini 1:6d202b62ed68 82 cardInfo[NDefLib::RecordVCard::ORGANIZATION]="STM";
giovannivisentini 1:6d202b62ed68 83 cardInfo[NDefLib::RecordVCard::TEL_HOME]="123";
giovannivisentini 1:6d202b62ed68 84 cardInfo[NDefLib::RecordVCard::TEL_MOBILE]="456";
giovannivisentini 1:6d202b62ed68 85 cardInfo[NDefLib::RecordVCard::TEL_WORK]="789";
giovannivisentini 1:6d202b62ed68 86 cardInfo[NDefLib::RecordVCard::TITLE]="King";
giovannivisentini 1:6d202b62ed68 87 cardInfo[NDefLib::RecordVCard::URL]="www.st.com";
giovannivisentini 1:6d202b62ed68 88 cardInfo[NDefLib::RecordVCard::PHOTO_URI]="http://www.st.com/st-web-ui/static/active/en/fragment/multimedia/image/picture/customer_focus.jpg";
giovannivisentini 1:6d202b62ed68 89 NDefLib::RecordVCard rVCard(cardInfo);
giovannivisentini 1:6d202b62ed68 90 msg.addRecord(&rVCard);
giovannivisentini 1:6d202b62ed68 91
giovannivisentini 0:674813bd5ec9 92 uint32_t writeTry=0;
giovannivisentini 0:674813bd5ec9 93 do{
giovannivisentini 0:674813bd5ec9 94 writeStatus = tag.write(msg);
giovannivisentini 0:674813bd5ec9 95 writeTry++;
giovannivisentini 0:674813bd5ec9 96 }while(!writeStatus && writeTry<MAX_WRITE_TRY);
giovannivisentini 0:674813bd5ec9 97
giovannivisentini 0:674813bd5ec9 98 closeStatus = tag.closeSession();
giovannivisentini 0:674813bd5ec9 99
giovannivisentini 0:674813bd5ec9 100 }else
giovannivisentini 0:674813bd5ec9 101 pc.printf("Error open Session\n\r");
giovannivisentini 0:674813bd5ec9 102
giovannivisentini 0:674813bd5ec9 103 if(writeStatus)
giovannivisentini 0:674813bd5ec9 104 pc.printf("writeOk\n\r");
giovannivisentini 0:674813bd5ec9 105 else
giovannivisentini 0:674813bd5ec9 106 pc.printf("writeFail\n\r");
giovannivisentini 0:674813bd5ec9 107
giovannivisentini 0:674813bd5ec9 108 if(closeStatus)
giovannivisentini 0:674813bd5ec9 109 pc.printf("closeOk\n\r");
giovannivisentini 0:674813bd5ec9 110 else
giovannivisentini 0:674813bd5ec9 111 pc.printf("CloseFail\n\r");
giovannivisentini 0:674813bd5ec9 112
giovannivisentini 0:674813bd5ec9 113 /*
giovannivisentini 0:674813bd5ec9 114 sURI_Info URI;
giovannivisentini 0:674813bd5ec9 115 sAARInfo aar;
giovannivisentini 0:674813bd5ec9 116 sSMSInfo sms;
giovannivisentini 0:674813bd5ec9 117 std::strcpy(sms.PhoneNumber,"123456789\0");
giovannivisentini 0:674813bd5ec9 118 std::strcpy(sms.Message,"st.com.BlueMS\0");
giovannivisentini 0:674813bd5ec9 119 std::strcpy(sms.Information,"\0");
giovannivisentini 0:674813bd5ec9 120
giovannivisentini 0:674813bd5ec9 121 std::strcpy(aar.PakageName,"st.com.BlueMS");
giovannivisentini 0:674813bd5ec9 122
giovannivisentini 0:674813bd5ec9 123 // Prepare URI NDEF message content
giovannivisentini 0:674813bd5ec9 124 std::strcpy(URI.protocol,URI_ID_0x01_STRING);
giovannivisentini 0:674813bd5ec9 125 std::strcpy(URI.URI_Message,"st3.com");
giovannivisentini 0:674813bd5ec9 126 std::strcpy(URI.Information,"\0");
giovannivisentini 0:674813bd5ec9 127
giovannivisentini 0:674813bd5ec9 128
giovannivisentini 0:674813bd5ec9 129 while (TT4_Init() != NFC_OK);
giovannivisentini 0:674813bd5ec9 130 // Prepare URI NDEF message content
giovannivisentini 0:674813bd5ec9 131 std::strcpy(URI.protocol,URI_ID_0x01_STRING);
giovannivisentini 0:674813bd5ec9 132 std::strcpy(URI.URI_Message,"st2.com");
giovannivisentini 0:674813bd5ec9 133 std::strcpy(URI.Information,"\0");
giovannivisentini 0:674813bd5ec9 134 //while (TT4_WriteURI(&URI) != NFC_OK);
giovannivisentini 0:674813bd5ec9 135 while (TT4_WriteSMS(&sms) != NFC_OK);
giovannivisentini 0:674813bd5ec9 136 //while (TT4_Write(&sms) != NFC_OK);
giovannivisentini 0:674813bd5ec9 137 */
giovannivisentini 0:674813bd5ec9 138 }
giovannivisentini 0:674813bd5ec9 139
giovannivisentini 1:6d202b62ed68 140 void printRecord(NDefLib::Record *r){
giovannivisentini 1:6d202b62ed68 141 using namespace NDefLib;
giovannivisentini 1:6d202b62ed68 142 switch(r->getType()){
giovannivisentini 1:6d202b62ed68 143 case Record::TYPE_TEXT: {
giovannivisentini 1:6d202b62ed68 144 RecordText *temp = (RecordText*)r;
giovannivisentini 1:6d202b62ed68 145 pc.printf("Read Text: %s\r\n",temp->getText().c_str());
giovannivisentini 1:6d202b62ed68 146 break; }
giovannivisentini 1:6d202b62ed68 147 case Record::TYPE_AAR:{
giovannivisentini 1:6d202b62ed68 148 RecordAAR *temp = (RecordAAR*)r;
giovannivisentini 1:6d202b62ed68 149 pc.printf("Read ARR: %s\r\n",temp->getPackage().c_str());
giovannivisentini 1:6d202b62ed68 150 break; }
giovannivisentini 1:6d202b62ed68 151 case Record::TYPE_MIME:{
giovannivisentini 1:6d202b62ed68 152 RecordMimeType *temp = (RecordMimeType*)r;
giovannivisentini 1:6d202b62ed68 153 pc.printf("Read mimeType: %s\r\n",temp->getMimeType().c_str());
giovannivisentini 1:6d202b62ed68 154 pc.printf("Read mimeData: %s\r\n",
giovannivisentini 1:6d202b62ed68 155 std::string((const char*)temp->getMimeData(),
giovannivisentini 1:6d202b62ed68 156 temp->getMimeDataLenght()).c_str());
giovannivisentini 1:6d202b62ed68 157 break;}
giovannivisentini 1:6d202b62ed68 158 case Record::TYPE_URI:{
giovannivisentini 1:6d202b62ed68 159 RecordURI *temp = (RecordURI*)r;
giovannivisentini 1:6d202b62ed68 160 pc.printf("Read uriId: %d\r\n",temp->getUriId());
giovannivisentini 1:6d202b62ed68 161 pc.printf("Read uriType: %s\r\n",temp->getUriType().c_str());
giovannivisentini 1:6d202b62ed68 162 pc.printf("Read uriContent: %s\r\n",temp->getContent().c_str());
giovannivisentini 1:6d202b62ed68 163 break;}
giovannivisentini 1:6d202b62ed68 164 case Record::TYPE_URI_MAIL:{
giovannivisentini 1:6d202b62ed68 165 RecordMail *temp = (RecordMail*)r;
giovannivisentini 1:6d202b62ed68 166 pc.printf("Read Dest: %s\r\n",temp->getDest().c_str());
giovannivisentini 1:6d202b62ed68 167 pc.printf("Read Subject: %s\r\n",temp->getSubject().c_str());
giovannivisentini 1:6d202b62ed68 168 pc.printf("Read Body: %s\r\n",temp->getBody().c_str());
giovannivisentini 1:6d202b62ed68 169 break;}
giovannivisentini 1:6d202b62ed68 170 case Record::TYPE_SMS:{
giovannivisentini 1:6d202b62ed68 171 RecordSMS *temp = (RecordSMS*)r;
giovannivisentini 1:6d202b62ed68 172 pc.printf("Read number: %s\r\n",temp->getNumber().c_str());
giovannivisentini 1:6d202b62ed68 173 pc.printf("Read message: %s\r\n",temp->getMessagge().c_str());
giovannivisentini 1:6d202b62ed68 174 break;}
giovannivisentini 1:6d202b62ed68 175 case Record::TYPE_GEOLOCATION:{
giovannivisentini 1:6d202b62ed68 176 RecordGeo *temp = (RecordGeo*)r;
giovannivisentini 1:6d202b62ed68 177 pc.printf("Read lat: %s\r\n",temp->getLatitude().c_str());
giovannivisentini 1:6d202b62ed68 178 pc.printf("Read long: %s\r\n",temp->getLongitude().c_str());
giovannivisentini 1:6d202b62ed68 179 break;}
giovannivisentini 1:6d202b62ed68 180 case Record::TYPE_MIME_VCARD:{
giovannivisentini 1:6d202b62ed68 181 RecordVCard *temp = (RecordVCard*)r;
giovannivisentini 1:6d202b62ed68 182 pc.printf("Read Name: %s\r\n",(*temp)[RecordVCard::NAME].c_str());
giovannivisentini 1:6d202b62ed68 183 pc.printf("Read Mail: %s\r\n",(*temp)[RecordVCard::EMAIL_WORK].c_str());
giovannivisentini 1:6d202b62ed68 184 pc.printf("Read org: %s\r\n",(*temp)[RecordVCard::ORGANIZATION].c_str());
giovannivisentini 1:6d202b62ed68 185 break;}
giovannivisentini 1:6d202b62ed68 186 case Record::TYPE_UNKNOWN:{
giovannivisentini 1:6d202b62ed68 187 pc.printf("Unknown record\r\n");
giovannivisentini 1:6d202b62ed68 188 break;}
giovannivisentini 1:6d202b62ed68 189 }//switch
giovannivisentini 1:6d202b62ed68 190 }
giovannivisentini 1:6d202b62ed68 191
giovannivisentini 1:6d202b62ed68 192 void readNfcTag(){
giovannivisentini 1:6d202b62ed68 193 using namespace NDefLib;
giovannivisentini 1:6d202b62ed68 194 Type4NfcTagSTM24SR tag(*m24srDrv);
giovannivisentini 1:6d202b62ed68 195 if(tag.openSession()){
giovannivisentini 1:6d202b62ed68 196 NDefLib::Message readMsg;
giovannivisentini 1:6d202b62ed68 197
giovannivisentini 1:6d202b62ed68 198 tag.read(&readMsg);
giovannivisentini 1:6d202b62ed68 199
giovannivisentini 1:6d202b62ed68 200 if(readMsg.getNRecords()==0){
giovannivisentini 1:6d202b62ed68 201 pc.printf("Error Read\r\n");
giovannivisentini 1:6d202b62ed68 202 }else{
giovannivisentini 1:6d202b62ed68 203 for(uint32_t i=0;i<readMsg.getNRecords();i++){
giovannivisentini 1:6d202b62ed68 204 Record *r = readMsg.getRecord(i);
giovannivisentini 1:6d202b62ed68 205 printRecord(r);
giovannivisentini 1:6d202b62ed68 206 delete r;
giovannivisentini 1:6d202b62ed68 207 }//for
giovannivisentini 1:6d202b62ed68 208 }//if-else
giovannivisentini 1:6d202b62ed68 209
giovannivisentini 1:6d202b62ed68 210 tag.closeSession();
giovannivisentini 1:6d202b62ed68 211 }else{
giovannivisentini 1:6d202b62ed68 212 pc.printf("Error open Session2\n\r");
giovannivisentini 1:6d202b62ed68 213 }
giovannivisentini 1:6d202b62ed68 214 }
giovannivisentini 1:6d202b62ed68 215
giovannivisentini 0:674813bd5ec9 216 int main() {
giovannivisentini 0:674813bd5ec9 217 i2cChannel.frequency(400000);
giovannivisentini 0:674813bd5ec9 218 X_NUCLEO_NFC01A1 *nfcNucleo = X_NUCLEO_NFC01A1::Instance(i2cChannel);
giovannivisentini 0:674813bd5ec9 219 m24srDrv=&nfcNucleo->getM24SR();
giovannivisentini 0:674813bd5ec9 220
giovannivisentini 1:6d202b62ed68 221 pc.printf("Hello World !\n\r");
giovannivisentini 0:674813bd5ec9 222 nfcNucleo->getLed1()=1;
giovannivisentini 0:674813bd5ec9 223 nfcNucleo->getLed2()=0;
giovannivisentini 0:674813bd5ec9 224 nfcNucleo->getLed3()=0;
giovannivisentini 0:674813bd5ec9 225
giovannivisentini 0:674813bd5ec9 226 setNFCTag();
giovannivisentini 1:6d202b62ed68 227 readNfcTag();
giovannivisentini 1:6d202b62ed68 228 //pc.printf("2!\n\r");
giovannivisentini 1:6d202b62ed68 229 //setNFCTag();
giovannivisentini 1:6d202b62ed68 230 //readNfcTag();
giovannivisentini 0:674813bd5ec9 231 while(1) {
giovannivisentini 0:674813bd5ec9 232 wait(1);
giovannivisentini 0:674813bd5ec9 233 myled = !myled;
giovannivisentini 0:674813bd5ec9 234 shiftLed(nfcNucleo->getLed1(),nfcNucleo->getLed2(),nfcNucleo->getLed3());
giovannivisentini 1:6d202b62ed68 235 }
giovannivisentini 1:6d202b62ed68 236
giovannivisentini 0:674813bd5ec9 237 }