STMicroelectronics' M24SR NFC Dynamic Tag Library.

Dependencies:   ST_INTERFACES

Dependents:   X_NUCLEO_NFC01A1

Fork of M24SR by ST Expansion SW Team

M24SR series Dynamic NFC Tags

The M24SR series provides an NFC forum tag type 4 RF interface and supports the NFC data exchange format (NDEF). This enables NFC use cases such as simple Bluetooth pairing and other connection handovers, automatic links to URLs, storage of Vcard and other types of information. It can be used in a wide variety of applications, including consumer electronics, computer peripherals, home appliances, industrial automation and healthcare products.

  • NFC forum tag type 4 based on ISO 14443 RF interface
  • 1 MHz I²C serial interface operating from 2.7 to 5.5 V
  • EEPROM memory density from 2 Kbits to 64 Kbits with built-in NDEF message support
  • RF disable pin allowing the application to control RF access from NFC phones
  • 128-bit password protection
  • General-purpose output pin allowing flexibility for the applications (wake up on several types of events)
  • Simple antenna design, backward compatible with M24LR series

For further information and ordering please refer to the ST Page.

HelloWorld application

Import programHelloWorld_Async_M24SR

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

Committer:
nikapov
Date:
Mon Jul 31 12:26:02 2017 +0000
Revision:
0:11161008d77a
First revision.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nikapov 0:11161008d77a 1 /**
nikapov 0:11161008d77a 2 ******************************************************************************
nikapov 0:11161008d77a 3 * @file m24sr.h
nikapov 0:11161008d77a 4 * @author MMY Application Team
nikapov 0:11161008d77a 5 * @version V2.0.0
nikapov 0:11161008d77a 6 * @date 28 Apr 2017
nikapov 0:11161008d77a 7 * @brief This file provides a set of functions needed to manage M24SR
nikapov 0:11161008d77a 8 ******************************************************************************
nikapov 0:11161008d77a 9 * @attention
nikapov 0:11161008d77a 10 *
nikapov 0:11161008d77a 11 * <h2><center>&copy; COPYRIGHT 2014 STMicroelectronics</center></h2>
nikapov 0:11161008d77a 12 *
nikapov 0:11161008d77a 13 * Licensed under MMY-ST Liberty SW License Agreement V2, (the "License");
nikapov 0:11161008d77a 14 * You may not use this file except in compliance with the License.
nikapov 0:11161008d77a 15 * You may obtain a copy of the License at:
nikapov 0:11161008d77a 16 *
nikapov 0:11161008d77a 17 * http://www.st.com/software_license_agreement_liberty_v2
nikapov 0:11161008d77a 18 *
nikapov 0:11161008d77a 19 * Unless required by applicable law or agreed to in writing, software
nikapov 0:11161008d77a 20 * distributed under the License is distributed on an "AS IS" BASIS,
nikapov 0:11161008d77a 21 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
nikapov 0:11161008d77a 22 * See the License for the specific language governing permissions and
nikapov 0:11161008d77a 23 * limitations under the License.
nikapov 0:11161008d77a 24 *
nikapov 0:11161008d77a 25 ******************************************************************************
nikapov 0:11161008d77a 26 */
nikapov 0:11161008d77a 27
nikapov 0:11161008d77a 28 /* Define to prevent recursive inclusion -------------------------------------*/
nikapov 0:11161008d77a 29 #ifndef __DRV_M24SR_H
nikapov 0:11161008d77a 30 #define __DRV_M24SR_H
nikapov 0:11161008d77a 31
nikapov 0:11161008d77a 32 /* Includes ------------------------------------------------------------------*/
nikapov 0:11161008d77a 33 #include "Nfc.h"
nikapov 0:11161008d77a 34
nikapov 0:11161008d77a 35 #ifdef __cplusplus
nikapov 0:11161008d77a 36 extern "C" {
nikapov 0:11161008d77a 37 #endif
nikapov 0:11161008d77a 38
nikapov 0:11161008d77a 39 /** @addtogroup M24SR_Driver
nikapov 0:11161008d77a 40 * @{
nikapov 0:11161008d77a 41 */
nikapov 0:11161008d77a 42
nikapov 0:11161008d77a 43 /** @addtogroup drv_M24SR
nikapov 0:11161008d77a 44 * @{
nikapov 0:11161008d77a 45 */
nikapov 0:11161008d77a 46
nikapov 0:11161008d77a 47 /* Exported types ------------------------------------------------------------*/
nikapov 0:11161008d77a 48
nikapov 0:11161008d77a 49 /**
nikapov 0:11161008d77a 50 * @brief APDU-Header command structure
nikapov 0:11161008d77a 51 */
nikapov 0:11161008d77a 52 typedef struct {
nikapov 0:11161008d77a 53 uint8_t CLA; /* Command class */
nikapov 0:11161008d77a 54 uint8_t INS; /* Operation code */
nikapov 0:11161008d77a 55 uint8_t P1; /* Selection Mode */
nikapov 0:11161008d77a 56 uint8_t P2; /* Selection Option */
nikapov 0:11161008d77a 57 } C_APDU_Header;
nikapov 0:11161008d77a 58
nikapov 0:11161008d77a 59 /**
nikapov 0:11161008d77a 60 * @brief APDU-Body command structure
nikapov 0:11161008d77a 61 */
nikapov 0:11161008d77a 62 typedef struct {
nikapov 0:11161008d77a 63 uint8_t LC; /* Data field length */
nikapov 0:11161008d77a 64 const uint8_t *pData; /* Command parameters */
nikapov 0:11161008d77a 65 uint8_t LE; /* Expected length of data to be returned */
nikapov 0:11161008d77a 66 } C_APDU_Body;
nikapov 0:11161008d77a 67
nikapov 0:11161008d77a 68 /**
nikapov 0:11161008d77a 69 * @brief APDU Command structure
nikapov 0:11161008d77a 70 */
nikapov 0:11161008d77a 71 typedef struct {
nikapov 0:11161008d77a 72 C_APDU_Header Header;
nikapov 0:11161008d77a 73 C_APDU_Body Body;
nikapov 0:11161008d77a 74 } C_APDU;
nikapov 0:11161008d77a 75
nikapov 0:11161008d77a 76 /**
nikapov 0:11161008d77a 77 * @brief SC response structure
nikapov 0:11161008d77a 78 */
nikapov 0:11161008d77a 79 typedef struct {
nikapov 0:11161008d77a 80 uint8_t *pData; /* Data returned from the card */ // pointer on the transceiver buffer = ReaderRecBuf[CR95HF_DATA_OFFSET ];
nikapov 0:11161008d77a 81 uint8_t SW1; /* Command Processing status */
nikapov 0:11161008d77a 82 uint8_t SW2; /* Command Processing qualification */
nikapov 0:11161008d77a 83 } R_APDU;
nikapov 0:11161008d77a 84
nikapov 0:11161008d77a 85 /**
nikapov 0:11161008d77a 86 * @brief GPO mode structure
nikapov 0:11161008d77a 87 */
nikapov 0:11161008d77a 88 typedef enum {
nikapov 0:11161008d77a 89 RF_GPO = 0, I2C_GPO = 1
nikapov 0:11161008d77a 90 } M24SR_GPO_MODE;
nikapov 0:11161008d77a 91
nikapov 0:11161008d77a 92 typedef enum {
nikapov 0:11161008d77a 93 M24SR_WAITINGTIME_POLLING,
nikapov 0:11161008d77a 94 M24SR_INTERRUPT_GPO
nikapov 0:11161008d77a 95 } M24SR_WAITINGTIME_MGMT;
nikapov 0:11161008d77a 96
nikapov 0:11161008d77a 97 /* Exported constants --------------------------------------------------------*/
nikapov 0:11161008d77a 98
nikapov 0:11161008d77a 99 /** @defgroup lib_M24SR_Exported_Constants
nikapov 0:11161008d77a 100 * @{
nikapov 0:11161008d77a 101 */
nikapov 0:11161008d77a 102
nikapov 0:11161008d77a 103 /* ---------------------- status code ----------------------------------------*/
nikapov 0:11161008d77a 104 #define UB_STATUS_OFFSET 4
nikapov 0:11161008d77a 105 #define LB_STATUS_OFFSET 3
nikapov 0:11161008d77a 106 #define I_AM_M24SR ((uint8_t)0xB4)
nikapov 0:11161008d77a 107 #define I_AM_M24SR_AUTOMOTIVE ((uint8_t)0xBC)
nikapov 0:11161008d77a 108
nikapov 0:11161008d77a 109 #define M24SR_NBBYTE_INVALID 0xFFFE
nikapov 0:11161008d77a 110
nikapov 0:11161008d77a 111 /** @defgroup drv_M24SR_File_Identifier
nikapov 0:11161008d77a 112 * @{
nikapov 0:11161008d77a 113 */
nikapov 0:11161008d77a 114 #define SYSTEM_FILE_ID_BYTES {0xE1,0x01}
nikapov 0:11161008d77a 115 #define CC_FILE_ID_BYTES {0xE1,0x03}
nikapov 0:11161008d77a 116 #define NDEF_FILE_ID 0x0001
nikapov 0:11161008d77a 117 /**
nikapov 0:11161008d77a 118 * @}
nikapov 0:11161008d77a 119 */
nikapov 0:11161008d77a 120
nikapov 0:11161008d77a 121 /** @defgroup drv_M24SR_Password_Management
nikapov 0:11161008d77a 122 * @{
nikapov 0:11161008d77a 123 */
nikapov 0:11161008d77a 124 #define READ_PWD 0x0001
nikapov 0:11161008d77a 125 #define WRITE_PWD 0x0002
nikapov 0:11161008d77a 126 #define I2C_PWD 0x0003
nikapov 0:11161008d77a 127
nikapov 0:11161008d77a 128 /*-------------------------- Verify command answer ----------------------------*/
nikapov 0:11161008d77a 129 /**
nikapov 0:11161008d77a 130 * @}
nikapov 0:11161008d77a 131 */
nikapov 0:11161008d77a 132
nikapov 0:11161008d77a 133 /** @defgroup drv_M24SR_Command_Management
nikapov 0:11161008d77a 134 * @{
nikapov 0:11161008d77a 135 */
nikapov 0:11161008d77a 136
nikapov 0:11161008d77a 137 /* special M24SR command ----------------------------------------------------------------------*/
nikapov 0:11161008d77a 138 #define M24SR_OPENSESSION_COMMAND {0x26}
nikapov 0:11161008d77a 139 #define M24SR_KILLSESSION_COMMAND {0x52}
nikapov 0:11161008d77a 140
nikapov 0:11161008d77a 141 /* APDU Command: class list -------------------------------------------*/
nikapov 0:11161008d77a 142 #define C_APDU_CLA_DEFAULT 0x00
nikapov 0:11161008d77a 143 #define C_APDU_CLA_ST 0xA2
nikapov 0:11161008d77a 144
nikapov 0:11161008d77a 145 /*------------------------ Data Area Management Commands ---------------------*/
nikapov 0:11161008d77a 146 #define C_APDU_SELECT_FILE 0xA4
nikapov 0:11161008d77a 147 #define C_APDU_GET_RESPONCE 0xC0
nikapov 0:11161008d77a 148 #define C_APDU_STATUS 0xF2
nikapov 0:11161008d77a 149 #define C_APDU_UPDATE_BINARY 0xD6
nikapov 0:11161008d77a 150 #define C_APDU_READ_BINARY 0xB0
nikapov 0:11161008d77a 151 #define C_APDU_WRITE_BINARY 0xD0
nikapov 0:11161008d77a 152 #define C_APDU_UPDATE_RECORD 0xDC
nikapov 0:11161008d77a 153 #define C_APDU_READ_RECORD 0xB2
nikapov 0:11161008d77a 154
nikapov 0:11161008d77a 155 /*-------------------------- Safety Management Commands ----------------------*/
nikapov 0:11161008d77a 156 #define C_APDU_VERIFY 0x20
nikapov 0:11161008d77a 157 #define C_APDU_CHANGE 0x24
nikapov 0:11161008d77a 158 #define C_APDU_DISABLE 0x26
nikapov 0:11161008d77a 159 #define C_APDU_ENABLE 0x28
nikapov 0:11161008d77a 160
nikapov 0:11161008d77a 161 /*-------------------------- Gpio Management Commands ------------------------*/
nikapov 0:11161008d77a 162 #define C_APDU_INTERRUPT 0xD6
nikapov 0:11161008d77a 163
nikapov 0:11161008d77a 164 /* Length ----------------------------------------------------------------------------------*/
nikapov 0:11161008d77a 165 #define M24SR_STATUS_NBBYTE 2
nikapov 0:11161008d77a 166 #define M24SR_CRC_NBBYTE 2
nikapov 0:11161008d77a 167 #define M24SR_STATUSRESPONSE_NBBYTE 5
nikapov 0:11161008d77a 168 #define M24SR_DESELECTREQUEST_COMMAND {0xC2,0xE0,0xB4}
nikapov 0:11161008d77a 169 #define M24SR_DESELECTRESPONSE_NBBYTE 3
nikapov 0:11161008d77a 170 #define M24SR_WATINGTIMEEXTRESPONSE_NBBYTE 4
nikapov 0:11161008d77a 171 #define M24SR_PASSWORD_NBBYTE 0x10
nikapov 0:11161008d77a 172 #define M24SR_SELECTAPPLICATION_COMMAND {0xD2,0x76,0x00,0x00,0x85,0x01,0x01}
nikapov 0:11161008d77a 173 /* Command structure ------------------------------------------------------------------------*/
nikapov 0:11161008d77a 174 #define M24SR_CMDSTRUCT_SELECTAPPLICATION 0x01FF
nikapov 0:11161008d77a 175 #define M24SR_CMDSTRUCT_SELECTCCFILE 0x017F
nikapov 0:11161008d77a 176 #define M24SR_CMDSTRUCT_SELECTNDEFFILE 0x017F
nikapov 0:11161008d77a 177 #define M24SR_CMDSTRUCT_READBINARY 0x019F
nikapov 0:11161008d77a 178 #define M24SR_CMDSTRUCT_UPDATEBINARY 0x017F
nikapov 0:11161008d77a 179 #define M24SR_CMDSTRUCT_VERIFYBINARYWOPWD 0x013F
nikapov 0:11161008d77a 180 #define M24SR_CMDSTRUCT_VERIFYBINARYWITHPWD 0x017F
nikapov 0:11161008d77a 181 #define M24SR_CMDSTRUCT_CHANGEREFDATA 0x017F
nikapov 0:11161008d77a 182 #define M24SR_CMDSTRUCT_ENABLEVERIFREQ 0x011F
nikapov 0:11161008d77a 183 #define M24SR_CMDSTRUCT_DISABLEVERIFREQ 0x011F
nikapov 0:11161008d77a 184 #define M24SR_CMDSTRUCT_SENDINTERRUPT 0x013F
nikapov 0:11161008d77a 185 #define M24SR_CMDSTRUCT_GPOSTATE 0x017F
nikapov 0:11161008d77a 186
nikapov 0:11161008d77a 187 /* Command structure Mask -------------------------------------------------------------------*/
nikapov 0:11161008d77a 188 #define M24SR_PCB_NEEDED 0x0001 /* PCB byte present or not */
nikapov 0:11161008d77a 189 #define M24SR_CLA_NEEDED 0x0002 /* CLA byte present or not */
nikapov 0:11161008d77a 190 #define M24SR_INS_NEEDED 0x0004 /* Operation code present or not*/
nikapov 0:11161008d77a 191 #define M24SR_P1_NEEDED 0x0008 /* Selection Mode present or not*/
nikapov 0:11161008d77a 192 #define M24SR_P2_NEEDED 0x0010 /* Selection Option present or not*/
nikapov 0:11161008d77a 193 #define M24SR_LC_NEEDED 0x0020 /* Data field length byte present or not */
nikapov 0:11161008d77a 194 #define M24SR_DATA_NEEDED 0x0040 /* Data present or not */
nikapov 0:11161008d77a 195 #define M24SR_LE_NEEDED 0x0080 /* Expected length present or not */
nikapov 0:11161008d77a 196 #define M24SR_CRC_NEEDED 0x0100 /* 2 CRC bytes present or not */
nikapov 0:11161008d77a 197
nikapov 0:11161008d77a 198 #define M24SR_DID_NEEDED 0x08 /* DID byte present or not */
nikapov 0:11161008d77a 199
nikapov 0:11161008d77a 200 /**
nikapov 0:11161008d77a 201 * @}
nikapov 0:11161008d77a 202 */
nikapov 0:11161008d77a 203
nikapov 0:11161008d77a 204 /* Offset ----------------------------------------------------------------------------------*/
nikapov 0:11161008d77a 205 #define M24SR_OFFSET_PCB 0
nikapov 0:11161008d77a 206 #define M24SR_OFFSET_CLASS 1
nikapov 0:11161008d77a 207 #define M24SR_OFFSET_INS 2
nikapov 0:11161008d77a 208 #define M24SR_OFFSET_P1 3
nikapov 0:11161008d77a 209
nikapov 0:11161008d77a 210 /* mask ------------------------------------------------------------------------------------*/
nikapov 0:11161008d77a 211 #define M24SR_MASK_BLOCK 0xC0
nikapov 0:11161008d77a 212 #define M24SR_MASK_IBLOCK 0x00
nikapov 0:11161008d77a 213 #define M24SR_MASK_RBLOCK 0x80
nikapov 0:11161008d77a 214 #define M24SR_MASK_SBLOCK 0xC0
nikapov 0:11161008d77a 215
nikapov 0:11161008d77a 216 /**
nikapov 0:11161008d77a 217 * @}
nikapov 0:11161008d77a 218 */
nikapov 0:11161008d77a 219
nikapov 0:11161008d77a 220 /**
nikapov 0:11161008d77a 221 * @}
nikapov 0:11161008d77a 222 */
nikapov 0:11161008d77a 223
nikapov 0:11161008d77a 224 /* Exported macro ------------------------------------------------------------*/
nikapov 0:11161008d77a 225
nikapov 0:11161008d77a 226 /** @brief Get Most Significant Byte
nikapov 0:11161008d77a 227 * @param val: number where MSB must be extracted
nikapov 0:11161008d77a 228 * @retval MSB
nikapov 0:11161008d77a 229 */
nikapov 0:11161008d77a 230 #define GETMSB(val) ( (uint8_t) ((val & 0xFF00 )>>8) )
nikapov 0:11161008d77a 231
nikapov 0:11161008d77a 232 /** @brief Get Least Significant Byte
nikapov 0:11161008d77a 233 * @param val: number where LSB must be extracted
nikapov 0:11161008d77a 234 * @retval LSB
nikapov 0:11161008d77a 235 */
nikapov 0:11161008d77a 236 #define GETLSB(val) ( (uint8_t) (val & 0x00FF ))
nikapov 0:11161008d77a 237
nikapov 0:11161008d77a 238 /** @brief Used to toggle the block number by adding 0 or 1 to default block number value
nikapov 0:11161008d77a 239 * @param val: number to know if incrementation is needed
nikapov 0:11161008d77a 240 * @retval 0 or 1 if incrementation needed
nikapov 0:11161008d77a 241 */
nikapov 0:11161008d77a 242 #define TOGGLE(val) ((val != 0x00)? 0x00 : 0x01)
nikapov 0:11161008d77a 243
nikapov 0:11161008d77a 244 typedef struct {
nikapov 0:11161008d77a 245 C_APDU command;
nikapov 0:11161008d77a 246 //static R_APDU Response;
nikapov 0:11161008d77a 247 uint8_t dataBuffer[0xFF];
nikapov 0:11161008d77a 248 uint8_t uM24SRbuffer[0xFF];
nikapov 0:11161008d77a 249 uint8_t uDIDbyte;
nikapov 0:11161008d77a 250 } M24SR_DrvDataTypeDef;
nikapov 0:11161008d77a 251
nikapov 0:11161008d77a 252 typedef void* M24SR_InitTypeDef;
nikapov 0:11161008d77a 253
nikapov 0:11161008d77a 254 extern NFC_t M24SR_IO_Init(void *handle);
nikapov 0:11161008d77a 255 extern NFC_t M24SR_IO_IsAnswerReady(void *handle);
nikapov 0:11161008d77a 256 extern NFC_t M24SR_IO_SendI2Ccommand(void *handle, uint8_t NbByte,
nikapov 0:11161008d77a 257 uint8_t *pBuffer);
nikapov 0:11161008d77a 258 extern NFC_t M24SR_IO_ReceiveI2Cresponse(void *handle,
nikapov 0:11161008d77a 259 uint8_t NbByte, uint8_t *pBuffer);
nikapov 0:11161008d77a 260 extern NFC_t M24SR_IO_PollI2C(void *handle);
nikapov 0:11161008d77a 261 //extern void M24SR_IO_GPO_ReadPin(void *handle, GPIO_PinState *pPinState);
nikapov 0:11161008d77a 262 //extern void M24SR_IO_RFDIS_WritePin(void *handle, GPIO_PinState PinState);
nikapov 0:11161008d77a 263 extern void M24SR_IO_GPO_ReadPin(void *handle, uint8_t *pPinState);
nikapov 0:11161008d77a 264 extern void M24SR_IO_RFDIS_WritePin(void *handle, uint8_t PinState);
nikapov 0:11161008d77a 265 //extern void M24SR_IO_SetI2CSynchroMode(void *handle,
nikapov 0:11161008d77a 266 // M24SR_WAITINGTIME_MGMT mode);
nikapov 0:11161008d77a 267
nikapov 0:11161008d77a 268 /**
nikapov 0:11161008d77a 269 * @}
nikapov 0:11161008d77a 270 */
nikapov 0:11161008d77a 271
nikapov 0:11161008d77a 272 /**
nikapov 0:11161008d77a 273 * @}
nikapov 0:11161008d77a 274 */
nikapov 0:11161008d77a 275
nikapov 0:11161008d77a 276 #ifdef __cplusplus
nikapov 0:11161008d77a 277 }
nikapov 0:11161008d77a 278 #endif
nikapov 0:11161008d77a 279
nikapov 0:11161008d77a 280 #endif /* __DRV_M24SR_H */
nikapov 0:11161008d77a 281
nikapov 0:11161008d77a 282 /******************* (C) COPYRIGHT 2013 STMicroelectronics *****END OF FILE****/