STMicroelectronics' M24SR NFC Dynamic Tag Library.
Dependencies: ST_INTERFACES
Fork of M24SR by
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.
m24sr_def.h@0:11161008d77a, 2017-07-31 (annotated)
- Committer:
- nikapov
- Date:
- Mon Jul 31 12:26:02 2017 +0000
- Revision:
- 0:11161008d77a
First revision.
Who changed what in which revision?
User | Revision | Line number | New 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>© 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****/ |