Firmware library for the X-NUCLEO-NFC01A1 Dynamic NFC Tag board.

Dependencies:   M24SR

Dependents:   NFC M2M_2016_STM32 MyongjiElec_capstone1 IDW01M1_Cloud_IBM ... more

Fork of X_NUCLEO_NFC01A1 by ST Expansion SW Team

X-NUCLEO-NFC01A1 Dynamic NFC Tag Expansion Board Firmware Package

Introduction

This firmware package includes Components Device Drivers, Board Support Package and example applications for STMicroelectronics X-NUCLEO-NFC01A1 Dynamic NFC Tag Expansion Board based on M24SR.

Firmware Library

Class X_NUCLEO_NFC01A1 is intended to represent the Dynamic NFC Tag Expansion Board with the same name.
It provides an API to access to the M24SR component and to the three onboard LEDs.
It is intentionally implemented as a singleton because only one X_NUCLEO_NFC01A1 at a time might be deployed in a HW component stack.
The library also provides an implementation of the NDEF library API for M24SR, providing an simple way to read/write NDEF formatted messages from/to the M24SR dynamic NFC tag.

Example applications

1. Hello World
2. Asynchronous Hello World

Committer:
giovannivisentini
Date:
Tue Jan 19 08:08:00 2016 +0000
Revision:
16:b0d62f4b185a
Parent:
15:67e136b6921d
Child:
17:c750fff4a096
more roubust interrupt handle

Who changed what in which revision?

UserRevisionLine numberNew contents of line
giovannivisentini 0:969a2be49f41 1 /**
giovannivisentini 0:969a2be49f41 2 ******************************************************************************
giovannivisentini 0:969a2be49f41 3 * @file m24sr_class.cpp
giovannivisentini 6:96389fb79676 4 * @author ST Central Labs
giovannivisentini 9:9f2e2e68d695 5 * @version V1.0.0
giovannivisentini 6:96389fb79676 6 * @date 05 Nov 2015
giovannivisentini 0:969a2be49f41 7 * @brief This file provides a set of functions to interface with the M24SR
giovannivisentini 0:969a2be49f41 8 * device.
giovannivisentini 0:969a2be49f41 9 ******************************************************************************
giovannivisentini 0:969a2be49f41 10 * @attention
giovannivisentini 0:969a2be49f41 11 *
giovannivisentini 0:969a2be49f41 12 * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
giovannivisentini 0:969a2be49f41 13 *
giovannivisentini 0:969a2be49f41 14 * Redistribution and use in source and binary forms, with or without modification,
giovannivisentini 0:969a2be49f41 15 * are permitted provided that the following conditions are met:
giovannivisentini 0:969a2be49f41 16 * 1. Redistributions of source code must retain the above copyright notice,
giovannivisentini 0:969a2be49f41 17 * this list of conditions and the following disclaimer.
giovannivisentini 0:969a2be49f41 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
giovannivisentini 0:969a2be49f41 19 * this list of conditions and the following disclaimer in the documentation
giovannivisentini 0:969a2be49f41 20 * and/or other materials provided with the distribution.
giovannivisentini 0:969a2be49f41 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
giovannivisentini 0:969a2be49f41 22 * may be used to endorse or promote products derived from this software
giovannivisentini 0:969a2be49f41 23 * without specific prior written permission.
giovannivisentini 0:969a2be49f41 24 *
giovannivisentini 0:969a2be49f41 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
giovannivisentini 0:969a2be49f41 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
giovannivisentini 0:969a2be49f41 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
giovannivisentini 0:969a2be49f41 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
giovannivisentini 0:969a2be49f41 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
giovannivisentini 0:969a2be49f41 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
giovannivisentini 0:969a2be49f41 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
giovannivisentini 0:969a2be49f41 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
giovannivisentini 0:969a2be49f41 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
giovannivisentini 0:969a2be49f41 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
giovannivisentini 0:969a2be49f41 35 *
giovannivisentini 0:969a2be49f41 36 ******************************************************************************
giovannivisentini 0:969a2be49f41 37 */
giovannivisentini 0:969a2be49f41 38
giovannivisentini 0:969a2be49f41 39
giovannivisentini 0:969a2be49f41 40
giovannivisentini 0:969a2be49f41 41 /* Includes ------------------------------------------------------------------*/
giovannivisentini 0:969a2be49f41 42 #include "m24sr_class.h"
giovannivisentini 0:969a2be49f41 43 #include "m24sr.h"
giovannivisentini 16:b0d62f4b185a 44 #ifdef GPIO_PIN_RESET
giovannivisentini 16:b0d62f4b185a 45 #undef GPIO_PIN_RESET
giovannivisentini 16:b0d62f4b185a 46 #endif
giovannivisentini 16:b0d62f4b185a 47 #define GPIO_PIN_RESET (0)
giovannivisentini 0:969a2be49f41 48
giovannivisentini 16:b0d62f4b185a 49 #ifdef GPIO_PIN_SET
giovannivisentini 16:b0d62f4b185a 50 #undef GPIO_PIN_SET
giovannivisentini 16:b0d62f4b185a 51 #endif
giovannivisentini 13:840a9c7f90b9 52 #define GPIO_PIN_SET (1)
giovannivisentini 13:840a9c7f90b9 53
giovannivisentini 0:969a2be49f41 54 /**
giovannivisentini 9:9f2e2e68d695 55 * default password, also used to enable super user mode throught the I2C channel
giovannivisentini 0:969a2be49f41 56 */
giovannivisentini 0:969a2be49f41 57 const uint8_t M24SR::DEFAULT_PASSWORD[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
giovannivisentini 0:969a2be49f41 58 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
giovannivisentini 0:969a2be49f41 59
giovannivisentini 0:969a2be49f41 60 /** @addtogroup M24SR_Driver
giovannivisentini 0:969a2be49f41 61 * @{
giovannivisentini 0:969a2be49f41 62 * @brief <b>This folder contains the driver layer of M24SR family (M24SR64, M24SR16, M24SR04, M24SR02)</b>
giovannivisentini 0:969a2be49f41 63 */
giovannivisentini 0:969a2be49f41 64
giovannivisentini 0:969a2be49f41 65 /** @defgroup drv_M24SR
giovannivisentini 0:969a2be49f41 66 * @{
giovannivisentini 0:969a2be49f41 67 * @brief This file contains the driver which implements all the M24SR commands.
giovannivisentini 0:969a2be49f41 68 */
giovannivisentini 0:969a2be49f41 69
giovannivisentini 0:969a2be49f41 70 #ifndef errchk
giovannivisentini 0:969a2be49f41 71
giovannivisentini 9:9f2e2e68d695 72 /** value returned by the NFC chip when a command is successfully completed */
giovannivisentini 0:969a2be49f41 73 #define NFC_COMMAND_SUCCESS 0x9000
giovannivisentini 0:969a2be49f41 74
giovannivisentini 7:19fc04b8fec6 75 /** call the fCall funtion and check that the return status is NFC_SUCCESS,
giovannivisentini 0:969a2be49f41 76 * otherwise return the error status*/
giovannivisentini 16:b0d62f4b185a 77 //printf("call status: %x\n\r",status);
giovannivisentini 0:969a2be49f41 78 #define errchk(fCall) {\
giovannivisentini 0:969a2be49f41 79 const NFC_StatusTypeDef status = (fCall); \
giovannivisentini 0:969a2be49f41 80 if((status!=NFC_SUCCESS)) \
giovannivisentini 0:969a2be49f41 81 return status; \
giovannivisentini 0:969a2be49f41 82 }\
giovannivisentini 0:969a2be49f41 83
giovannivisentini 0:969a2be49f41 84 #endif
giovannivisentini 0:969a2be49f41 85
giovannivisentini 0:969a2be49f41 86 /**
giovannivisentini 0:969a2be49f41 87 * @brief This function updates the CRC
giovannivisentini 0:969a2be49f41 88 * @param None
giovannivisentini 0:969a2be49f41 89 * @retval None
giovannivisentini 0:969a2be49f41 90 */
giovannivisentini 4:cb1b4304a93e 91 static uint16_t M24SR_UpdateCrc(uint8_t ch, uint16_t *lpwCrc) {
giovannivisentini 0:969a2be49f41 92 ch = (ch ^ (uint8_t) ((*lpwCrc) & 0x00FF));
giovannivisentini 0:969a2be49f41 93 ch = (ch ^ (ch << 4));
giovannivisentini 0:969a2be49f41 94 *lpwCrc = (*lpwCrc >> 8) ^ ((uint16_t) ch << 8) ^ ((uint16_t) ch << 3)
giovannivisentini 0:969a2be49f41 95 ^ ((uint16_t) ch >> 4);
giovannivisentini 0:969a2be49f41 96
giovannivisentini 0:969a2be49f41 97 return (*lpwCrc);
giovannivisentini 0:969a2be49f41 98 }
giovannivisentini 0:969a2be49f41 99
giovannivisentini 0:969a2be49f41 100 /**
giovannivisentini 0:969a2be49f41 101 * @brief This function returns the CRC 16
giovannivisentini 0:969a2be49f41 102 * @param Data : pointer on the data used to compute the CRC16
giovannivisentini 9:9f2e2e68d695 103 * @param Length : number of bytes of the data
giovannivisentini 0:969a2be49f41 104 * @retval CRC16
giovannivisentini 0:969a2be49f41 105 */
giovannivisentini 4:cb1b4304a93e 106 static uint16_t M24SR_ComputeCrc(uint8_t *Data, uint8_t Length) {
giovannivisentini 0:969a2be49f41 107 uint8_t chBlock;
giovannivisentini 0:969a2be49f41 108 uint16_t wCrc = 0x6363; // ITU-V.41
giovannivisentini 0:969a2be49f41 109
giovannivisentini 0:969a2be49f41 110 do {
giovannivisentini 0:969a2be49f41 111 chBlock = *Data++;
giovannivisentini 0:969a2be49f41 112 M24SR_UpdateCrc(chBlock, &wCrc);
giovannivisentini 0:969a2be49f41 113 } while (--Length);
giovannivisentini 0:969a2be49f41 114
giovannivisentini 0:969a2be49f41 115 return wCrc;
giovannivisentini 0:969a2be49f41 116 }
giovannivisentini 0:969a2be49f41 117
giovannivisentini 0:969a2be49f41 118 /**
giovannivisentini 0:969a2be49f41 119 * @brief This function computes the CRC16 residue as defined by CRC ISO/IEC 13239
giovannivisentini 9:9f2e2e68d695 120 * @param DataIn : input data
giovannivisentini 0:969a2be49f41 121 * @param Length : Number of bits of DataIn
giovannivisentini 0:969a2be49f41 122 * @retval Status (SW1&SW2) : CRC16 residue is correct
giovannivisentini 0:969a2be49f41 123 * @retval M24SR_ERROR_CRC : CRC16 residue is false
giovannivisentini 0:969a2be49f41 124 */
giovannivisentini 4:cb1b4304a93e 125 static NFC_StatusTypeDef M24SR_IsCorrectCRC16Residue(uint8_t *DataIn, uint8_t Length) {
giovannivisentini 0:969a2be49f41 126 uint16_t ResCRC = 0x0000;
giovannivisentini 0:969a2be49f41 127
giovannivisentini 0:969a2be49f41 128 /* check the CRC16 Residue */
giovannivisentini 0:969a2be49f41 129 if (Length != 0)
giovannivisentini 0:969a2be49f41 130 ResCRC = M24SR_ComputeCrc(DataIn, Length);
giovannivisentini 0:969a2be49f41 131
giovannivisentini 0:969a2be49f41 132 if (ResCRC == 0x0000) {
giovannivisentini 0:969a2be49f41 133 /* Good CRC, but error status from M24SR */
giovannivisentini 0:969a2be49f41 134 return (NFC_StatusTypeDef) (((DataIn[Length - UB_STATUS_OFFSET] << 8)
giovannivisentini 0:969a2be49f41 135 & 0xFF00) | (DataIn[Length - LB_STATUS_OFFSET] & 0x00FF));
giovannivisentini 0:969a2be49f41 136 } else {
giovannivisentini 0:969a2be49f41 137 ResCRC = 0x0000;
giovannivisentini 0:969a2be49f41 138 ResCRC = M24SR_ComputeCrc(DataIn, 5);
giovannivisentini 0:969a2be49f41 139 if (ResCRC != 0x0000) {
giovannivisentini 0:969a2be49f41 140 /* Bad CRC */
giovannivisentini 0:969a2be49f41 141 return NFC_IO_ERROR_CRC;
giovannivisentini 0:969a2be49f41 142 } else {
giovannivisentini 0:969a2be49f41 143 /* Good CRC, but error status from M24SR */
giovannivisentini 0:969a2be49f41 144 return (NFC_StatusTypeDef) (((DataIn[1] << 8) & 0xFF00)
giovannivisentini 0:969a2be49f41 145 | (DataIn[2] & 0x00FF));
giovannivisentini 0:969a2be49f41 146 }
giovannivisentini 0:969a2be49f41 147 }
giovannivisentini 0:969a2be49f41 148 }
giovannivisentini 0:969a2be49f41 149
giovannivisentini 0:969a2be49f41 150 /**
giovannivisentini 0:969a2be49f41 151 * @brief This functions creates an I block command according to the structures CommandStructure and data->command.
giovannivisentini 9:9f2e2e68d695 152 * @param Command : structure which contains the field of the different parameters
giovannivisentini 9:9f2e2e68d695 153 * @param CommandStructure : structure of the command
giovannivisentini 9:9f2e2e68d695 154 * @param NbByte : number of bytes of the command
giovannivisentini 9:9f2e2e68d695 155 * @param pCommand : pointer to the command created
giovannivisentini 0:969a2be49f41 156 */
giovannivisentini 4:cb1b4304a93e 157 static void M24SR_BuildIBlockCommand(uint16_t CommandStructure, C_APDU *Command,
giovannivisentini 0:969a2be49f41 158 uint8_t uDIDbyte, uint16_t *NbByte, uint8_t *pCommand) {
giovannivisentini 0:969a2be49f41 159 uint16_t uCRC16;
giovannivisentini 0:969a2be49f41 160 static uint8_t BlockNumber = 0x01;
giovannivisentini 0:969a2be49f41 161
giovannivisentini 0:969a2be49f41 162 (*NbByte) = 0;
giovannivisentini 0:969a2be49f41 163
giovannivisentini 0:969a2be49f41 164 /* add the PCD byte */
giovannivisentini 0:969a2be49f41 165 if ((CommandStructure & M24SR_PCB_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 166 /* toggle the block number */
giovannivisentini 0:969a2be49f41 167 BlockNumber = TOGGLE(BlockNumber);
giovannivisentini 0:969a2be49f41 168 /* Add the I block byte */
giovannivisentini 0:969a2be49f41 169 pCommand[(*NbByte)++] = 0x02 | BlockNumber;
giovannivisentini 0:969a2be49f41 170 }
giovannivisentini 0:969a2be49f41 171
giovannivisentini 0:969a2be49f41 172 /* add the DID byte */
giovannivisentini 0:969a2be49f41 173 if ((BlockNumber & M24SR_DID_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 174 /* Add the I block byte */
giovannivisentini 0:969a2be49f41 175 pCommand[(*NbByte)++] = uDIDbyte;
giovannivisentini 0:969a2be49f41 176 }
giovannivisentini 0:969a2be49f41 177
giovannivisentini 0:969a2be49f41 178 /* add the Class byte */
giovannivisentini 0:969a2be49f41 179 if ((CommandStructure & M24SR_CLA_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 180 pCommand[(*NbByte)++] = Command->Header.CLA;
giovannivisentini 0:969a2be49f41 181 }
giovannivisentini 0:969a2be49f41 182 /* add the instruction byte byte */
giovannivisentini 0:969a2be49f41 183 if ((CommandStructure & M24SR_INS_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 184 pCommand[(*NbByte)++] = Command->Header.INS;
giovannivisentini 0:969a2be49f41 185 }
giovannivisentini 0:969a2be49f41 186 /* add the Selection Mode byte */
giovannivisentini 0:969a2be49f41 187 if ((CommandStructure & M24SR_P1_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 188 pCommand[(*NbByte)++] = Command->Header.P1;
giovannivisentini 0:969a2be49f41 189 }
giovannivisentini 0:969a2be49f41 190 /* add the Selection Mode byte */
giovannivisentini 0:969a2be49f41 191 if ((CommandStructure & M24SR_P2_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 192 pCommand[(*NbByte)++] = Command->Header.P2;
giovannivisentini 0:969a2be49f41 193 }
giovannivisentini 0:969a2be49f41 194 /* add Data field lengthbyte */
giovannivisentini 0:969a2be49f41 195 if ((CommandStructure & M24SR_LC_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 196 pCommand[(*NbByte)++] = Command->Body.LC;
giovannivisentini 0:969a2be49f41 197 }
giovannivisentini 0:969a2be49f41 198 /* add Data field */
giovannivisentini 0:969a2be49f41 199 if ((CommandStructure & M24SR_DATA_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 200 memcpy(&(pCommand[(*NbByte)]), Command->Body.pData, Command->Body.LC);
giovannivisentini 0:969a2be49f41 201 (*NbByte) += Command->Body.LC;
giovannivisentini 0:969a2be49f41 202 }
giovannivisentini 0:969a2be49f41 203 /* add Le field */
giovannivisentini 0:969a2be49f41 204 if ((CommandStructure & M24SR_LE_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 205 pCommand[(*NbByte)++] = Command->Body.LE;
giovannivisentini 0:969a2be49f41 206 }
giovannivisentini 0:969a2be49f41 207 /* add CRC field */
giovannivisentini 0:969a2be49f41 208 if ((CommandStructure & M24SR_CRC_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 209 uCRC16 = M24SR_ComputeCrc(pCommand, (uint8_t) (*NbByte));
giovannivisentini 0:969a2be49f41 210 /* append the CRC16 */
giovannivisentini 0:969a2be49f41 211 pCommand[(*NbByte)++] = GETLSB(uCRC16);
giovannivisentini 0:969a2be49f41 212 pCommand[(*NbByte)++] = GETMSB(uCRC16);
giovannivisentini 0:969a2be49f41 213 }
giovannivisentini 0:969a2be49f41 214
giovannivisentini 0:969a2be49f41 215 }
giovannivisentini 0:969a2be49f41 216
giovannivisentini 0:969a2be49f41 217
giovannivisentini 0:969a2be49f41 218 /**
giovannivisentini 9:9f2e2e68d695 219 * @brief This function returns M24SR_STATUS_SUCCESS if the pBuffer is an s-block
giovannivisentini 9:9f2e2e68d695 220 * @param pBuffer : pointer to the data
giovannivisentini 7:19fc04b8fec6 221 * @retval NFC_SUCCESS : the data is a S-Block
giovannivisentini 7:19fc04b8fec6 222 * @retval NFC_ERROR : the data is not a S-Block
giovannivisentini 0:969a2be49f41 223 */
giovannivisentini 0:969a2be49f41 224 static NFC_StatusTypeDef IsSBlock(uint8_t *pBuffer) {
giovannivisentini 0:969a2be49f41 225
giovannivisentini 0:969a2be49f41 226 if ((pBuffer[M24SR_OFFSET_PCB] & M24SR_MASK_BLOCK) == M24SR_MASK_SBLOCK) {
giovannivisentini 0:969a2be49f41 227 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 228 } else {
giovannivisentini 0:969a2be49f41 229 return NFC_ERROR;
giovannivisentini 0:969a2be49f41 230 }
giovannivisentini 0:969a2be49f41 231
giovannivisentini 0:969a2be49f41 232 }
giovannivisentini 0:969a2be49f41 233
giovannivisentini 0:969a2be49f41 234 /**
giovannivisentini 0:969a2be49f41 235 * @brief This function sends the FWT extension command (S-Block format)
giovannivisentini 0:969a2be49f41 236 * @param FWTbyte : FWT value
giovannivisentini 9:9f2e2e68d695 237 * @return NFC_SUCCESS if no errors
giovannivisentini 0:969a2be49f41 238 */
giovannivisentini 0:969a2be49f41 239 NFC_StatusTypeDef M24SR::M24SR_FWTExtension(uint8_t FWTbyte) {
giovannivisentini 0:969a2be49f41 240 uint8_t pBuffer[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 0:969a2be49f41 241 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 242 uint8_t NthByte = 0;
giovannivisentini 0:969a2be49f41 243 uint16_t uCRC16;
giovannivisentini 0:969a2be49f41 244
giovannivisentini 0:969a2be49f41 245 /* create the response */
giovannivisentini 0:969a2be49f41 246 pBuffer[NthByte++] = 0xF2;
giovannivisentini 0:969a2be49f41 247 pBuffer[NthByte++] = FWTbyte;
giovannivisentini 0:969a2be49f41 248 /* compute the CRC */
giovannivisentini 0:969a2be49f41 249 uCRC16 = M24SR_ComputeCrc(pBuffer, 0x02);
giovannivisentini 0:969a2be49f41 250 /* append the CRC16 */
giovannivisentini 0:969a2be49f41 251 pBuffer[NthByte++] = GETLSB(uCRC16);
giovannivisentini 0:969a2be49f41 252 pBuffer[NthByte++] = GETMSB(uCRC16);
giovannivisentini 0:969a2be49f41 253
giovannivisentini 0:969a2be49f41 254 /* send the request */
giovannivisentini 0:969a2be49f41 255 errchk(M24SR_IO_SendI2Ccommand(NthByte, pBuffer));
giovannivisentini 0:969a2be49f41 256 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 257 /* read the response */
giovannivisentini 0:969a2be49f41 258 errchk(
giovannivisentini 0:969a2be49f41 259 M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 260
giovannivisentini 0:969a2be49f41 261 status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 262
giovannivisentini 0:969a2be49f41 263 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 264 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 265 else
giovannivisentini 0:969a2be49f41 266 return status;
giovannivisentini 0:969a2be49f41 267 }
giovannivisentini 0:969a2be49f41 268
giovannivisentini 0:969a2be49f41 269 /**
giovannivisentini 0:969a2be49f41 270 * @brief This function sends the KillSession command to the M24SR device
giovannivisentini 0:969a2be49f41 271 * @param None
giovannivisentini 9:9f2e2e68d695 272 * @return NFC_SUCCESS if no errors
giovannivisentini 0:969a2be49f41 273 */
giovannivisentini 0:969a2be49f41 274 NFC_StatusTypeDef M24SR::M24SR_KillSession(void) {
giovannivisentini 0:969a2be49f41 275 uint8_t commandBuffer[] = M24SR_KILLSESSION_COMMAND;
giovannivisentini 0:969a2be49f41 276
giovannivisentini 0:969a2be49f41 277 errchk(M24SR_IO_SendI2Ccommand(sizeof(commandBuffer), commandBuffer));
giovannivisentini 0:969a2be49f41 278
giovannivisentini 0:969a2be49f41 279 /* Insure no access will be done just after open session */
giovannivisentini 0:969a2be49f41 280 /* The only way here is to poll I2C to know when M24SR is ready */
giovannivisentini 0:969a2be49f41 281 /* GPO can not be use with KillSession command */
giovannivisentini 0:969a2be49f41 282 errchk(M24SR_IO_PollI2C());
giovannivisentini 0:969a2be49f41 283
giovannivisentini 0:969a2be49f41 284 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 285 }
giovannivisentini 0:969a2be49f41 286
giovannivisentini 0:969a2be49f41 287 /**
giovannivisentini 0:969a2be49f41 288 * @brief This function sends the Deselect command (S-Block format)
giovannivisentini 9:9f2e2e68d695 289 * @return NFC_SUCCESS if no errors
giovannivisentini 0:969a2be49f41 290 */
giovannivisentini 0:969a2be49f41 291 NFC_StatusTypeDef M24SR::M24SR_Deselect(void) {
giovannivisentini 0:969a2be49f41 292 uint8_t pBuffer[] = M24SR_DESELECTREQUEST_COMMAND;
giovannivisentini 0:969a2be49f41 293
giovannivisentini 0:969a2be49f41 294 /* send the request */
giovannivisentini 0:969a2be49f41 295 errchk(M24SR_IO_SendI2Ccommand(sizeof(pBuffer), pBuffer));
giovannivisentini 0:969a2be49f41 296
giovannivisentini 0:969a2be49f41 297 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 298 /* flush the M24SR buffer */
giovannivisentini 0:969a2be49f41 299 errchk(M24SR_IO_ReceiveI2Cresponse(sizeof(pBuffer), pBuffer));
giovannivisentini 0:969a2be49f41 300
giovannivisentini 0:969a2be49f41 301 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 302 }
giovannivisentini 0:969a2be49f41 303
giovannivisentini 0:969a2be49f41 304 /**
giovannivisentini 0:969a2be49f41 305 * @brief This function sends the SelectApplication command
giovannivisentini 9:9f2e2e68d695 306 * @return NFC_SUCCESS if no errors
giovannivisentini 0:969a2be49f41 307 */
giovannivisentini 0:969a2be49f41 308 NFC_StatusTypeDef M24SR::M24SR_SelectApplication(void) {
giovannivisentini 0:969a2be49f41 309
giovannivisentini 0:969a2be49f41 310 C_APDU command;
giovannivisentini 0:969a2be49f41 311 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 312 uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 0:969a2be49f41 313 uint8_t pDataOut[] = M24SR_SELECTAPPLICATION_COMMAND;
giovannivisentini 0:969a2be49f41 314 uint8_t uLe = 0x00;
giovannivisentini 0:969a2be49f41 315 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 316 uint16_t uP1P2 =0x0400,
giovannivisentini 0:969a2be49f41 317 NbByte;
giovannivisentini 0:969a2be49f41 318
giovannivisentini 0:969a2be49f41 319 /* build the command */
giovannivisentini 0:969a2be49f41 320 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 321 command.Header.INS = C_APDU_SELECT_FILE;
giovannivisentini 0:969a2be49f41 322 /* copy the offset */
giovannivisentini 0:969a2be49f41 323 command.Header.P1 = GETMSB(uP1P2);
giovannivisentini 0:969a2be49f41 324 command.Header.P2 = GETLSB(uP1P2);
giovannivisentini 0:969a2be49f41 325 /* copy the number of byte of the data field */
giovannivisentini 0:969a2be49f41 326 command.Body.LC = sizeof(pDataOut);
giovannivisentini 0:969a2be49f41 327 /* copy the data */
giovannivisentini 0:969a2be49f41 328 command.Body.pData = pDataOut;
giovannivisentini 0:969a2be49f41 329 /* copy the number of byte to read */
giovannivisentini 0:969a2be49f41 330 command.Body.LE = uLe;
giovannivisentini 0:969a2be49f41 331 /* build the I²C command */
giovannivisentini 0:969a2be49f41 332 M24SR_BuildIBlockCommand( M24SR_CMDSTRUCT_SELECTAPPLICATION, &command,
giovannivisentini 0:969a2be49f41 333 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 334
giovannivisentini 0:969a2be49f41 335 /* send the request */
giovannivisentini 0:969a2be49f41 336 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 337 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 338 /* read the response */
giovannivisentini 0:969a2be49f41 339 errchk(M24SR_IO_ReceiveI2Cresponse(sizeof(pDataIn), pDataIn));
giovannivisentini 16:b0d62f4b185a 340
giovannivisentini 0:969a2be49f41 341 status= M24SR_IsCorrectCRC16Residue(pDataIn, sizeof(pDataIn));
giovannivisentini 16:b0d62f4b185a 342 //printf("M24SR_IsCorrectCRC16Residue %x\r\n",status);
giovannivisentini 0:969a2be49f41 343
giovannivisentini 0:969a2be49f41 344 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 345 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 346 else
giovannivisentini 0:969a2be49f41 347 return status;
giovannivisentini 0:969a2be49f41 348
giovannivisentini 0:969a2be49f41 349 }
giovannivisentini 0:969a2be49f41 350
giovannivisentini 0:969a2be49f41 351 /**
giovannivisentini 0:969a2be49f41 352 * @brief This function initialize the M24SR device
giovannivisentini 0:969a2be49f41 353 * @retval None
giovannivisentini 0:969a2be49f41 354 */
giovannivisentini 15:67e136b6921d 355 NFC_StatusTypeDef M24SR::M24SR_Init(M24SR_InitTypeDef *notUsed) {
giovannivisentini 0:969a2be49f41 356 (void) notUsed;
giovannivisentini 0:969a2be49f41 357
giovannivisentini 0:969a2be49f41 358 errchk(M24SR_KillSession())
giovannivisentini 0:969a2be49f41 359 errchk(M24SR_ManageI2CGPO(I2C_ANSWER_READY))
giovannivisentini 0:969a2be49f41 360 errchk(M24SR_Deselect())
giovannivisentini 0:969a2be49f41 361
giovannivisentini 0:969a2be49f41 362 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 363 }
giovannivisentini 0:969a2be49f41 364
giovannivisentini 0:969a2be49f41 365 NFC_StatusTypeDef M24SR::M24SR_ReadID(uint8_t *nfc_id) {
giovannivisentini 0:969a2be49f41 366 if (!nfc_id) {
giovannivisentini 0:969a2be49f41 367 return NFC_ERROR;
giovannivisentini 0:969a2be49f41 368 }
giovannivisentini 0:969a2be49f41 369
giovannivisentini 0:969a2be49f41 370 errchk(M24SR_SelectApplication())
giovannivisentini 0:969a2be49f41 371
giovannivisentini 0:969a2be49f41 372 return M24SR_ReadBinary(0x0011, 1, nfc_id);
giovannivisentini 0:969a2be49f41 373 }
giovannivisentini 0:969a2be49f41 374
giovannivisentini 0:969a2be49f41 375 /**
giovannivisentini 0:969a2be49f41 376 * @brief This function sends the GetSession command to the M24SR device
giovannivisentini 9:9f2e2e68d695 377 * @retval NFC_SUCCESS the function is successful.
giovannivisentini 9:9f2e2e68d695 378 * @retval Status (SW1&SW2) if operation does not complete.
giovannivisentini 0:969a2be49f41 379 */
giovannivisentini 0:969a2be49f41 380 NFC_StatusTypeDef M24SR::M24SR_GetSession(void) {
giovannivisentini 0:969a2be49f41 381 uint8_t commandBuffer[] = M24SR_OPENSESSION_COMMAND;
giovannivisentini 0:969a2be49f41 382
giovannivisentini 0:969a2be49f41 383 errchk(M24SR_IO_SendI2Ccommand(sizeof(commandBuffer), commandBuffer));
giovannivisentini 0:969a2be49f41 384
giovannivisentini 0:969a2be49f41 385 /* Insure no access will be done just after open session */
giovannivisentini 0:969a2be49f41 386 /* The only way here is to poll I2C to know when M24SR is ready */
giovannivisentini 0:969a2be49f41 387 /* GPO can not be use with GetSession command */
giovannivisentini 0:969a2be49f41 388 errchk(M24SR_IO_PollI2C());
giovannivisentini 0:969a2be49f41 389
giovannivisentini 0:969a2be49f41 390 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 391
giovannivisentini 0:969a2be49f41 392 }
giovannivisentini 0:969a2be49f41 393
giovannivisentini 0:969a2be49f41 394 /**
giovannivisentini 0:969a2be49f41 395 * @brief This function sends the SelectCCFile command
giovannivisentini 9:9f2e2e68d695 396 * @retval NFC_SUCCESS the function is successful.
giovannivisentini 9:9f2e2e68d695 397 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 9:9f2e2e68d695 398 * @retval Status (SW1&SW2) if operation does not complete for another reason.
giovannivisentini 0:969a2be49f41 399 */
giovannivisentini 0:969a2be49f41 400 NFC_StatusTypeDef M24SR::M24SR_SelectCCfile(void) {
giovannivisentini 0:969a2be49f41 401 C_APDU command;
giovannivisentini 0:969a2be49f41 402
giovannivisentini 0:969a2be49f41 403 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 404 uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 0:969a2be49f41 405 uint8_t pDataOut[] = CC_FILE_ID_BYTES;
giovannivisentini 0:969a2be49f41 406 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 407 uint16_t uP1P2 =0x000C,
giovannivisentini 0:969a2be49f41 408 NbByte;
giovannivisentini 0:969a2be49f41 409
giovannivisentini 0:969a2be49f41 410 /* build the command */
giovannivisentini 0:969a2be49f41 411 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 412 command.Header.INS = C_APDU_SELECT_FILE;
giovannivisentini 0:969a2be49f41 413 /* copy the offset */
giovannivisentini 0:969a2be49f41 414 command.Header.P1 = GETMSB(uP1P2);
giovannivisentini 0:969a2be49f41 415 command.Header.P2 = GETLSB(uP1P2);
giovannivisentini 0:969a2be49f41 416 /* copy the number of byte of the data field */
giovannivisentini 0:969a2be49f41 417 command.Body.LC = sizeof(pDataOut);
giovannivisentini 0:969a2be49f41 418 command.Body.pData = pDataOut;
giovannivisentini 7:19fc04b8fec6 419 /* build the I2C command */
giovannivisentini 0:969a2be49f41 420 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SELECTCCFILE, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 421 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 422
giovannivisentini 0:969a2be49f41 423 /* send the request */
giovannivisentini 0:969a2be49f41 424 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 425 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 426 /* read the response */
giovannivisentini 0:969a2be49f41 427 errchk(M24SR_IO_ReceiveI2Cresponse(sizeof(pDataIn), pDataIn));
giovannivisentini 0:969a2be49f41 428
giovannivisentini 0:969a2be49f41 429 status = M24SR_IsCorrectCRC16Residue(pDataIn, sizeof(pDataIn));
giovannivisentini 0:969a2be49f41 430
giovannivisentini 0:969a2be49f41 431 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 432 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 433 else
giovannivisentini 0:969a2be49f41 434 return status;
giovannivisentini 0:969a2be49f41 435 }
giovannivisentini 0:969a2be49f41 436
giovannivisentini 0:969a2be49f41 437 /**
giovannivisentini 0:969a2be49f41 438 * @brief This function sends the SelectSystemFile command
giovannivisentini 9:9f2e2e68d695 439 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 440 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 441 */
giovannivisentini 0:969a2be49f41 442 NFC_StatusTypeDef M24SR::M24SR_SelectSystemfile(void) {
giovannivisentini 0:969a2be49f41 443 C_APDU command;
giovannivisentini 0:969a2be49f41 444
giovannivisentini 0:969a2be49f41 445 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 446 uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 0:969a2be49f41 447 uint8_t pDataOut[] = SYSTEM_FILE_ID_BYTES;
giovannivisentini 0:969a2be49f41 448 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 449 uint16_t uP1P2 =0x000C,
giovannivisentini 0:969a2be49f41 450 NbByte;
giovannivisentini 0:969a2be49f41 451
giovannivisentini 0:969a2be49f41 452 /* build the command */
giovannivisentini 0:969a2be49f41 453 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 454 command.Header.INS = C_APDU_SELECT_FILE;
giovannivisentini 0:969a2be49f41 455 /* copy the offset */
giovannivisentini 0:969a2be49f41 456 command.Header.P1 = GETMSB(uP1P2);
giovannivisentini 0:969a2be49f41 457 command.Header.P2 = GETLSB(uP1P2);
giovannivisentini 0:969a2be49f41 458 /* copy the number of byte of the data field */
giovannivisentini 0:969a2be49f41 459 command.Body.LC = sizeof(pDataOut);
giovannivisentini 0:969a2be49f41 460 command.Body.pData = pDataOut;
giovannivisentini 0:969a2be49f41 461 /* build the I²C command */
giovannivisentini 0:969a2be49f41 462 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SELECTCCFILE, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 463 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 464
giovannivisentini 0:969a2be49f41 465 /* send the request */
giovannivisentini 0:969a2be49f41 466 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 467 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 468 /* read the response */
giovannivisentini 0:969a2be49f41 469 errchk(M24SR_IO_ReceiveI2Cresponse(sizeof(pDataIn), pDataIn));
giovannivisentini 0:969a2be49f41 470
giovannivisentini 0:969a2be49f41 471 status = M24SR_IsCorrectCRC16Residue(pDataIn, sizeof(pDataIn));
giovannivisentini 0:969a2be49f41 472
giovannivisentini 0:969a2be49f41 473 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 474 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 475 else
giovannivisentini 0:969a2be49f41 476 return status;
giovannivisentini 0:969a2be49f41 477 }
giovannivisentini 0:969a2be49f41 478
giovannivisentini 0:969a2be49f41 479 /**
giovannivisentini 0:969a2be49f41 480 * @brief This function sends the SelectNDEFfile command
giovannivisentini 9:9f2e2e68d695 481 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 482 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 483 */
giovannivisentini 0:969a2be49f41 484 NFC_StatusTypeDef M24SR::M24SR_SelectNDEFfile(uint16_t NDEFfileId) {
giovannivisentini 0:969a2be49f41 485 C_APDU command;
giovannivisentini 0:969a2be49f41 486 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 487 uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 0:969a2be49f41 488 uint8_t pDataOut[] = { GETMSB(NDEFfileId), GETLSB(NDEFfileId) };
giovannivisentini 0:969a2be49f41 489 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 490 uint16_t uP1P2 = 0x000C, NbByte;
giovannivisentini 0:969a2be49f41 491
giovannivisentini 0:969a2be49f41 492 /* build the command */
giovannivisentini 0:969a2be49f41 493 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 494 command.Header.INS = C_APDU_SELECT_FILE;
giovannivisentini 0:969a2be49f41 495 /* copy the offset */
giovannivisentini 0:969a2be49f41 496 command.Header.P1 = GETMSB(uP1P2);
giovannivisentini 0:969a2be49f41 497 command.Header.P2 = GETLSB(uP1P2);
giovannivisentini 0:969a2be49f41 498 /* copy the number of byte of the data field */
giovannivisentini 0:969a2be49f41 499 command.Body.LC = sizeof(pDataOut);
giovannivisentini 0:969a2be49f41 500 command.Body.pData = pDataOut;
giovannivisentini 0:969a2be49f41 501 /* copy the offset */
giovannivisentini 0:969a2be49f41 502 /* build the I²C command */
giovannivisentini 0:969a2be49f41 503 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SELECTNDEFFILE, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 504 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 505
giovannivisentini 0:969a2be49f41 506 /* send the request */
giovannivisentini 0:969a2be49f41 507 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 508 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 509 /* read the response */
giovannivisentini 0:969a2be49f41 510 errchk(M24SR_IO_ReceiveI2Cresponse(sizeof(pDataIn), pDataIn));
giovannivisentini 0:969a2be49f41 511
giovannivisentini 0:969a2be49f41 512 status = M24SR_IsCorrectCRC16Residue(pDataIn, sizeof(pDataIn));
giovannivisentini 0:969a2be49f41 513 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 514 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 515 else
giovannivisentini 0:969a2be49f41 516 return status;
giovannivisentini 0:969a2be49f41 517
giovannivisentini 0:969a2be49f41 518 }
giovannivisentini 0:969a2be49f41 519
giovannivisentini 0:969a2be49f41 520 /**
giovannivisentini 0:969a2be49f41 521 * @brief This function sends a read binary command
giovannivisentini 9:9f2e2e68d695 522 * @param Offset first byte to read
giovannivisentini 9:9f2e2e68d695 523 * @param NbByteToRead number of bytes to read
giovannivisentini 9:9f2e2e68d695 524 * @param pBufferRead pointer to the buffer read from the M24SR device
giovannivisentini 9:9f2e2e68d695 525 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 526 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 527 */
giovannivisentini 0:969a2be49f41 528 NFC_StatusTypeDef M24SR::M24SR_ReadBinary(uint16_t Offset, uint8_t NbByteToRead,
giovannivisentini 0:969a2be49f41 529 uint8_t *pBufferRead) {
giovannivisentini 0:969a2be49f41 530 C_APDU command;
giovannivisentini 0:969a2be49f41 531 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 532 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 533 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 534
giovannivisentini 0:969a2be49f41 535 /* build the command */
giovannivisentini 0:969a2be49f41 536 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 537 command.Header.INS = C_APDU_READ_BINARY;
giovannivisentini 0:969a2be49f41 538 /* copy the offset */
giovannivisentini 0:969a2be49f41 539 command.Header.P1 = GETMSB(Offset);
giovannivisentini 0:969a2be49f41 540 command.Header.P2 = GETLSB(Offset);
giovannivisentini 0:969a2be49f41 541 /* copy the number of byte to read */
giovannivisentini 0:969a2be49f41 542 command.Body.LE = NbByteToRead;
giovannivisentini 0:969a2be49f41 543
giovannivisentini 0:969a2be49f41 544 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_READBINARY, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 545 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 546
giovannivisentini 0:969a2be49f41 547 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 548 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 549 errchk(
giovannivisentini 0:969a2be49f41 550 M24SR_IO_ReceiveI2Cresponse (NbByteToRead + M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 551
giovannivisentini 0:969a2be49f41 552 status = M24SR_IsCorrectCRC16Residue(pBuffer,
giovannivisentini 0:969a2be49f41 553 NbByteToRead + M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 554 if(status != NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 555 return status;
giovannivisentini 0:969a2be49f41 556 /* retrieve the data without SW1 & SW2 as provided as return value of the function */
giovannivisentini 0:969a2be49f41 557 memcpy(pBufferRead, &pBuffer[1], NbByteToRead);
giovannivisentini 0:969a2be49f41 558 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 559
giovannivisentini 0:969a2be49f41 560 }
giovannivisentini 0:969a2be49f41 561
giovannivisentini 0:969a2be49f41 562 /**
giovannivisentini 0:969a2be49f41 563 * @brief This function sends a ST read binary command (no error if access is not inside NDEF file)
giovannivisentini 9:9f2e2e68d695 564 * @param Offset first byte to read
giovannivisentini 9:9f2e2e68d695 565 * @param NbByteToRead number of bytes to read
giovannivisentini 9:9f2e2e68d695 566 * @param pBufferRead pointer to the buffer read from the M24SR device
giovannivisentini 9:9f2e2e68d695 567 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 568 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 569 */
giovannivisentini 0:969a2be49f41 570 NFC_StatusTypeDef M24SR::M24SR_STReadBinary(uint16_t Offset,
giovannivisentini 0:969a2be49f41 571 uint8_t NbByteToRead, uint8_t *pBufferRead) {
giovannivisentini 0:969a2be49f41 572 C_APDU command;
giovannivisentini 0:969a2be49f41 573 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 574 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 575 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 576
giovannivisentini 0:969a2be49f41 577 /* build the command */
giovannivisentini 0:969a2be49f41 578 command.Header.CLA = C_APDU_CLA_ST;
giovannivisentini 0:969a2be49f41 579 command.Header.INS = C_APDU_READ_BINARY;
giovannivisentini 0:969a2be49f41 580 /* copy the offset */
giovannivisentini 0:969a2be49f41 581 command.Header.P1 = GETMSB(Offset);
giovannivisentini 0:969a2be49f41 582 command.Header.P2 = GETLSB(Offset);
giovannivisentini 0:969a2be49f41 583 /* copy the number of byte to read */
giovannivisentini 0:969a2be49f41 584 command.Body.LE = NbByteToRead;
giovannivisentini 0:969a2be49f41 585
giovannivisentini 0:969a2be49f41 586 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_READBINARY, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 587 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 588
giovannivisentini 0:969a2be49f41 589 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 590 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 591 errchk(
giovannivisentini 0:969a2be49f41 592 M24SR_IO_ReceiveI2Cresponse (NbByteToRead + M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 593
giovannivisentini 0:969a2be49f41 594 status = M24SR_IsCorrectCRC16Residue(pBuffer,
giovannivisentini 0:969a2be49f41 595 NbByteToRead + M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 596
giovannivisentini 0:969a2be49f41 597 if(status != NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 598 return status;
giovannivisentini 0:969a2be49f41 599 /* retrieve the data without SW1 & SW2 as provided as return value of the function */
giovannivisentini 0:969a2be49f41 600 memcpy(pBufferRead, &pBuffer[1], NbByteToRead);
giovannivisentini 0:969a2be49f41 601 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 602 }
giovannivisentini 0:969a2be49f41 603
giovannivisentini 0:969a2be49f41 604 /**
giovannivisentini 0:969a2be49f41 605 * @brief This function sends a Update binary command
giovannivisentini 9:9f2e2e68d695 606 * @param Offset first byte to read
giovannivisentini 9:9f2e2e68d695 607 * @param NbByteToWrite number of bytes to write
giovannivisentini 9:9f2e2e68d695 608 * @param pBufferRead pointer to the buffer read from the M24SR device
giovannivisentini 9:9f2e2e68d695 609 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 610 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 611 */
giovannivisentini 0:969a2be49f41 612 NFC_StatusTypeDef M24SR::M24SR_UpdateBinary(uint16_t Offset,
giovannivisentini 0:969a2be49f41 613 uint8_t NbByteToWrite, uint8_t *pDataToWrite) {
giovannivisentini 0:969a2be49f41 614 //TODO check the length of the data to write
giovannivisentini 0:969a2be49f41 615 C_APDU command;
giovannivisentini 0:969a2be49f41 616
giovannivisentini 0:969a2be49f41 617 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 618 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 619 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 620
giovannivisentini 0:969a2be49f41 621 /* build the command */
giovannivisentini 0:969a2be49f41 622 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 623 command.Header.INS = C_APDU_UPDATE_BINARY;
giovannivisentini 0:969a2be49f41 624 /* copy the offset */
giovannivisentini 0:969a2be49f41 625 command.Header.P1 = GETMSB(Offset);
giovannivisentini 0:969a2be49f41 626 command.Header.P2 = GETLSB(Offset);
giovannivisentini 0:969a2be49f41 627 /* copy the number of byte of the data field */
giovannivisentini 0:969a2be49f41 628 command.Body.LC = NbByteToWrite;
giovannivisentini 0:969a2be49f41 629 command.Body.pData = pDataToWrite;
giovannivisentini 0:969a2be49f41 630 /* copy the File Id */
giovannivisentini 0:969a2be49f41 631 //memcpy(command.Body.pData ,pDataToWrite, NbByteToWrite );
giovannivisentini 0:969a2be49f41 632 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_UPDATEBINARY, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 633 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 634
giovannivisentini 0:969a2be49f41 635 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 636 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 637 errchk(
giovannivisentini 0:969a2be49f41 638 M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 639 /* if the response is a Watiting frame extenstion request */
giovannivisentini 0:969a2be49f41 640
giovannivisentini 0:969a2be49f41 641 if (IsSBlock(pBuffer) == NFC_SUCCESS) {
giovannivisentini 0:969a2be49f41 642 /*check the CRC */
giovannivisentini 0:969a2be49f41 643 status =M24SR_IsCorrectCRC16Residue(pBuffer,
giovannivisentini 0:969a2be49f41 644 M24SR_WATINGTIMEEXTRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 645 // TODO: why if we check ==NFC_Commandsuccess it fail?
giovannivisentini 0:969a2be49f41 646 if (status != NFC_IO_ERROR_CRC) {
giovannivisentini 0:969a2be49f41 647 /* send the FrameExension response*/
giovannivisentini 0:969a2be49f41 648 errchk(M24SR_FWTExtension(pBuffer[M24SR_OFFSET_PCB + 1]));
giovannivisentini 0:969a2be49f41 649 }else
giovannivisentini 0:969a2be49f41 650 return status;
giovannivisentini 0:969a2be49f41 651 } else {
giovannivisentini 0:969a2be49f41 652 status = M24SR_IsCorrectCRC16Residue(pBuffer,
giovannivisentini 0:969a2be49f41 653 M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 654 if(status!=NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 655 return status;
giovannivisentini 0:969a2be49f41 656 }
giovannivisentini 0:969a2be49f41 657
giovannivisentini 0:969a2be49f41 658 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 659
giovannivisentini 0:969a2be49f41 660 }
giovannivisentini 0:969a2be49f41 661
giovannivisentini 0:969a2be49f41 662 /**
giovannivisentini 0:969a2be49f41 663 * @brief This function sends the Verify command
giovannivisentini 9:9f2e2e68d695 664 * @param uPwdId PasswordId ( 0x0001 : Read NDEF pwd or 0x0002 : Write NDEF pwd or 0x0003 : I2C pwd)
giovannivisentini 9:9f2e2e68d695 665 * @param NbPwdByte Number of bytes ( 0x00 or 0x10)
giovannivisentini 9:9f2e2e68d695 666 * @param pPwd pointer to the password
giovannivisentini 9:9f2e2e68d695 667 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 668 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 669 */
giovannivisentini 0:969a2be49f41 670 NFC_StatusTypeDef M24SR::M24SR_Verify(uint16_t uPwdId, uint8_t NbPwdByte,
giovannivisentini 0:969a2be49f41 671 const uint8_t *pPwd) {
giovannivisentini 0:969a2be49f41 672 C_APDU command;
giovannivisentini 0:969a2be49f41 673
giovannivisentini 0:969a2be49f41 674 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 675 NFC_StatusTypeDef status = NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 676 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 677
giovannivisentini 0:969a2be49f41 678 /*check the parameters */
giovannivisentini 0:969a2be49f41 679 if (uPwdId > 0x0003) {
giovannivisentini 0:969a2be49f41 680 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 681 }
giovannivisentini 0:969a2be49f41 682 if ((NbPwdByte != 0x00) && (NbPwdByte != 0x10)) {
giovannivisentini 0:969a2be49f41 683 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 684 }
giovannivisentini 0:969a2be49f41 685
giovannivisentini 0:969a2be49f41 686 /* build the command */
giovannivisentini 0:969a2be49f41 687 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 688 command.Header.INS = C_APDU_VERIFY;
giovannivisentini 0:969a2be49f41 689 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 690 command.Header.P1 = GETMSB(uPwdId);
giovannivisentini 0:969a2be49f41 691 command.Header.P2 = GETLSB(uPwdId);
giovannivisentini 9:9f2e2e68d695 692 /* copy the number of bytes of the data field */
giovannivisentini 0:969a2be49f41 693 command.Body.LC = NbPwdByte;
giovannivisentini 0:969a2be49f41 694
giovannivisentini 0:969a2be49f41 695 if (NbPwdByte == 0x10) {
giovannivisentini 0:969a2be49f41 696 /* copy the password */
giovannivisentini 0:969a2be49f41 697 command.Body.pData = pPwd;
giovannivisentini 0:969a2be49f41 698 /* build the I2C command */
giovannivisentini 0:969a2be49f41 699 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_VERIFYBINARYWITHPWD, &command,
giovannivisentini 0:969a2be49f41 700 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 701 } else {
giovannivisentini 0:969a2be49f41 702 command.Body.pData = NULL;
giovannivisentini 0:969a2be49f41 703 /* build the I2C command */
giovannivisentini 0:969a2be49f41 704 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_VERIFYBINARYWOPWD, &command,
giovannivisentini 0:969a2be49f41 705 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 706 }
giovannivisentini 0:969a2be49f41 707
giovannivisentini 0:969a2be49f41 708 /* send the request */
giovannivisentini 0:969a2be49f41 709 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 710 /* wait for answer ready */
giovannivisentini 0:969a2be49f41 711 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 712 /* read the response */
giovannivisentini 0:969a2be49f41 713 errchk(
giovannivisentini 0:969a2be49f41 714 M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 715
giovannivisentini 0:969a2be49f41 716 status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 717 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 718 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 719 else
giovannivisentini 0:969a2be49f41 720 return status;
giovannivisentini 0:969a2be49f41 721
giovannivisentini 0:969a2be49f41 722 }
giovannivisentini 0:969a2be49f41 723
giovannivisentini 0:969a2be49f41 724 /**
giovannivisentini 0:969a2be49f41 725 * @brief This function sends the ChangeReferenceData command
giovannivisentini 9:9f2e2e68d695 726 * @param uPwdId PasswordId ( 0x0001 : Read NDEF pwd or 0x0002 : Write NDEF pwd or 0x0003 : I2C pwd)
giovannivisentini 9:9f2e2e68d695 727 * @param pPwd pointer to the passwaord
giovannivisentini 9:9f2e2e68d695 728 * @retval Status (SW1&SW2) Satus of the operation to complete.
giovannivisentini 9:9f2e2e68d695 729 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 730 */
giovannivisentini 0:969a2be49f41 731 NFC_StatusTypeDef M24SR::M24SR_ChangeReferenceData(uint16_t uPwdId,
giovannivisentini 0:969a2be49f41 732 uint8_t *pPwd) {
giovannivisentini 0:969a2be49f41 733 C_APDU command;
giovannivisentini 0:969a2be49f41 734 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 735 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 736 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 737
giovannivisentini 0:969a2be49f41 738 /*check the parameters */
giovannivisentini 0:969a2be49f41 739 if (uPwdId > 0x0003) {
giovannivisentini 0:969a2be49f41 740 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 741 }
giovannivisentini 0:969a2be49f41 742
giovannivisentini 0:969a2be49f41 743 /* build the command */
giovannivisentini 0:969a2be49f41 744 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 745 command.Header.INS = C_APDU_CHANGE;
giovannivisentini 0:969a2be49f41 746 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 747 command.Header.P1 = GETMSB(uPwdId);
giovannivisentini 0:969a2be49f41 748 command.Header.P2 = GETLSB(uPwdId);
giovannivisentini 0:969a2be49f41 749 /* copy the number of byte of the data field */
giovannivisentini 0:969a2be49f41 750 command.Body.LC = M24SR_PASSWORD_NBBYTE;
giovannivisentini 0:969a2be49f41 751 /* copy the password */
giovannivisentini 0:969a2be49f41 752 command.Body.pData = pPwd;
giovannivisentini 0:969a2be49f41 753 /* build the I²C command */
giovannivisentini 0:969a2be49f41 754 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_CHANGEREFDATA, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 755 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 756
giovannivisentini 0:969a2be49f41 757 /* send the request */
giovannivisentini 0:969a2be49f41 758 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 759 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 760 /* read the response */
giovannivisentini 0:969a2be49f41 761 errchk(
giovannivisentini 0:969a2be49f41 762 M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 763
giovannivisentini 0:969a2be49f41 764 status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 765
giovannivisentini 0:969a2be49f41 766 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 767 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 768 else
giovannivisentini 0:969a2be49f41 769 return status;
giovannivisentini 0:969a2be49f41 770 }
giovannivisentini 0:969a2be49f41 771
giovannivisentini 0:969a2be49f41 772 /**
giovannivisentini 0:969a2be49f41 773 * @brief This function sends the EnableVerificationRequirement command
giovannivisentini 9:9f2e2e68d695 774 * @param uReadOrWrite enable the read or write protection ( 0x0001 : Read or 0x0002 : Write )
giovannivisentini 9:9f2e2e68d695 775 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 776 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 777 */
giovannivisentini 0:969a2be49f41 778 NFC_StatusTypeDef M24SR::M24SR_EnableVerificationRequirement(
giovannivisentini 0:969a2be49f41 779 uint16_t uReadOrWrite) {
giovannivisentini 0:969a2be49f41 780 C_APDU command;
giovannivisentini 0:969a2be49f41 781 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 782 NFC_StatusTypeDef status = NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 783 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 784
giovannivisentini 0:969a2be49f41 785 /*check the parameters */
giovannivisentini 0:969a2be49f41 786 if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) {
giovannivisentini 0:969a2be49f41 787 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 788 }
giovannivisentini 0:969a2be49f41 789
giovannivisentini 0:969a2be49f41 790 /* build the command */
giovannivisentini 0:969a2be49f41 791 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 792 command.Header.INS = C_APDU_ENABLE;
giovannivisentini 0:969a2be49f41 793 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 794 command.Header.P1 = GETMSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 795 command.Header.P2 = GETLSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 796 /* build the I²C command */
giovannivisentini 0:969a2be49f41 797 M24SR_BuildIBlockCommand( M24SR_CMDSTRUCT_ENABLEVERIFREQ, &command,
giovannivisentini 0:969a2be49f41 798 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 799
giovannivisentini 0:969a2be49f41 800 /* send the request */
giovannivisentini 0:969a2be49f41 801 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 802 /* The right access to be updated in EEPROM need at least 6ms */
giovannivisentini 0:969a2be49f41 803 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 804 /* read the response */
giovannivisentini 0:969a2be49f41 805 errchk(
giovannivisentini 0:969a2be49f41 806 M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 807
giovannivisentini 0:969a2be49f41 808 status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 809 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 810 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 811 else
giovannivisentini 0:969a2be49f41 812 return status;
giovannivisentini 0:969a2be49f41 813 }
giovannivisentini 0:969a2be49f41 814
giovannivisentini 0:969a2be49f41 815 /**
giovannivisentini 0:969a2be49f41 816 * @brief This function sends the DisableVerificationRequirement command
giovannivisentini 9:9f2e2e68d695 817 * @param uReadOrWrite enable the read or write protection ( 0x0001 : Read or 0x0002 : Write )
giovannivisentini 9:9f2e2e68d695 818 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 819 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 820 */
giovannivisentini 0:969a2be49f41 821 NFC_StatusTypeDef M24SR::M24SR_DisableVerificationRequirement(
giovannivisentini 0:969a2be49f41 822 uint16_t uReadOrWrite) {
giovannivisentini 0:969a2be49f41 823 C_APDU command;
giovannivisentini 0:969a2be49f41 824 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 825 NFC_StatusTypeDef status = NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 826 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 827
giovannivisentini 0:969a2be49f41 828 /*check the parameters */
giovannivisentini 0:969a2be49f41 829 if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) {
giovannivisentini 0:969a2be49f41 830 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 831 }
giovannivisentini 0:969a2be49f41 832
giovannivisentini 0:969a2be49f41 833 /* build the command */
giovannivisentini 0:969a2be49f41 834 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 835 command.Header.INS = C_APDU_DISABLE;
giovannivisentini 0:969a2be49f41 836 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 837 command.Header.P1 = GETMSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 838 command.Header.P2 = GETLSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 839 /* build the I²C command */
giovannivisentini 0:969a2be49f41 840 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_DISABLEVERIFREQ, &command,
giovannivisentini 0:969a2be49f41 841 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 842
giovannivisentini 0:969a2be49f41 843 /* send the request */
giovannivisentini 0:969a2be49f41 844 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 845 /* The right access to be updated in EEPROM need at least 6ms */
giovannivisentini 0:969a2be49f41 846 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 847 /* read the response */
giovannivisentini 0:969a2be49f41 848 errchk(
giovannivisentini 0:969a2be49f41 849 M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 850
giovannivisentini 0:969a2be49f41 851 status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 852
giovannivisentini 0:969a2be49f41 853 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 854 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 855 else
giovannivisentini 0:969a2be49f41 856 return status;
giovannivisentini 0:969a2be49f41 857
giovannivisentini 0:969a2be49f41 858 }
giovannivisentini 0:969a2be49f41 859
giovannivisentini 0:969a2be49f41 860 /**
giovannivisentini 0:969a2be49f41 861 * @brief This function sends the EnablePermananentState command
giovannivisentini 9:9f2e2e68d695 862 * @param uReadOrWrite enable the read or write protection ( 0x0001 : Read or 0x0002 : Write )
giovannivisentini 9:9f2e2e68d695 863 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 864 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 865 */
giovannivisentini 0:969a2be49f41 866 NFC_StatusTypeDef M24SR::M24SR_EnablePermanentState(uint16_t uReadOrWrite) {
giovannivisentini 0:969a2be49f41 867 C_APDU command;
giovannivisentini 0:969a2be49f41 868
giovannivisentini 0:969a2be49f41 869 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 870 NFC_StatusTypeDef status = NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 871 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 872
giovannivisentini 0:969a2be49f41 873 /*check the parameters */
giovannivisentini 0:969a2be49f41 874 if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) {
giovannivisentini 0:969a2be49f41 875 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 876 }
giovannivisentini 0:969a2be49f41 877
giovannivisentini 0:969a2be49f41 878 /* build the command */
giovannivisentini 0:969a2be49f41 879 command.Header.CLA = C_APDU_CLA_ST;
giovannivisentini 0:969a2be49f41 880 command.Header.INS = C_APDU_ENABLE;
giovannivisentini 0:969a2be49f41 881 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 882 command.Header.P1 = GETMSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 883 command.Header.P2 = GETLSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 884 /* build the I²C command */
giovannivisentini 0:969a2be49f41 885 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_ENABLEVERIFREQ, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 886 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 887
giovannivisentini 0:969a2be49f41 888 /* send the request */
giovannivisentini 0:969a2be49f41 889 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 890 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 891 /* read the response */
giovannivisentini 0:969a2be49f41 892 errchk(
giovannivisentini 0:969a2be49f41 893 M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 894
giovannivisentini 0:969a2be49f41 895 status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 896 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 897 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 898 else
giovannivisentini 0:969a2be49f41 899 return status;
giovannivisentini 0:969a2be49f41 900 }
giovannivisentini 0:969a2be49f41 901
giovannivisentini 0:969a2be49f41 902 /**
giovannivisentini 0:969a2be49f41 903 * @brief This function sends the DisablePermanentState command
giovannivisentini 9:9f2e2e68d695 904 * @param uReadOrWrite enable the read or write protection ( 0x0001 : Read or 0x0002 : Write )
giovannivisentini 9:9f2e2e68d695 905 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 906 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 907 */
giovannivisentini 0:969a2be49f41 908 NFC_StatusTypeDef M24SR::M24SR_DisablePermanentState(uint16_t uReadOrWrite) {
giovannivisentini 0:969a2be49f41 909 C_APDU command;
giovannivisentini 0:969a2be49f41 910
giovannivisentini 0:969a2be49f41 911 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 912 NFC_StatusTypeDef status = NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 913 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 914
giovannivisentini 0:969a2be49f41 915 /*check the parameters */
giovannivisentini 0:969a2be49f41 916 if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) {
giovannivisentini 0:969a2be49f41 917 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 918 }
giovannivisentini 0:969a2be49f41 919
giovannivisentini 0:969a2be49f41 920 /* build the command */
giovannivisentini 0:969a2be49f41 921 command.Header.CLA = C_APDU_CLA_ST;
giovannivisentini 0:969a2be49f41 922 command.Header.INS = C_APDU_DISABLE;
giovannivisentini 0:969a2be49f41 923 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 924 command.Header.P1 = GETMSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 925 command.Header.P2 = GETLSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 926 /* build the I²C command */
giovannivisentini 0:969a2be49f41 927 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_DISABLEVERIFREQ, &command,
giovannivisentini 0:969a2be49f41 928 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 929
giovannivisentini 0:969a2be49f41 930 /* send the request */
giovannivisentini 0:969a2be49f41 931 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 932 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 933 /* read the response */
giovannivisentini 0:969a2be49f41 934 errchk(
giovannivisentini 0:969a2be49f41 935 M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 936
giovannivisentini 0:969a2be49f41 937 status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 938
giovannivisentini 0:969a2be49f41 939 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 940 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 941 else
giovannivisentini 0:969a2be49f41 942 return status;
giovannivisentini 0:969a2be49f41 943 }
giovannivisentini 0:969a2be49f41 944
giovannivisentini 0:969a2be49f41 945 /**
giovannivisentini 9:9f2e2e68d695 946 * @brief This function generates an interrupt on GPO pin
giovannivisentini 0:969a2be49f41 947 * @param None
giovannivisentini 9:9f2e2e68d695 948 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 949 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 950 */
giovannivisentini 0:969a2be49f41 951 NFC_StatusTypeDef M24SR::M24SR_SendInterrupt(void) {
giovannivisentini 0:969a2be49f41 952 C_APDU command;
giovannivisentini 0:969a2be49f41 953
giovannivisentini 0:969a2be49f41 954 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 955 uint16_t uP1P2 = 0x001E;
giovannivisentini 0:969a2be49f41 956 NFC_StatusTypeDef status = NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 957 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 958
giovannivisentini 0:969a2be49f41 959 status = M24SR_ManageI2CGPO(INTERRUPT);
giovannivisentini 0:969a2be49f41 960
giovannivisentini 0:969a2be49f41 961 /* build the command */
giovannivisentini 0:969a2be49f41 962 command.Header.CLA = C_APDU_CLA_ST;
giovannivisentini 0:969a2be49f41 963 command.Header.INS = C_APDU_INTERRUPT;
giovannivisentini 0:969a2be49f41 964 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 965 command.Header.P1 = GETMSB(uP1P2);
giovannivisentini 0:969a2be49f41 966 command.Header.P2 = GETLSB(uP1P2);
giovannivisentini 0:969a2be49f41 967 command.Body.LC = 0x00;
giovannivisentini 0:969a2be49f41 968 /* build the I²C command */
giovannivisentini 0:969a2be49f41 969 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SENDINTERRUPT, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 970 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 971
giovannivisentini 0:969a2be49f41 972 /* send the request */
giovannivisentini 0:969a2be49f41 973 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 974 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 975 /* read the response */
giovannivisentini 0:969a2be49f41 976 errchk(
giovannivisentini 0:969a2be49f41 977 M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 978
giovannivisentini 0:969a2be49f41 979 status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 980
giovannivisentini 0:969a2be49f41 981 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 982 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 983 else
giovannivisentini 0:969a2be49f41 984 return status;
giovannivisentini 0:969a2be49f41 985
giovannivisentini 0:969a2be49f41 986 }
giovannivisentini 0:969a2be49f41 987
giovannivisentini 0:969a2be49f41 988 /**
giovannivisentini 9:9f2e2e68d695 989 * @brief This function forces GPO pin to low state or high Z
giovannivisentini 9:9f2e2e68d695 990 * @param uSetOrReset select if GPO must be low (reset) or HiZ
giovannivisentini 9:9f2e2e68d695 991 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 992 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 993 */
giovannivisentini 0:969a2be49f41 994 NFC_StatusTypeDef M24SR::M24SR_StateControl(uint8_t uSetOrReset) {
giovannivisentini 0:969a2be49f41 995 C_APDU command;
giovannivisentini 0:969a2be49f41 996 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 997 uint16_t uP1P2 = 0x001F;
giovannivisentini 0:969a2be49f41 998 NFC_StatusTypeDef status = NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 999 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 1000
giovannivisentini 0:969a2be49f41 1001 /*check the parameters */
giovannivisentini 0:969a2be49f41 1002 if ((uSetOrReset != 0x01) && (uSetOrReset != 0x00)) {
giovannivisentini 0:969a2be49f41 1003 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1004 }
giovannivisentini 0:969a2be49f41 1005
giovannivisentini 0:969a2be49f41 1006 status = M24SR_ManageI2CGPO(STATE_CONTROL);
giovannivisentini 0:969a2be49f41 1007
giovannivisentini 0:969a2be49f41 1008 /* build the command */
giovannivisentini 0:969a2be49f41 1009 command.Header.CLA = C_APDU_CLA_ST;
giovannivisentini 0:969a2be49f41 1010 command.Header.INS = C_APDU_INTERRUPT;
giovannivisentini 0:969a2be49f41 1011 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 1012 command.Header.P1 = GETMSB(uP1P2);
giovannivisentini 0:969a2be49f41 1013 command.Header.P2 = GETLSB(uP1P2);
giovannivisentini 0:969a2be49f41 1014 command.Body.LC = 0x01;
giovannivisentini 0:969a2be49f41 1015 command.Body.pData = &uSetOrReset;
giovannivisentini 0:969a2be49f41 1016 /* copy the data */
giovannivisentini 0:969a2be49f41 1017 //memcpy(command.Body.pData , &uSetOrReset, 0x01 );
giovannivisentini 0:969a2be49f41 1018 //command.Body.LE = 0x00 ;
giovannivisentini 0:969a2be49f41 1019 /* build the I²C command */
giovannivisentini 0:969a2be49f41 1020 M24SR_BuildIBlockCommand( M24SR_CMDSTRUCT_GPOSTATE, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 1021 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 1022
giovannivisentini 0:969a2be49f41 1023 /* send the request */
giovannivisentini 0:969a2be49f41 1024 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 1025 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 1026 /* read the response */
giovannivisentini 0:969a2be49f41 1027 errchk(
giovannivisentini 0:969a2be49f41 1028 M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 1029
giovannivisentini 0:969a2be49f41 1030 status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 1031
giovannivisentini 0:969a2be49f41 1032 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 1033 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1034 else
giovannivisentini 0:969a2be49f41 1035 return status;
giovannivisentini 0:969a2be49f41 1036 }
giovannivisentini 0:969a2be49f41 1037
giovannivisentini 7:19fc04b8fec6 1038
giovannivisentini 0:969a2be49f41 1039 NFC_StatusTypeDef M24SR::M24SR_ManageI2CGPO(M24SR_GPO_MGMT GPO_I2Cconfig) {
giovannivisentini 0:969a2be49f41 1040 uint8_t GPO_config = 0;
giovannivisentini 0:969a2be49f41 1041
giovannivisentini 0:969a2be49f41 1042 if (GPO_I2Cconfig > STATE_CONTROL) {
giovannivisentini 0:969a2be49f41 1043 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1044 }
giovannivisentini 0:969a2be49f41 1045
giovannivisentini 0:969a2be49f41 1046 /* we must not be in interrupt mode for I2C synchro as we will change GPO purpose */
giovannivisentini 0:969a2be49f41 1047 M24SR_IO_SetI2CSynchroMode(M24SR_WAITINGTIME_POLLING);
giovannivisentini 0:969a2be49f41 1048
giovannivisentini 0:969a2be49f41 1049 errchk(M24SR_SelectApplication());
giovannivisentini 0:969a2be49f41 1050
giovannivisentini 0:969a2be49f41 1051 errchk(M24SR_SelectSystemfile());
giovannivisentini 0:969a2be49f41 1052
giovannivisentini 0:969a2be49f41 1053 errchk(M24SR_ReadBinary(0x0004, 0x01, &GPO_config))
giovannivisentini 0:969a2be49f41 1054
giovannivisentini 0:969a2be49f41 1055 /* Update only GPO purpose for I2C */
giovannivisentini 0:969a2be49f41 1056 GPO_config = (GPO_config & 0xF0) | GPO_I2Cconfig;
giovannivisentini 0:969a2be49f41 1057
giovannivisentini 0:969a2be49f41 1058 errchk(M24SR_Verify(I2C_PWD, 0x10, DEFAULT_PASSWORD));
giovannivisentini 0:969a2be49f41 1059
giovannivisentini 0:969a2be49f41 1060 errchk(M24SR_UpdateBinary(0x0004, 0x01, &(GPO_config)));
giovannivisentini 0:969a2be49f41 1061
giovannivisentini 0:969a2be49f41 1062 /* if we have set interrupt mode for I2C synchro we can enable interrupt mode */
giovannivisentini 0:969a2be49f41 1063 if (GPO_I2Cconfig == I2C_ANSWER_READY)
giovannivisentini 0:969a2be49f41 1064 M24SR_IO_SetI2CSynchroMode(M24SR_INTERRUPT_GPO);
giovannivisentini 0:969a2be49f41 1065
giovannivisentini 0:969a2be49f41 1066 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1067 }
giovannivisentini 0:969a2be49f41 1068
giovannivisentini 0:969a2be49f41 1069 NFC_StatusTypeDef M24SR::M24SR_ManageRFGPO(M24SR_GPO_MGMT GPO_RFconfig) {
giovannivisentini 0:969a2be49f41 1070 uint8_t GPO_config;
giovannivisentini 0:969a2be49f41 1071
giovannivisentini 0:969a2be49f41 1072 if (GPO_RFconfig > STATE_CONTROL) {
giovannivisentini 0:969a2be49f41 1073 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1074 }
giovannivisentini 0:969a2be49f41 1075
giovannivisentini 0:969a2be49f41 1076 errchk(M24SR_SelectApplication())
giovannivisentini 0:969a2be49f41 1077 errchk(M24SR_SelectSystemfile())
giovannivisentini 0:969a2be49f41 1078 errchk(M24SR_ReadBinary(0x0004, 0x01, &GPO_config))
giovannivisentini 0:969a2be49f41 1079
giovannivisentini 0:969a2be49f41 1080 /* Update only GPO purpose for I2C */
giovannivisentini 0:969a2be49f41 1081 GPO_config = (GPO_config & 0x0F) | (GPO_RFconfig << 4);
giovannivisentini 0:969a2be49f41 1082
giovannivisentini 0:969a2be49f41 1083 errchk(M24SR_SelectSystemfile())
giovannivisentini 0:969a2be49f41 1084 errchk(M24SR_Verify(I2C_PWD, 0x10, DEFAULT_PASSWORD))
giovannivisentini 0:969a2be49f41 1085 errchk(M24SR_UpdateBinary(0x0004, 0x01, &(GPO_config)))
giovannivisentini 0:969a2be49f41 1086
giovannivisentini 0:969a2be49f41 1087 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1088 }
giovannivisentini 0:969a2be49f41 1089
giovannivisentini 0:969a2be49f41 1090 NFC_StatusTypeDef M24SR::M24SR_RFConfig(uint8_t OnOffChoice) {
giovannivisentini 0:969a2be49f41 1091 /* Disable RF */
giovannivisentini 0:969a2be49f41 1092 if (OnOffChoice != 0) {
giovannivisentini 0:969a2be49f41 1093 M24SR_IO_RFDIS_WritePin(GPIO_PIN_RESET);
giovannivisentini 0:969a2be49f41 1094 } else {
giovannivisentini 0:969a2be49f41 1095 M24SR_IO_RFDIS_WritePin(GPIO_PIN_SET);
giovannivisentini 0:969a2be49f41 1096 }
giovannivisentini 0:969a2be49f41 1097 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1098 }
giovannivisentini 0:969a2be49f41 1099
giovannivisentini 0:969a2be49f41 1100 NFC_StatusTypeDef M24SR::M24SR_IO_SendI2Ccommand(uint8_t NbByte,
giovannivisentini 0:969a2be49f41 1101 uint8_t *pBuffer) {
giovannivisentini 10:482175f7ae66 1102 int ret = dev_I2C.write(address, (char*) pBuffer, NbByte);
giovannivisentini 0:969a2be49f41 1103 if (ret == 0)
giovannivisentini 0:969a2be49f41 1104 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1105 return NFC_IO_ERROR_I2CTIMEOUT;
giovannivisentini 0:969a2be49f41 1106 }
giovannivisentini 0:969a2be49f41 1107
giovannivisentini 0:969a2be49f41 1108 NFC_StatusTypeDef M24SR::M24SR_IO_ReceiveI2Cresponse(uint8_t NbByte,
giovannivisentini 0:969a2be49f41 1109 uint8_t *pBuffer) {
giovannivisentini 10:482175f7ae66 1110 int ret = dev_I2C.read(address, (char*) pBuffer, NbByte);
giovannivisentini 0:969a2be49f41 1111 if (ret == 0)
giovannivisentini 0:969a2be49f41 1112 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1113
giovannivisentini 0:969a2be49f41 1114 return NFC_IO_ERROR_I2CTIMEOUT;
giovannivisentini 0:969a2be49f41 1115 }
giovannivisentini 0:969a2be49f41 1116
giovannivisentini 0:969a2be49f41 1117 #define M24SR_POLL_DELAY 10
giovannivisentini 7:19fc04b8fec6 1118 /* In case M24SR will reply ACK failed allow to perform retry before returning error (HAL option not used) */
giovannivisentini 16:b0d62f4b185a 1119 #define M24SR_I2C_POLLING 2000
giovannivisentini 0:969a2be49f41 1120
giovannivisentini 0:969a2be49f41 1121 NFC_StatusTypeDef M24SR::M24SR_IO_PollI2C(void) {
giovannivisentini 0:969a2be49f41 1122
giovannivisentini 0:969a2be49f41 1123 int status = 1;
giovannivisentini 0:969a2be49f41 1124 uint32_t nbTry = 0;
giovannivisentini 0:969a2be49f41 1125 char buffer;
giovannivisentini 0:969a2be49f41 1126 //
giovannivisentini 0:969a2be49f41 1127 wait_ms(M24SR_POLL_DELAY);
giovannivisentini 0:969a2be49f41 1128 while (status != 0 && nbTry < M24SR_I2C_POLLING) {
giovannivisentini 10:482175f7ae66 1129 status = dev_I2C.read(address, &buffer, 1, false);
giovannivisentini 0:969a2be49f41 1130 nbTry++;
giovannivisentini 0:969a2be49f41 1131 }
giovannivisentini 0:969a2be49f41 1132
giovannivisentini 0:969a2be49f41 1133 if (status == 0)
giovannivisentini 0:969a2be49f41 1134 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1135 //else
giovannivisentini 0:969a2be49f41 1136 return NFC_IO_ERROR_I2CTIMEOUT;
giovannivisentini 0:969a2be49f41 1137 }
giovannivisentini 0:969a2be49f41 1138
giovannivisentini 0:969a2be49f41 1139 NFC_StatusTypeDef M24SR::M24SR_IO_IsAnswerReady(void) {
giovannivisentini 0:969a2be49f41 1140 uint32_t retry = 0xFFFFF;
giovannivisentini 0:969a2be49f41 1141 int8_t stable = 0;
giovannivisentini 13:840a9c7f90b9 1142 uint8_t PinState;
giovannivisentini 16:b0d62f4b185a 1143
giovannivisentini 0:969a2be49f41 1144 switch (syncMode) {
giovannivisentini 0:969a2be49f41 1145 case M24SR_WAITINGTIME_POLLING:
giovannivisentini 0:969a2be49f41 1146 return M24SR_IO_PollI2C();
giovannivisentini 0:969a2be49f41 1147
giovannivisentini 0:969a2be49f41 1148 case M24SR_WAITINGTIME_TIMEOUT:
giovannivisentini 0:969a2be49f41 1149 // M24SR FWI=5 => (256*16/fc)*2^5=9.6ms but M24SR ask for extended time to program up to 246Bytes.
giovannivisentini 0:969a2be49f41 1150 // can be improved by
giovannivisentini 0:969a2be49f41 1151 wait_ms(80);
giovannivisentini 0:969a2be49f41 1152 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1153
giovannivisentini 0:969a2be49f41 1154 case M24SR_WAITINGTIME_GPO:
giovannivisentini 0:969a2be49f41 1155 do {
giovannivisentini 0:969a2be49f41 1156 M24SR_IO_GPO_ReadPin(&PinState);
giovannivisentini 0:969a2be49f41 1157 if (PinState == GPIO_PIN_RESET) {
giovannivisentini 0:969a2be49f41 1158 stable++;
giovannivisentini 0:969a2be49f41 1159 }
giovannivisentini 0:969a2be49f41 1160 retry--;
giovannivisentini 0:969a2be49f41 1161 } while (stable < 5 && retry > 0);
giovannivisentini 0:969a2be49f41 1162 if (!retry)
giovannivisentini 0:969a2be49f41 1163 goto Error;
giovannivisentini 0:969a2be49f41 1164 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1165
giovannivisentini 0:969a2be49f41 1166 case M24SR_INTERRUPT_GPO:
giovannivisentini 0:969a2be49f41 1167
giovannivisentini 0:969a2be49f41 1168 /* Check if the GPIO is not already low before calling this function */
giovannivisentini 0:969a2be49f41 1169 M24SR_IO_GPO_ReadPin(&PinState);
giovannivisentini 16:b0d62f4b185a 1170
giovannivisentini 0:969a2be49f41 1171 if (PinState == GPIO_PIN_SET) {
giovannivisentini 16:b0d62f4b185a 1172 //prepare and set the inpterrupt
giovannivisentini 16:b0d62f4b185a 1173 interruptIsFired = false;
giovannivisentini 16:b0d62f4b185a 1174 answerReadyInterrupt.enable_irq();
giovannivisentini 16:b0d62f4b185a 1175 while (PinState == GPIO_PIN_SET ){
giovannivisentini 0:969a2be49f41 1176 __WFE();
giovannivisentini 16:b0d62f4b185a 1177 //if we weake up for our interrupt, update the gpo state
giovannivisentini 16:b0d62f4b185a 1178 if(interruptIsFired)
giovannivisentini 16:b0d62f4b185a 1179 M24SR_IO_GPO_ReadPin(&PinState);
giovannivisentini 16:b0d62f4b185a 1180 }//while
giovannivisentini 16:b0d62f4b185a 1181 //disable the interrupt
giovannivisentini 16:b0d62f4b185a 1182 answerReadyInterrupt.disable_irq();
giovannivisentini 16:b0d62f4b185a 1183 }//if
giovannivisentini 16:b0d62f4b185a 1184
giovannivisentini 0:969a2be49f41 1185 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1186
giovannivisentini 0:969a2be49f41 1187 default:
giovannivisentini 0:969a2be49f41 1188 return NFC_IO_ERROR_I2CTIMEOUT;
giovannivisentini 0:969a2be49f41 1189 }
giovannivisentini 0:969a2be49f41 1190
giovannivisentini 0:969a2be49f41 1191 Error: return NFC_IO_ERROR_I2CTIMEOUT;
giovannivisentini 0:969a2be49f41 1192 }
giovannivisentini 0:969a2be49f41 1193
giovannivisentini 6:96389fb79676 1194 ////////////////////////hight level utility function //////////////////////////
giovannivisentini 6:96389fb79676 1195
giovannivisentini 6:96389fb79676 1196 NFC_StatusTypeDef M24SR::enableReadPassword(const uint8_t* pCurrentWritePassword,
giovannivisentini 6:96389fb79676 1197 const uint8_t* pNewPassword) {
giovannivisentini 6:96389fb79676 1198 errchk(Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword));
giovannivisentini 6:96389fb79676 1199 /* Set new password */
giovannivisentini 6:96389fb79676 1200 errchk(ChangeReferenceData(M24SR::ReadPwd, pNewPassword));
giovannivisentini 6:96389fb79676 1201 return EnableVerificationRequirement(M24SR::ReadPwd);
giovannivisentini 6:96389fb79676 1202 }
giovannivisentini 6:96389fb79676 1203
giovannivisentini 6:96389fb79676 1204 NFC_StatusTypeDef M24SR::disableReadPassword(const uint8_t* pCurrentWritePassword) {
giovannivisentini 6:96389fb79676 1205 errchk(Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword));
giovannivisentini 6:96389fb79676 1206 return DisableVerificationRequirement(M24SR::ReadPwd);
giovannivisentini 6:96389fb79676 1207 }
giovannivisentini 6:96389fb79676 1208
giovannivisentini 6:96389fb79676 1209 NFC_StatusTypeDef M24SR::enableWritePassword(const uint8_t* pCurrentWritePassword,
giovannivisentini 6:96389fb79676 1210 uint8_t* pNewPassword) {
giovannivisentini 6:96389fb79676 1211 /* check we have the good password */
giovannivisentini 6:96389fb79676 1212 errchk(Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword));
giovannivisentini 6:96389fb79676 1213 /* Set new password */
giovannivisentini 6:96389fb79676 1214 errchk(ChangeReferenceData(M24SR::WritePwd, pNewPassword));
giovannivisentini 6:96389fb79676 1215 return EnableVerificationRequirement(M24SR::WritePwd);
giovannivisentini 6:96389fb79676 1216 }
giovannivisentini 6:96389fb79676 1217
giovannivisentini 6:96389fb79676 1218 NFC_StatusTypeDef M24SR::disableWritePassword(const uint8_t* pCurrentWritePassword) {
giovannivisentini 6:96389fb79676 1219 errchk(Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword));
giovannivisentini 6:96389fb79676 1220 return(DisableVerificationRequirement(M24SR::WritePwd));
giovannivisentini 6:96389fb79676 1221 }
giovannivisentini 6:96389fb79676 1222
giovannivisentini 6:96389fb79676 1223 NFC_StatusTypeDef M24SR::disableAllPassword(const uint8_t* pSuperUserPassword){
giovannivisentini 6:96389fb79676 1224 errchk(Verify(M24SR::I2CPwd, 0x10, pSuperUserPassword));
giovannivisentini 6:96389fb79676 1225
giovannivisentini 6:96389fb79676 1226 errchk(DisablePermanentState(M24SR::ReadPwd));
giovannivisentini 6:96389fb79676 1227 errchk(DisablePermanentState(M24SR::WritePwd));
giovannivisentini 6:96389fb79676 1228
giovannivisentini 6:96389fb79676 1229 errchk(DisableVerificationRequirement(M24SR::ReadPwd));
giovannivisentini 6:96389fb79676 1230 errchk(DisableVerificationRequirement(M24SR::WritePwd));
giovannivisentini 6:96389fb79676 1231
giovannivisentini 6:96389fb79676 1232 /* reset password */
giovannivisentini 6:96389fb79676 1233 errchk(ChangeReferenceData(M24SR::ReadPwd, M24SR::DEFAULT_PASSWORD));
giovannivisentini 6:96389fb79676 1234 return(ChangeReferenceData(M24SR::WritePwd, M24SR::DEFAULT_PASSWORD));
giovannivisentini 6:96389fb79676 1235 }
giovannivisentini 6:96389fb79676 1236
giovannivisentini 6:96389fb79676 1237 NFC_StatusTypeDef M24SR::enableReadOnly(const uint8_t* pCurrentWritePassword){
giovannivisentini 6:96389fb79676 1238
giovannivisentini 6:96389fb79676 1239 errchk(Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword));
giovannivisentini 6:96389fb79676 1240 /* lock write to have read only */
giovannivisentini 6:96389fb79676 1241 return EnablePermanentState(M24SR::WritePwd);
giovannivisentini 6:96389fb79676 1242 }
giovannivisentini 6:96389fb79676 1243
giovannivisentini 6:96389fb79676 1244 NFC_StatusTypeDef M24SR::disableReadOnly() {
giovannivisentini 6:96389fb79676 1245
giovannivisentini 6:96389fb79676 1246 errchk(Verify(M24SR::I2CPwd, 0x10, M24SR::DEFAULT_PASSWORD));
giovannivisentini 6:96389fb79676 1247 /* disable write protection to disable read only mode */
giovannivisentini 6:96389fb79676 1248 errchk(DisablePermanentState(M24SR::WritePwd));
giovannivisentini 6:96389fb79676 1249 return(DisableVerificationRequirement(M24SR::WritePwd));
giovannivisentini 6:96389fb79676 1250 }
giovannivisentini 6:96389fb79676 1251
giovannivisentini 6:96389fb79676 1252
giovannivisentini 6:96389fb79676 1253 NFC_StatusTypeDef M24SR::enableWriteOnly(const uint8_t* pCurrentWritePassword) {
giovannivisentini 6:96389fb79676 1254
giovannivisentini 6:96389fb79676 1255 errchk(Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword));
giovannivisentini 6:96389fb79676 1256 /* disable read access and keep write */
giovannivisentini 6:96389fb79676 1257 return(EnablePermanentState(M24SR::ReadPwd));
giovannivisentini 6:96389fb79676 1258
giovannivisentini 6:96389fb79676 1259 }
giovannivisentini 6:96389fb79676 1260
giovannivisentini 6:96389fb79676 1261 NFC_StatusTypeDef M24SR::disableWriteOnly() {
giovannivisentini 6:96389fb79676 1262
giovannivisentini 6:96389fb79676 1263 errchk(Verify(M24SR::I2CPwd, 0x10, M24SR::DEFAULT_PASSWORD));
giovannivisentini 6:96389fb79676 1264 /* disable write only -> enable write acces */
giovannivisentini 6:96389fb79676 1265 errchk(DisablePermanentState(M24SR::ReadPwd))
giovannivisentini 6:96389fb79676 1266 return DisableVerificationRequirement(M24SR::ReadPwd);
giovannivisentini 6:96389fb79676 1267 }
giovannivisentini 6:96389fb79676 1268
giovannivisentini 0:969a2be49f41 1269 /******************* (C) COPYRIGHT 2013 STMicroelectronics *****END OF FILE****/