This application provides a set of demos with X-NUCLEO-NFC01A1 expansion board.

Dependencies:   NDefLib X_NUCLEO_NFC01A1 mbed

Fork of X-MBED-NFC1 by Giovanni Visentini

This application provides a set of demos with X-NUCLEO-NFC01A1 expansion board.

The available demos are:

  • SAMPLE_WRITE_URL: write a tag with the ST home page URL
  • SAMPLE_COUNT_CLICK: create a custom tag to count and report the user button clicks.
  • SAMPLE_WRITE_AND_CHANGE_ALL: write a tag with all the supported records and update the tag contents when the user button is pressed.
  • SAMPLE_LOCK_TAG_CONTENT: use the M24SR component API to set the NFC tag as read-only.

To enable the different demos comment/uncomment the SAMPLE_* macros provided in main.cpp .

Committer:
giovannivisentini
Date:
Tue Dec 01 08:30:54 2015 +0000
Revision:
2:0648c1561eb2
Parent:
1:6d202b62ed68
change the tag content when the user press the button

Who changed what in which revision?

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