ST / X_NUCLEO_NFC01A1

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 Dec 22 08:23:54 2015 +0000
Revision:
4:cb1b4304a93e
Parent:
1:15d4a123ef6b
Child:
6:96389fb79676
add static to utility function

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