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.
main.cpp@2:6751a7b70582, 2017-08-21 (annotated)
- 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?
User | Revision | Line number | New 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 | } |