M24SR NFC example. Simple application to asynchronously write and read an URL from a M24SR tag.

Dependencies:   M24SR NDefLib mbed

This simple application provides an example of usage of the M24SR NFC Tag component library.
It is derived from the HelloWorld_Async_NFC01A1 application and currently supports X-NUCLEO-NFC01A1 and ST-Discovery-L475E-IOT01A.

Committer:
giovannivisentini
Date:
Mon Aug 21 12:25:45 2017 +0000
Revision:
2:6751a7b70582
Parent:
1:2805113f2386
update NDefLib

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nikapov 0:651138e1c1af 1 #include "mbed.h"
nikapov 0:651138e1c1af 2 #include "M24SR.h"
nikapov 0:651138e1c1af 3 #include "ReadUriCallbacks.h"
nikapov 0:651138e1c1af 4 #include "WriteUriCallbacks.h"
nikapov 0:651138e1c1af 5
nikapov 0:651138e1c1af 6
nikapov 0:651138e1c1af 7 #ifdef TARGET_DISCO_L475VG_IOT01A
nikapov 0:651138e1c1af 8 // Pins definition for the DISCO_L475VG_IOT01A board
nikapov 0:651138e1c1af 9 #define NFC_I2C_SDA_PIN PB_11
nikapov 0:651138e1c1af 10 #define NFC_I2C_SCL_PIN PB_10
nikapov 0:651138e1c1af 11 #define NFC_GPO_PIN PE_4
nikapov 0:651138e1c1af 12 #define NFC_RF_DISABLE_PIN PE_2
nikapov 0:651138e1c1af 13
nikapov 0:651138e1c1af 14 #define LED1_PIN PA_5
nikapov 0:651138e1c1af 15 #define LED2_PIN PB_14
nikapov 0:651138e1c1af 16 #define LED3_PIN PC_9
nikapov 0:651138e1c1af 17
nikapov 0:651138e1c1af 18 #else // X-NUCLEO-NFC01A1
nikapov 0:651138e1c1af 19
nikapov 0:651138e1c1af 20 #define NFC_I2C_SDA_PIN D14
nikapov 0:651138e1c1af 21 #define NFC_I2C_SCL_PIN D15
nikapov 0:651138e1c1af 22 #define NFC_GPO_PIN D12
nikapov 0:651138e1c1af 23 #define NFC_RF_DISABLE_PIN D11
nikapov 0:651138e1c1af 24
nikapov 0:651138e1c1af 25 #define LED1_PIN D5
nikapov 0:651138e1c1af 26 #define LED2_PIN D4
nikapov 0:651138e1c1af 27 #define LED3_PIN D2
nikapov 0:651138e1c1af 28
nikapov 0:651138e1c1af 29 #endif // DISCO_L475VG_IOT01A
nikapov 0:651138e1c1af 30
nikapov 0:651138e1c1af 31 #define M24SR_ADDR 0xAC
nikapov 0:651138e1c1af 32
nikapov 1:2805113f2386 33 /* Status PIN */
nikapov 1:2805113f2386 34 DigitalOut sessionOpenLed(LED1_PIN); // tag session is open
nikapov 1:2805113f2386 35 DigitalOut ongoingOperationLed(LED2_PIN); // ongoing read/write operation
nikapov 1:2805113f2386 36 DigitalOut sessionClosedLed(LED3_PIN); // tag session is closed
nikapov 0:651138e1c1af 37
nikapov 0:651138e1c1af 38
nikapov 0:651138e1c1af 39 /** Variable set to true when we receive an interrupt from the NFC component */
nikapov 0:651138e1c1af 40 static volatile bool nfcInterruptFlag = false;
nikapov 0:651138e1c1af 41
nikapov 0:651138e1c1af 42 /** Variable set to true when the user press the board user button */
nikapov 0:651138e1c1af 43 static volatile bool buttonPress = false;
nikapov 0:651138e1c1af 44
nikapov 0:651138e1c1af 45 /** NFC ISR called when the NFC component has a message ready */
nikapov 0:651138e1c1af 46 static void nfc_interrupt_callback()
nikapov 0:651138e1c1af 47 {
nikapov 0:651138e1c1af 48 nfcInterruptFlag = true;
nikapov 0:651138e1c1af 49 }
nikapov 0:651138e1c1af 50
nikapov 0:651138e1c1af 51 static void set_button_press()
nikapov 0:651138e1c1af 52 {
nikapov 0:651138e1c1af 53 buttonPress = true;
nikapov 0:651138e1c1af 54 }
nikapov 0:651138e1c1af 55
nikapov 0:651138e1c1af 56 int main()
nikapov 0:651138e1c1af 57 {
nikapov 0:651138e1c1af 58 printf("\n\rNFC HelloWord Async example started\n\r");
nikapov 0:651138e1c1af 59
nikapov 0:651138e1c1af 60 InterruptIn userButton(USER_BUTTON);
nikapov 0:651138e1c1af 61 userButton.fall(set_button_press);
nikapov 0:651138e1c1af 62
nikapov 0:651138e1c1af 63 // Create the NFC component
nikapov 0:651138e1c1af 64 I2C i2cChannel(NFC_I2C_SDA_PIN, NFC_I2C_SCL_PIN);
nikapov 0:651138e1c1af 65
nikapov 0:651138e1c1af 66 M24SR nfcTag(M24SR_ADDR,i2cChannel, &nfc_interrupt_callback, NFC_GPO_PIN, NFC_RF_DISABLE_PIN);
nikapov 0:651138e1c1af 67
nikapov 0:651138e1c1af 68 // init needed to enable the component
nikapov 0:651138e1c1af 69 nfcTag.init(NULL);
nikapov 0:651138e1c1af 70 // No call back needed since default behavior is sync
nikapov 0:651138e1c1af 71 nfcTag.get_session();
nikapov 0:651138e1c1af 72 nfcTag.manage_I2C_GPO(M24SR::I2C_ANSWER_READY); // Switch to async mode
nikapov 0:651138e1c1af 73
nikapov 0:651138e1c1af 74 NDefLib::NDefNfcTag &tag = nfcTag.get_NDef_tag();
nikapov 0:651138e1c1af 75
nikapov 0:651138e1c1af 76 printf("Init done\n\r");
nikapov 0:651138e1c1af 77
nikapov 0:651138e1c1af 78 // Create the callback to use to write a tag
nikapov 1:2805113f2386 79 WriteUriCallbacks NDefWriteCallback(sessionOpenLed,ongoingOperationLed,sessionClosedLed);
nikapov 1:2805113f2386 80 ReadUriCallbacks NDefReadCallback(sessionOpenLed,ongoingOperationLed,sessionClosedLed);
nikapov 0:651138e1c1af 81 tag.set_callback(&NDefWriteCallback); // Set the callback
nikapov 0:651138e1c1af 82 tag.open_session(); // Start the callback chain
nikapov 0:651138e1c1af 83
nikapov 0:651138e1c1af 84 printf("Start main loop\n\r");
nikapov 0:651138e1c1af 85
nikapov 0:651138e1c1af 86 while(true) {
nikapov 0:651138e1c1af 87
nikapov 0:651138e1c1af 88 if (nfcInterruptFlag) {
nikapov 0:651138e1c1af 89 nfcInterruptFlag = false;
nikapov 0:651138e1c1af 90 // Manage an async event from the NFC component
nikapov 0:651138e1c1af 91 nfcTag.manage_event();
nikapov 0:651138e1c1af 92 }
nikapov 0:651138e1c1af 93
nikapov 0:651138e1c1af 94 if (buttonPress) {
nikapov 0:651138e1c1af 95 buttonPress = false;
nikapov 0:651138e1c1af 96 printf("\n\rPressed\n\r");
nikapov 0:651138e1c1af 97 tag.set_callback(&NDefReadCallback);
nikapov 0:651138e1c1af 98 tag.open_session();
nikapov 0:651138e1c1af 99 }
nikapov 0:651138e1c1af 100
nikapov 0:651138e1c1af 101 __WFE(); // Wait For Event
nikapov 0:651138e1c1af 102 }
nikapov 0:651138e1c1af 103 }