X_NUCLEO_NFC02A1 library for M24LR

Dependencies:   ST_INTERFACES

Dependents:   HelloWorld_NFC02A1_mbedOS HelloWorld_NFC02A1laatste HelloWorld_NFC02A1

Fork of X_NUCLEO_NFC02A1 by ST Expansion SW Team

X-NUCLEO-NFC02A1 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-NFC02A1 Dynamic NFC Tag Expansion Board based on M24LR.

Firmware Library

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

Example application

Hello World is a simple application to program and read an URI from the NFC tag.

Committer:
rosarium
Date:
Wed Sep 28 11:30:09 2016 +0000
Revision:
0:71bff5ad0a49
X_NUCLEO_NFC02A1 converted as an library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rosarium 0:71bff5ad0a49 1 /**
rosarium 0:71bff5ad0a49 2 ******************************************************************************
rosarium 0:71bff5ad0a49 3 * @file m24lr.cpp
rosarium 0:71bff5ad0a49 4 * @author AMG Central Lab
rosarium 0:71bff5ad0a49 5 * @version V1.0.0
rosarium 0:71bff5ad0a49 6 * @date 30 Aug 2016
rosarium 0:71bff5ad0a49 7 * @brief M24LR driver file.
rosarium 0:71bff5ad0a49 8 ******************************************************************************
rosarium 0:71bff5ad0a49 9 * @attention
rosarium 0:71bff5ad0a49 10 *
rosarium 0:71bff5ad0a49 11 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
rosarium 0:71bff5ad0a49 12 *
rosarium 0:71bff5ad0a49 13 * Redistribution and use in source and binary forms, with or without modification,
rosarium 0:71bff5ad0a49 14 * are permitted provided that the following conditions are met:
rosarium 0:71bff5ad0a49 15 * 1. Redistributions of source code must retain the above copyright notice,
rosarium 0:71bff5ad0a49 16 * this list of conditions and the following disclaimer.
rosarium 0:71bff5ad0a49 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
rosarium 0:71bff5ad0a49 18 * this list of conditions and the following disclaimer in the documentation
rosarium 0:71bff5ad0a49 19 * and/or other materials provided with the distribution.
rosarium 0:71bff5ad0a49 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
rosarium 0:71bff5ad0a49 21 * may be used to endorse or promote products derived from this software
rosarium 0:71bff5ad0a49 22 * without specific prior written permission.
rosarium 0:71bff5ad0a49 23 *
rosarium 0:71bff5ad0a49 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
rosarium 0:71bff5ad0a49 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
rosarium 0:71bff5ad0a49 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
rosarium 0:71bff5ad0a49 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
rosarium 0:71bff5ad0a49 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
rosarium 0:71bff5ad0a49 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
rosarium 0:71bff5ad0a49 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
rosarium 0:71bff5ad0a49 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
rosarium 0:71bff5ad0a49 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
rosarium 0:71bff5ad0a49 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
rosarium 0:71bff5ad0a49 34 *
rosarium 0:71bff5ad0a49 35 ******************************************************************************
rosarium 0:71bff5ad0a49 36 */
rosarium 0:71bff5ad0a49 37
rosarium 0:71bff5ad0a49 38
rosarium 0:71bff5ad0a49 39
rosarium 0:71bff5ad0a49 40 #include "m24lr.h"
rosarium 0:71bff5ad0a49 41
rosarium 0:71bff5ad0a49 42 uint8_t M24LR::NfctagInitialized = 0;
rosarium 0:71bff5ad0a49 43
rosarium 0:71bff5ad0a49 44
rosarium 0:71bff5ad0a49 45 /**
rosarium 0:71bff5ad0a49 46 * @brief This function activate Energy Harvesting mode
rosarium 0:71bff5ad0a49 47 */
rosarium 0:71bff5ad0a49 48 void M24LR::Enable_EnergyHarvesting( void )
rosarium 0:71bff5ad0a49 49 {
rosarium 0:71bff5ad0a49 50 /* Initialise M24LR Board */
rosarium 0:71bff5ad0a49 51
rosarium 0:71bff5ad0a49 52 /* Enable Energy Harvesting */
rosarium 0:71bff5ad0a49 53 i2c_SetEH( );
rosarium 0:71bff5ad0a49 54
rosarium 0:71bff5ad0a49 55 /* Store configuration in non Volatile Memory */
rosarium 0:71bff5ad0a49 56 i2c_Enable_EH_mode();
rosarium 0:71bff5ad0a49 57 i2c_WriteEH_Cfg( M24LR_EH_Cfg_6MA );
rosarium 0:71bff5ad0a49 58
rosarium 0:71bff5ad0a49 59 }
rosarium 0:71bff5ad0a49 60 /**
rosarium 0:71bff5ad0a49 61 * @brief Set M24LR nfctag Initialization
rosarium 0:71bff5ad0a49 62 * @param None
rosarium 0:71bff5ad0a49 63 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 64 */
rosarium 0:71bff5ad0a49 65 NFCTAG_StatusTypeDef M24LR::Initialization( void )
rosarium 0:71bff5ad0a49 66 {
rosarium 0:71bff5ad0a49 67 uint8_t nfctag_id = 0;
rosarium 0:71bff5ad0a49 68
rosarium 0:71bff5ad0a49 69 if( NfctagInitialized == 0 )
rosarium 0:71bff5ad0a49 70 {
rosarium 0:71bff5ad0a49 71
rosarium 0:71bff5ad0a49 72 /* M24LR Init */
rosarium 0:71bff5ad0a49 73 if( i2c_Init() != NFCTAG_OK )
rosarium 0:71bff5ad0a49 74 {
rosarium 0:71bff5ad0a49 75 return NFCTAG_ERROR;
rosarium 0:71bff5ad0a49 76 }
rosarium 0:71bff5ad0a49 77
rosarium 0:71bff5ad0a49 78 /* Check M24LR driver ID */
rosarium 0:71bff5ad0a49 79 i2c_ReadID(&nfctag_id);
rosarium 0:71bff5ad0a49 80 if( (nfctag_id == I_AM_M24LR04) || (nfctag_id == I_AM_M24LR16) || (nfctag_id == I_AM_M24LR64) )
rosarium 0:71bff5ad0a49 81 {
rosarium 0:71bff5ad0a49 82 NfctagInitialized = 1;
rosarium 0:71bff5ad0a49 83 // Nfctag_Drv = &M24lr_i2c_Drv;
rosarium 0:71bff5ad0a49 84 // Nfctag_Drv->pData = &M24lr_i2c_ExtDrv;
rosarium 0:71bff5ad0a49 85 }
rosarium 0:71bff5ad0a49 86 else
rosarium 0:71bff5ad0a49 87 {
rosarium 0:71bff5ad0a49 88 NfctagInitialized = 0;
rosarium 0:71bff5ad0a49 89 // Nfctag_Drv = NULL;
rosarium 0:71bff5ad0a49 90 // NfctagInitialized = 0;
rosarium 0:71bff5ad0a49 91 return NFCTAG_ERROR;
rosarium 0:71bff5ad0a49 92 }
rosarium 0:71bff5ad0a49 93 }
rosarium 0:71bff5ad0a49 94
rosarium 0:71bff5ad0a49 95 return NFCTAG_OK;
rosarium 0:71bff5ad0a49 96 }
rosarium 0:71bff5ad0a49 97
rosarium 0:71bff5ad0a49 98 /**
rosarium 0:71bff5ad0a49 99 * @brief Set M24LR Initialization
rosarium 0:71bff5ad0a49 100 * @param None
rosarium 0:71bff5ad0a49 101 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 102 */
rosarium 0:71bff5ad0a49 103 NFCTAG_StatusTypeDef M24LR::i2c_Init( void )
rosarium 0:71bff5ad0a49 104 {
rosarium 0:71bff5ad0a49 105 /* Configure the low level interface */
rosarium 0:71bff5ad0a49 106 return(NFCTAG_OK);
rosarium 0:71bff5ad0a49 107 // return mM24LR_IO.Init( );
rosarium 0:71bff5ad0a49 108 }
rosarium 0:71bff5ad0a49 109
rosarium 0:71bff5ad0a49 110 /**
rosarium 0:71bff5ad0a49 111 * @brief Read M24LR ID
rosarium 0:71bff5ad0a49 112 * @param pICRef : pointer to store ID
rosarium 0:71bff5ad0a49 113 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 114 */
rosarium 0:71bff5ad0a49 115 NFCTAG_StatusTypeDef M24LR::i2c_ReadID( uint8_t * const pData )
rosarium 0:71bff5ad0a49 116 {
rosarium 0:71bff5ad0a49 117 uint8_t *pBuffer = (uint8_t *)pData;
rosarium 0:71bff5ad0a49 118 NFCTAG_StatusTypeDef status;
rosarium 0:71bff5ad0a49 119 /* Read ICRef on device */
rosarium 0:71bff5ad0a49 120 //return M24LR_i2c_ReadRegister( pICRef, M24LR_ICREF_REG, 1 );
rosarium 0:71bff5ad0a49 121 /* Before calling this function M24LR must be ready, here is a check to detect an issue */
rosarium 0:71bff5ad0a49 122 status = i2c_ReadRegister(pBuffer, M24LR_ICREF_REG, 1);
rosarium 0:71bff5ad0a49 123
rosarium 0:71bff5ad0a49 124 if (status == 0)
rosarium 0:71bff5ad0a49 125 return NFCTAG_OK;
rosarium 0:71bff5ad0a49 126 return NFCTAG_TIMEOUT;
rosarium 0:71bff5ad0a49 127
rosarium 0:71bff5ad0a49 128 }
rosarium 0:71bff5ad0a49 129
rosarium 0:71bff5ad0a49 130 /**
rosarium 0:71bff5ad0a49 131 * @brief Check M24LR availability
rosarium 0:71bff5ad0a49 132 * @param Trials : number of max tentative tried
rosarium 0:71bff5ad0a49 133 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 134 */
rosarium 0:71bff5ad0a49 135 NFCTAG_StatusTypeDef M24LR::i2c_IsDeviceReady( const uint32_t Trials )
rosarium 0:71bff5ad0a49 136 {
rosarium 0:71bff5ad0a49 137 /* Test i2c with M24LR */
rosarium 0:71bff5ad0a49 138 // return mM24LR_IO.IsDeviceReady( M24LR_ADDR_DATA_I2C, Trials );
rosarium 0:71bff5ad0a49 139 uint8_t status = 1;
rosarium 0:71bff5ad0a49 140 char buffer;
rosarium 0:71bff5ad0a49 141 while (status != 0) {
rosarium 0:71bff5ad0a49 142 /* for device is ready address in M24Lr is M24LR_ADDR_DATA_I2C */
rosarium 0:71bff5ad0a49 143 status = dev_I2C.read(i2c_address_data, &buffer, 1, false);
rosarium 0:71bff5ad0a49 144 }
rosarium 0:71bff5ad0a49 145 if ( status == 0 )
rosarium 0:71bff5ad0a49 146 return NFCTAG_OK;
rosarium 0:71bff5ad0a49 147 else
rosarium 0:71bff5ad0a49 148 return NFCTAG_TIMEOUT;
rosarium 0:71bff5ad0a49 149
rosarium 0:71bff5ad0a49 150 }
rosarium 0:71bff5ad0a49 151
rosarium 0:71bff5ad0a49 152 /**
rosarium 0:71bff5ad0a49 153 * @brief Configure M24LR GPO
rosarium 0:71bff5ad0a49 154 * @param ITConf : 0x01 = RFBUSY, 0x02 = RFWIP
rosarium 0:71bff5ad0a49 155 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 156 */
rosarium 0:71bff5ad0a49 157 NFCTAG_StatusTypeDef M24LR::i2c_ConfigureGPO( const uint16_t ITConf )
rosarium 0:71bff5ad0a49 158 {
rosarium 0:71bff5ad0a49 159 NFCTAG_StatusTypeDef status = NFCTAG_ERROR;
rosarium 0:71bff5ad0a49 160
rosarium 0:71bff5ad0a49 161 /* Configure GPO function on M24LR */
rosarium 0:71bff5ad0a49 162 if( (ITConf & M24LR_IT_BUSY_MASK) == M24LR_IT_BUSY_MASK )
rosarium 0:71bff5ad0a49 163 {
rosarium 0:71bff5ad0a49 164 status = i2c_SetRFBUSY( );
rosarium 0:71bff5ad0a49 165 }
rosarium 0:71bff5ad0a49 166 else if( (ITConf & M24LR_IT_WIP_MASK) == M24LR_IT_WIP_MASK )
rosarium 0:71bff5ad0a49 167 {
rosarium 0:71bff5ad0a49 168 status = i2c_SetRFWIP( );
rosarium 0:71bff5ad0a49 169 }
rosarium 0:71bff5ad0a49 170 return status;
rosarium 0:71bff5ad0a49 171 }
rosarium 0:71bff5ad0a49 172
rosarium 0:71bff5ad0a49 173 /**
rosarium 0:71bff5ad0a49 174 * @brief Configure GPO as RF WriteInProgress
rosarium 0:71bff5ad0a49 175 * @param None
rosarium 0:71bff5ad0a49 176 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 177 */
rosarium 0:71bff5ad0a49 178 NFCTAG_StatusTypeDef M24LR::i2c_SetRFWIP( void )
rosarium 0:71bff5ad0a49 179 {
rosarium 0:71bff5ad0a49 180 uint8_t reg_value;
rosarium 0:71bff5ad0a49 181 NFCTAG_StatusTypeDef status;
rosarium 0:71bff5ad0a49 182 status = i2c_ReadRegister(&reg_value, M24LR_CFG_REG, 1);
rosarium 0:71bff5ad0a49 183
rosarium 0:71bff5ad0a49 184
rosarium 0:71bff5ad0a49 185 if( status != NFCTAG_OK )
rosarium 0:71bff5ad0a49 186 {
rosarium 0:71bff5ad0a49 187 return status;
rosarium 0:71bff5ad0a49 188 }
rosarium 0:71bff5ad0a49 189
rosarium 0:71bff5ad0a49 190 /* Update register value for WIP configuration */
rosarium 0:71bff5ad0a49 191 reg_value |= M24LR_CFG_WIPBUSY_MASK;
rosarium 0:71bff5ad0a49 192
rosarium 0:71bff5ad0a49 193 /* Write CFG register */
rosarium 0:71bff5ad0a49 194 return i2c_WriteRegister( &reg_value, M24LR_CFG_REG, 1 );
rosarium 0:71bff5ad0a49 195 }
rosarium 0:71bff5ad0a49 196
rosarium 0:71bff5ad0a49 197
rosarium 0:71bff5ad0a49 198 /**
rosarium 0:71bff5ad0a49 199 * @brief Get Configuration of M24LR GPO
rosarium 0:71bff5ad0a49 200 * @param GPOStatus : 0x01 = RFBUSY, 0x02 = RFWIP
rosarium 0:71bff5ad0a49 201 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 202 */
rosarium 0:71bff5ad0a49 203 NFCTAG_StatusTypeDef M24LR::i2c_GetGPOStatus( uint16_t * const pGPOStatus )
rosarium 0:71bff5ad0a49 204 {
rosarium 0:71bff5ad0a49 205 uint8_t reg_value;
rosarium 0:71bff5ad0a49 206 NFCTAG_StatusTypeDef status;
rosarium 0:71bff5ad0a49 207
rosarium 0:71bff5ad0a49 208 /* Read actual value of CFG register */
rosarium 0:71bff5ad0a49 209 status = i2c_ReadRegister( &reg_value, M24LR_CFG_REG, 1 );
rosarium 0:71bff5ad0a49 210 if( status != NFCTAG_OK )
rosarium 0:71bff5ad0a49 211 {
rosarium 0:71bff5ad0a49 212 return status;
rosarium 0:71bff5ad0a49 213 }
rosarium 0:71bff5ad0a49 214
rosarium 0:71bff5ad0a49 215 /* Extract RF WIP/BUSY information */
rosarium 0:71bff5ad0a49 216 if( (reg_value & M24LR_CFG_WIPBUSY_MASK) == M24LR_CFG_WIPBUSY_MASK )
rosarium 0:71bff5ad0a49 217 {
rosarium 0:71bff5ad0a49 218 *pGPOStatus = M24LR_IT_WIP_MASK;
rosarium 0:71bff5ad0a49 219 }
rosarium 0:71bff5ad0a49 220 else
rosarium 0:71bff5ad0a49 221 {
rosarium 0:71bff5ad0a49 222 *pGPOStatus = M24LR_IT_BUSY_MASK;
rosarium 0:71bff5ad0a49 223 }
rosarium 0:71bff5ad0a49 224
rosarium 0:71bff5ad0a49 225 return NFCTAG_OK;
rosarium 0:71bff5ad0a49 226 }
rosarium 0:71bff5ad0a49 227
rosarium 0:71bff5ad0a49 228 /**
rosarium 0:71bff5ad0a49 229 * @brief Read N bytes starting from specified I2C address
rosarium 0:71bff5ad0a49 230 * @param pData : pointer of the data to store
rosarium 0:71bff5ad0a49 231 * @param TarAddr : I2C data memory address to read
rosarium 0:71bff5ad0a49 232 * @param NbByte : number of bytes to read
rosarium 0:71bff5ad0a49 233 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 234 */
rosarium 0:71bff5ad0a49 235 NFCTAG_StatusTypeDef M24LR::i2c_ReadData( uint8_t * const pData, const uint16_t TarAddr, const uint16_t NbByte )
rosarium 0:71bff5ad0a49 236 {
rosarium 0:71bff5ad0a49 237 int status;
rosarium 0:71bff5ad0a49 238 /* Before calling this function M24LR must be ready, here is a check to detect an issue */
rosarium 0:71bff5ad0a49 239 if( i2c_IsDeviceReady( 1 ) != NFCTAG_OK )
rosarium 0:71bff5ad0a49 240 {
rosarium 0:71bff5ad0a49 241 return NFCTAG_TIMEOUT;
rosarium 0:71bff5ad0a49 242 }
rosarium 0:71bff5ad0a49 243 /* Rosarium : To check M24LR_ADDR_DATA_I2C is this case */
rosarium 0:71bff5ad0a49 244 /* return M24lr_IO_MemRead( pData, M24LR_ADDR_DATA_I2C, TarAddr, NbByte ); */
rosarium 0:71bff5ad0a49 245 status = dev_I2C.i2c_read(pData, i2c_address_data, TarAddr, NbByte);
rosarium 0:71bff5ad0a49 246 if ( status == 0 )
rosarium 0:71bff5ad0a49 247 return NFCTAG_OK;
rosarium 0:71bff5ad0a49 248 else
rosarium 0:71bff5ad0a49 249 return NFCTAG_TIMEOUT;
rosarium 0:71bff5ad0a49 250 }
rosarium 0:71bff5ad0a49 251
rosarium 0:71bff5ad0a49 252 /**
rosarium 0:71bff5ad0a49 253 * @brief Write N data bytes starting from specified I2C Address
rosarium 0:71bff5ad0a49 254 * @brief if I2C_Write_Lock bit = 0 or I2C_Password present => ack (modification OK)
rosarium 0:71bff5ad0a49 255 * @brief if I2C_Write_Lock bit = 1 and no I2C_Password present => No ack (no modification)
rosarium 0:71bff5ad0a49 256 * @param pData : pointer of the data to write
rosarium 0:71bff5ad0a49 257 * @param TarAddr : I2C data memory address to write
rosarium 0:71bff5ad0a49 258 * @param NbByte : number of bytes to write
rosarium 0:71bff5ad0a49 259 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 260 */
rosarium 0:71bff5ad0a49 261 NFCTAG_StatusTypeDef M24LR::i2c_WriteData( const uint8_t * const pData, const uint16_t TarAddr, const uint16_t NbByte )
rosarium 0:71bff5ad0a49 262 {
rosarium 0:71bff5ad0a49 263 int status;
rosarium 0:71bff5ad0a49 264 uint8_t align_mem_offset;
rosarium 0:71bff5ad0a49 265 uint16_t bytes_to_write = NbByte;
rosarium 0:71bff5ad0a49 266 uint16_t mem_addr = TarAddr;
rosarium 0:71bff5ad0a49 267 uint8_t *pdata_index = (uint8_t *)pData;
rosarium 0:71bff5ad0a49 268
rosarium 0:71bff5ad0a49 269 /* Before calling this function M24LR must be ready, here is a check to detect an issue */
rosarium 0:71bff5ad0a49 270 if( i2c_IsDeviceReady( 1 ) != NFCTAG_OK )
rosarium 0:71bff5ad0a49 271 {
rosarium 0:71bff5ad0a49 272 return NFCTAG_TIMEOUT;
rosarium 0:71bff5ad0a49 273 }
rosarium 0:71bff5ad0a49 274
rosarium 0:71bff5ad0a49 275 /* M24LR can write a maximum of 4 bytes in EEPROM per i2c communication */
rosarium 0:71bff5ad0a49 276 do
rosarium 0:71bff5ad0a49 277 {
rosarium 0:71bff5ad0a49 278 /* To write data in M24LR, data must be aligned on the same row in memory */
rosarium 0:71bff5ad0a49 279 /* align_mem_offset is used to copy only Bytes that are on the same row in memory */
rosarium 0:71bff5ad0a49 280 if( bytes_to_write > M24LR_PAGEWRITE_NBBYTE )
rosarium 0:71bff5ad0a49 281 {
rosarium 0:71bff5ad0a49 282 /* DataSize higher than max page write, copy data by page */
rosarium 0:71bff5ad0a49 283 align_mem_offset = M24LR_PAGEWRITE_NBBYTE - (mem_addr % M24LR_PAGEWRITE_NBBYTE);
rosarium 0:71bff5ad0a49 284 }
rosarium 0:71bff5ad0a49 285 else
rosarium 0:71bff5ad0a49 286 {
rosarium 0:71bff5ad0a49 287 /* DataSize lower or equal to max page write, copy only last bytes */
rosarium 0:71bff5ad0a49 288 align_mem_offset = bytes_to_write;
rosarium 0:71bff5ad0a49 289 }
rosarium 0:71bff5ad0a49 290 /* Write align_mem_offset bytes in memory */
rosarium 0:71bff5ad0a49 291 /* Rosarium to Check as the address here is 0xA6 rather than 0xAE */
rosarium 0:71bff5ad0a49 292 /* Rosarium dev_I2C.i2c_write(pdata_index, M24LR_ADDR_DATA_I2C, mem_addr, align_mem_offset); */
rosarium 0:71bff5ad0a49 293 status = dev_I2C.i2c_write(pdata_index, i2c_address_data, mem_addr, align_mem_offset);
rosarium 0:71bff5ad0a49 294
rosarium 0:71bff5ad0a49 295 /* update index, dest address, size for next write */
rosarium 0:71bff5ad0a49 296 pdata_index += align_mem_offset;
rosarium 0:71bff5ad0a49 297 mem_addr += align_mem_offset;
rosarium 0:71bff5ad0a49 298 bytes_to_write -= align_mem_offset;
rosarium 0:71bff5ad0a49 299 /* Poll until EEPROM is available */
rosarium 0:71bff5ad0a49 300 while( i2c_IsDeviceReady( 1 ) != NFCTAG_OK ) {};
rosarium 0:71bff5ad0a49 301 }
rosarium 0:71bff5ad0a49 302 while( ( bytes_to_write > 0 ) && ( status == NFCTAG_OK ) );
rosarium 0:71bff5ad0a49 303 if ( status == 0 )
rosarium 0:71bff5ad0a49 304 return NFCTAG_OK;
rosarium 0:71bff5ad0a49 305 else
rosarium 0:71bff5ad0a49 306 return NFCTAG_ERROR;
rosarium 0:71bff5ad0a49 307 }
rosarium 0:71bff5ad0a49 308
rosarium 0:71bff5ad0a49 309 /**
rosarium 0:71bff5ad0a49 310 * @brief Read N register bytes starting from specified I2C address
rosarium 0:71bff5ad0a49 311 * @param pData : pointer of the data to store
rosarium 0:71bff5ad0a49 312 * @param TarAddr : I2C memory address to read
rosarium 0:71bff5ad0a49 313 * @param NbByte : number of bytes to read
rosarium 0:71bff5ad0a49 314 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 315 */
rosarium 0:71bff5ad0a49 316 NFCTAG_StatusTypeDef M24LR::i2c_ReadRegister( uint8_t * const pData, const uint16_t TarAddr, const uint16_t NbByte )
rosarium 0:71bff5ad0a49 317 {
rosarium 0:71bff5ad0a49 318 /* Before calling read function M24LR must be ready, here is a check to detect an issue */
rosarium 0:71bff5ad0a49 319 int status;
rosarium 0:71bff5ad0a49 320
rosarium 0:71bff5ad0a49 321 /* Before calling any read function M24LR must be ready, here is a check to detect an issue */
rosarium 0:71bff5ad0a49 322 if( i2c_IsDeviceReady( 1 ) != NFCTAG_OK )
rosarium 0:71bff5ad0a49 323 {
rosarium 0:71bff5ad0a49 324 return NFCTAG_TIMEOUT;
rosarium 0:71bff5ad0a49 325 }
rosarium 0:71bff5ad0a49 326 /* Read actual value of register */
rosarium 0:71bff5ad0a49 327 status = dev_I2C.i2c_read(pData, i2c_address_syst, TarAddr, NbByte);
rosarium 0:71bff5ad0a49 328
rosarium 0:71bff5ad0a49 329 if ( status == 0 )
rosarium 0:71bff5ad0a49 330 return NFCTAG_OK;
rosarium 0:71bff5ad0a49 331 else
rosarium 0:71bff5ad0a49 332 return NFCTAG_TIMEOUT;
rosarium 0:71bff5ad0a49 333 }
rosarium 0:71bff5ad0a49 334
rosarium 0:71bff5ad0a49 335 /**
rosarium 0:71bff5ad0a49 336 * @brief Write N bytes to specific register
rosarium 0:71bff5ad0a49 337 * @param pData : pointer of the data to write
rosarium 0:71bff5ad0a49 338 * @param TarAddr : I2C register address to write
rosarium 0:71bff5ad0a49 339 * @param NbByte : number of bytes to write
rosarium 0:71bff5ad0a49 340 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 341 */
rosarium 0:71bff5ad0a49 342 NFCTAG_StatusTypeDef M24LR::i2c_WriteRegister( const uint8_t * const pData, const uint16_t TarAddr, const uint16_t NbByte )
rosarium 0:71bff5ad0a49 343 {
rosarium 0:71bff5ad0a49 344 int status;
rosarium 0:71bff5ad0a49 345 uint8_t align_mem_offset;
rosarium 0:71bff5ad0a49 346 uint16_t bytes_to_write = NbByte;
rosarium 0:71bff5ad0a49 347 uint16_t mem_addr = TarAddr;
rosarium 0:71bff5ad0a49 348 uint8_t *pdata_index = (uint8_t *)pData;
rosarium 0:71bff5ad0a49 349
rosarium 0:71bff5ad0a49 350 /* Before calling this function M24LR must be ready, here is a check to detect an issue */
rosarium 0:71bff5ad0a49 351 if( i2c_IsDeviceReady( 1 ) != NFCTAG_OK )
rosarium 0:71bff5ad0a49 352 {
rosarium 0:71bff5ad0a49 353 return NFCTAG_TIMEOUT;
rosarium 0:71bff5ad0a49 354 }
rosarium 0:71bff5ad0a49 355
rosarium 0:71bff5ad0a49 356 /* M24LR can write a maximum of 4 bytes in EEPROM per i2c communication */
rosarium 0:71bff5ad0a49 357 do
rosarium 0:71bff5ad0a49 358 {
rosarium 0:71bff5ad0a49 359 /* To write data in M24LR, data must be aligned on the same row in memory */
rosarium 0:71bff5ad0a49 360 /* align_mem_offset is used to copy only Bytes that are on the same row in memory */
rosarium 0:71bff5ad0a49 361 if( bytes_to_write > M24LR_PAGEWRITE_NBBYTE )
rosarium 0:71bff5ad0a49 362 {
rosarium 0:71bff5ad0a49 363 /* DataSize higher than max page write, copy data by page */
rosarium 0:71bff5ad0a49 364 align_mem_offset = M24LR_PAGEWRITE_NBBYTE - (mem_addr % M24LR_PAGEWRITE_NBBYTE);
rosarium 0:71bff5ad0a49 365 }
rosarium 0:71bff5ad0a49 366 else
rosarium 0:71bff5ad0a49 367 {
rosarium 0:71bff5ad0a49 368 /* DataSize lower or equal to max page write, copy only last bytes */
rosarium 0:71bff5ad0a49 369 align_mem_offset = bytes_to_write;
rosarium 0:71bff5ad0a49 370 }
rosarium 0:71bff5ad0a49 371 /* Write align_mem_offset bytes in register */
rosarium 0:71bff5ad0a49 372 // status = M24lr_IO_MemWrite( pdata_index, M24LR_ADDR_SYST_I2C, mem_addr, align_mem_offset );
rosarium 0:71bff5ad0a49 373 status = dev_I2C.i2c_write(pdata_index, i2c_address_syst, mem_addr, align_mem_offset);
rosarium 0:71bff5ad0a49 374 /* update index, dest address, size for next write */
rosarium 0:71bff5ad0a49 375 pdata_index += align_mem_offset;
rosarium 0:71bff5ad0a49 376 mem_addr += align_mem_offset;
rosarium 0:71bff5ad0a49 377 bytes_to_write -= align_mem_offset;
rosarium 0:71bff5ad0a49 378 /* Poll until EEPROM is available */
rosarium 0:71bff5ad0a49 379 while( i2c_IsDeviceReady( 1 ) != NFCTAG_OK ) {};
rosarium 0:71bff5ad0a49 380 }
rosarium 0:71bff5ad0a49 381 while( ( bytes_to_write > 0 ) && ( status == NFCTAG_OK ) );
rosarium 0:71bff5ad0a49 382
rosarium 0:71bff5ad0a49 383 if ( status == 0 )
rosarium 0:71bff5ad0a49 384 return NFCTAG_OK;
rosarium 0:71bff5ad0a49 385 else
rosarium 0:71bff5ad0a49 386 return NFCTAG_ERROR;
rosarium 0:71bff5ad0a49 387 }
rosarium 0:71bff5ad0a49 388
rosarium 0:71bff5ad0a49 389 /**
rosarium 0:71bff5ad0a49 390 * @brief Read M24LR UID
rosarium 0:71bff5ad0a49 391 * @param UID : M24LR_UID pointer of the UID to store
rosarium 0:71bff5ad0a49 392 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 393 */
rosarium 0:71bff5ad0a49 394 NFCTAG_StatusTypeDef M24LR::i2c_ReadUID( M24LR_UID * const pUid )
rosarium 0:71bff5ad0a49 395 {
rosarium 0:71bff5ad0a49 396 uint8_t areg_value[8];
rosarium 0:71bff5ad0a49 397 uint8_t i;
rosarium 0:71bff5ad0a49 398 NFCTAG_StatusTypeDef status;
rosarium 0:71bff5ad0a49 399
rosarium 0:71bff5ad0a49 400 /* Read actual value of UID registers */
rosarium 0:71bff5ad0a49 401 status = i2c_ReadRegister( areg_value, M24LR_UID_REG, 8 );
rosarium 0:71bff5ad0a49 402 if( status != NFCTAG_OK )
rosarium 0:71bff5ad0a49 403 {
rosarium 0:71bff5ad0a49 404 return status;
rosarium 0:71bff5ad0a49 405 }
rosarium 0:71bff5ad0a49 406
rosarium 0:71bff5ad0a49 407 /* Store information in 2 WORD */
rosarium 0:71bff5ad0a49 408 pUid->MSB_UID = 0;
rosarium 0:71bff5ad0a49 409
rosarium 0:71bff5ad0a49 410 for( i = 0; i < 4; i++ )
rosarium 0:71bff5ad0a49 411 {
rosarium 0:71bff5ad0a49 412 pUid->MSB_UID = (pUid->MSB_UID << 8) | areg_value[7 - i];
rosarium 0:71bff5ad0a49 413 }
rosarium 0:71bff5ad0a49 414
rosarium 0:71bff5ad0a49 415 pUid->LSB_UID = 0;
rosarium 0:71bff5ad0a49 416
rosarium 0:71bff5ad0a49 417 for( i = 0; i < 4; i++ )
rosarium 0:71bff5ad0a49 418 {
rosarium 0:71bff5ad0a49 419 pUid->LSB_UID = (pUid->LSB_UID << 8) | areg_value[3 - i];
rosarium 0:71bff5ad0a49 420 }
rosarium 0:71bff5ad0a49 421
rosarium 0:71bff5ad0a49 422 return NFCTAG_OK;
rosarium 0:71bff5ad0a49 423 }
rosarium 0:71bff5ad0a49 424
rosarium 0:71bff5ad0a49 425 /**
rosarium 0:71bff5ad0a49 426 * @brief Read DSFID
rosarium 0:71bff5ad0a49 427 * @param pData : pointer of the DSFID to store
rosarium 0:71bff5ad0a49 428 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 429 */
rosarium 0:71bff5ad0a49 430 NFCTAG_StatusTypeDef M24LR::i2c_ReadDSFID( uint8_t * const pDsfid )
rosarium 0:71bff5ad0a49 431 {
rosarium 0:71bff5ad0a49 432 /* Read actual value of DSFID register */
rosarium 0:71bff5ad0a49 433 return i2c_ReadRegister( pDsfid, M24LR_DSFID_REG, 1 );
rosarium 0:71bff5ad0a49 434 }
rosarium 0:71bff5ad0a49 435
rosarium 0:71bff5ad0a49 436 /**
rosarium 0:71bff5ad0a49 437 * @brief Read AFI
rosarium 0:71bff5ad0a49 438 * @param pData : pointer of the AFI to store
rosarium 0:71bff5ad0a49 439 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 440 */
rosarium 0:71bff5ad0a49 441 NFCTAG_StatusTypeDef M24LR::i2c_ReadAFI( uint8_t * const pAfi )
rosarium 0:71bff5ad0a49 442 {
rosarium 0:71bff5ad0a49 443 /* Read actual value of AFI register */
rosarium 0:71bff5ad0a49 444 return i2c_ReadRegister( pAfi, M24LR_AFI_REG, 1 );
rosarium 0:71bff5ad0a49 445 }
rosarium 0:71bff5ad0a49 446
rosarium 0:71bff5ad0a49 447 /**
rosarium 0:71bff5ad0a49 448 * @brief Read status of I2C Lock Sectors
rosarium 0:71bff5ad0a49 449 * @param Lock_sector : M24LR_Lock_Sectors pointer of the I2c lock sector status to store
rosarium 0:71bff5ad0a49 450 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 451 */
rosarium 0:71bff5ad0a49 452 NFCTAG_StatusTypeDef M24LR::i2c_ReadI2CLockSector( M24LR_Lock_Sectors * const pLock_sector )
rosarium 0:71bff5ad0a49 453 {
rosarium 0:71bff5ad0a49 454 uint8_t areg_value[8];
rosarium 0:71bff5ad0a49 455 NFCTAG_StatusTypeDef status;
rosarium 0:71bff5ad0a49 456
rosarium 0:71bff5ad0a49 457 /* Read actual value of I2c Write Lock registers */
rosarium 0:71bff5ad0a49 458 status = i2c_ReadRegister( areg_value, M24LR_LOCK_REG, 8 );
rosarium 0:71bff5ad0a49 459 if( status != NFCTAG_OK )
rosarium 0:71bff5ad0a49 460 {
rosarium 0:71bff5ad0a49 461 return status;
rosarium 0:71bff5ad0a49 462 }
rosarium 0:71bff5ad0a49 463
rosarium 0:71bff5ad0a49 464 /* Dispatch information to corresponding struct member */
rosarium 0:71bff5ad0a49 465 pLock_sector->sectors_63_56 = areg_value[7];
rosarium 0:71bff5ad0a49 466 pLock_sector->sectors_55_48 = areg_value[6];
rosarium 0:71bff5ad0a49 467 pLock_sector->sectors_47_40 = areg_value[5];
rosarium 0:71bff5ad0a49 468 pLock_sector->sectors_39_32 = areg_value[4];
rosarium 0:71bff5ad0a49 469 pLock_sector->sectors_31_24 = areg_value[3];
rosarium 0:71bff5ad0a49 470 pLock_sector->sectors_23_16 = areg_value[2];
rosarium 0:71bff5ad0a49 471 pLock_sector->sectors_15_8 = areg_value[1];
rosarium 0:71bff5ad0a49 472 pLock_sector->sectors_7_0 = areg_value[0];
rosarium 0:71bff5ad0a49 473
rosarium 0:71bff5ad0a49 474 return NFCTAG_OK;
rosarium 0:71bff5ad0a49 475 }
rosarium 0:71bff5ad0a49 476
rosarium 0:71bff5ad0a49 477 /**
rosarium 0:71bff5ad0a49 478 * @brief Lock I2C write on an EEPROM Sectors
rosarium 0:71bff5ad0a49 479 * @brief Need a presentation of I2C Password to be effective
rosarium 0:71bff5ad0a49 480 * @param Sector : EEPROM Sector number to lock (between 0 to 63)
rosarium 0:71bff5ad0a49 481 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 482 */
rosarium 0:71bff5ad0a49 483 NFCTAG_StatusTypeDef M24LR::i2c_I2CLockSector( const uint8_t Sector )
rosarium 0:71bff5ad0a49 484 {
rosarium 0:71bff5ad0a49 485 NFCTAG_StatusTypeDef status;
rosarium 0:71bff5ad0a49 486 uint8_t reg_value = 0;
rosarium 0:71bff5ad0a49 487 uint16_t sector_write_lock_addr;
rosarium 0:71bff5ad0a49 488
rosarium 0:71bff5ad0a49 489 /* Compute register address */
rosarium 0:71bff5ad0a49 490 sector_write_lock_addr = M24LR_LOCK_REG | (Sector >> 3);
rosarium 0:71bff5ad0a49 491
rosarium 0:71bff5ad0a49 492 /* Read actual WriteLockStatus */
rosarium 0:71bff5ad0a49 493 status = i2c_ReadRegister( &reg_value, sector_write_lock_addr, 1 );
rosarium 0:71bff5ad0a49 494 if( status != NFCTAG_OK )
rosarium 0:71bff5ad0a49 495 {
rosarium 0:71bff5ad0a49 496 return status;
rosarium 0:71bff5ad0a49 497 }
rosarium 0:71bff5ad0a49 498
rosarium 0:71bff5ad0a49 499 /* Compute and update new WriteLockStatus */
rosarium 0:71bff5ad0a49 500 reg_value |= 1 << ( Sector % 8 );
rosarium 0:71bff5ad0a49 501
rosarium 0:71bff5ad0a49 502 /* Write WriteLock register */
rosarium 0:71bff5ad0a49 503 return i2c_WriteRegister( &reg_value, sector_write_lock_addr, 1 );
rosarium 0:71bff5ad0a49 504 }
rosarium 0:71bff5ad0a49 505
rosarium 0:71bff5ad0a49 506 /**
rosarium 0:71bff5ad0a49 507 * @brief UnLock I2C write on a EEPROM Sector
rosarium 0:71bff5ad0a49 508 * @brief Need an presentation of I2C Password to be effective
rosarium 0:71bff5ad0a49 509 * @param pSector : EEPROM Sector number to unlock (between 0 to 63)
rosarium 0:71bff5ad0a49 510 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 511 */
rosarium 0:71bff5ad0a49 512 NFCTAG_StatusTypeDef M24LR::i2c_I2CUnlockSector( const uint8_t Sector )
rosarium 0:71bff5ad0a49 513 {
rosarium 0:71bff5ad0a49 514 NFCTAG_StatusTypeDef status;
rosarium 0:71bff5ad0a49 515 uint8_t reg_value = 0;
rosarium 0:71bff5ad0a49 516 uint16_t sector_write_lock_addr;
rosarium 0:71bff5ad0a49 517
rosarium 0:71bff5ad0a49 518 /* Compute register address */
rosarium 0:71bff5ad0a49 519 sector_write_lock_addr = M24LR_LOCK_REG | (Sector >> 3);
rosarium 0:71bff5ad0a49 520
rosarium 0:71bff5ad0a49 521 /* Read actual WriteLockStatus */
rosarium 0:71bff5ad0a49 522 status = i2c_ReadRegister( &reg_value, sector_write_lock_addr, 1 );
rosarium 0:71bff5ad0a49 523 if( status != NFCTAG_OK )
rosarium 0:71bff5ad0a49 524 {
rosarium 0:71bff5ad0a49 525 return status;
rosarium 0:71bff5ad0a49 526 }
rosarium 0:71bff5ad0a49 527
rosarium 0:71bff5ad0a49 528 /* Compute and update new WriteLockStatus */
rosarium 0:71bff5ad0a49 529 reg_value &= ~( 1 << ( Sector % 8 ) );
rosarium 0:71bff5ad0a49 530
rosarium 0:71bff5ad0a49 531 /* Write WriteLock register */
rosarium 0:71bff5ad0a49 532 return i2c_WriteRegister( &reg_value, sector_write_lock_addr, 1 );
rosarium 0:71bff5ad0a49 533 }
rosarium 0:71bff5ad0a49 534
rosarium 0:71bff5ad0a49 535 /**
rosarium 0:71bff5ad0a49 536 * @brief Present I2C password, authorize I2C write
rosarium 0:71bff5ad0a49 537 * @param PassWord : Password value on 32bits
rosarium 0:71bff5ad0a49 538 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 539 */
rosarium 0:71bff5ad0a49 540 NFCTAG_StatusTypeDef M24LR::i2c_PresentI2CPassword( const uint32_t PassWord )
rosarium 0:71bff5ad0a49 541 {
rosarium 0:71bff5ad0a49 542 uint8_t ai2c_message[9] = {0};
rosarium 0:71bff5ad0a49 543 uint8_t i;
rosarium 0:71bff5ad0a49 544
rosarium 0:71bff5ad0a49 545 /* Build I2C Message with Password + Validation code 0x09 + Password */
rosarium 0:71bff5ad0a49 546 ai2c_message[4] = 0x09;
rosarium 0:71bff5ad0a49 547 i = 0;
rosarium 0:71bff5ad0a49 548 while( i < 4 )
rosarium 0:71bff5ad0a49 549 {
rosarium 0:71bff5ad0a49 550 ai2c_message[i] = ( PassWord >> (i * 8) ) & 0xFF;
rosarium 0:71bff5ad0a49 551 ai2c_message[i + 5] = ( PassWord >> (i * 8) ) & 0xFF;
rosarium 0:71bff5ad0a49 552 i++;
rosarium 0:71bff5ad0a49 553 };
rosarium 0:71bff5ad0a49 554
rosarium 0:71bff5ad0a49 555 /* Present password to M24LR */
rosarium 0:71bff5ad0a49 556 return i2c_WriteRegister( ai2c_message, M24LR_I2C_PWD_REG, 9 );
rosarium 0:71bff5ad0a49 557 }
rosarium 0:71bff5ad0a49 558
rosarium 0:71bff5ad0a49 559 /**
rosarium 0:71bff5ad0a49 560 * @brief Write new I2C password
rosarium 0:71bff5ad0a49 561 * @brief Need to present good I2CPassword before using this function
rosarium 0:71bff5ad0a49 562 * @param PassWord : new I2C PassWord value on 32bits
rosarium 0:71bff5ad0a49 563 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 564 */
rosarium 0:71bff5ad0a49 565 NFCTAG_StatusTypeDef M24LR::i2c_WriteI2CPassword( const uint32_t PassWord )
rosarium 0:71bff5ad0a49 566 {
rosarium 0:71bff5ad0a49 567 uint8_t ai2c_message[9] = {0};
rosarium 0:71bff5ad0a49 568 uint8_t i;
rosarium 0:71bff5ad0a49 569
rosarium 0:71bff5ad0a49 570 /* Build I2C Message with Password + Validation code 0x07 + Password */
rosarium 0:71bff5ad0a49 571 ai2c_message[4] = 0x07;
rosarium 0:71bff5ad0a49 572 i = 0;
rosarium 0:71bff5ad0a49 573 while( i < 4 )
rosarium 0:71bff5ad0a49 574 {
rosarium 0:71bff5ad0a49 575 ai2c_message[i] = ( PassWord >> (i * 8) ) & 0xFF;
rosarium 0:71bff5ad0a49 576 ai2c_message[i + 5] = ( PassWord >> (i * 8) ) & 0xFF;
rosarium 0:71bff5ad0a49 577 i++;
rosarium 0:71bff5ad0a49 578 };
rosarium 0:71bff5ad0a49 579
rosarium 0:71bff5ad0a49 580 /* Write Password to register */
rosarium 0:71bff5ad0a49 581 return i2c_WriteRegister( ai2c_message, M24LR_I2C_PWD_REG, 9 );
rosarium 0:71bff5ad0a49 582 }
rosarium 0:71bff5ad0a49 583
rosarium 0:71bff5ad0a49 584 /**
rosarium 0:71bff5ad0a49 585 * @brief Read SectorSecurityStatus (defining RF access allowed)
rosarium 0:71bff5ad0a49 586 * @param SectorNb : Sector number to get RF security status
rosarium 0:71bff5ad0a49 587 * @param pData : M24LR_SECTOR_SEC pointer of the data to store
rosarium 0:71bff5ad0a49 588 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 589 */
rosarium 0:71bff5ad0a49 590 NFCTAG_StatusTypeDef M24LR::i2c_ReadSSSx( const uint8_t SectorNb, M24LR_SECTOR_SEC * const pData )
rosarium 0:71bff5ad0a49 591 {
rosarium 0:71bff5ad0a49 592 uint8_t reg_value;
rosarium 0:71bff5ad0a49 593 NFCTAG_StatusTypeDef status;
rosarium 0:71bff5ad0a49 594 uint16_t sector_security_addr;
rosarium 0:71bff5ad0a49 595
rosarium 0:71bff5ad0a49 596 /* Compute Sector Security register address */
rosarium 0:71bff5ad0a49 597 sector_security_addr = M24LR_SSS_REG | SectorNb;
rosarium 0:71bff5ad0a49 598
rosarium 0:71bff5ad0a49 599 /* Read actual value of SectorSecurityStatus register */
rosarium 0:71bff5ad0a49 600 status = i2c_ReadRegister( &reg_value, sector_security_addr, 1 );
rosarium 0:71bff5ad0a49 601 if( status != NFCTAG_OK )
rosarium 0:71bff5ad0a49 602 {
rosarium 0:71bff5ad0a49 603 return status;
rosarium 0:71bff5ad0a49 604 }
rosarium 0:71bff5ad0a49 605
rosarium 0:71bff5ad0a49 606 /* Extract Sector Security Status configuration */
rosarium 0:71bff5ad0a49 607 pData->SectorLock = reg_value & M24LR_SSS_LOCK_MASK;
rosarium 0:71bff5ad0a49 608 pData->RW_Protection = (reg_value & M24LR_SSS_RW_MASK) >> 1;
rosarium 0:71bff5ad0a49 609 pData->PassCtrl = (reg_value & M24LR_SSS_PASSCTRL_MASK) >> 3;
rosarium 0:71bff5ad0a49 610
rosarium 0:71bff5ad0a49 611 return NFCTAG_OK;
rosarium 0:71bff5ad0a49 612 }
rosarium 0:71bff5ad0a49 613
rosarium 0:71bff5ad0a49 614 /**
rosarium 0:71bff5ad0a49 615 * @brief Write SectorSecurityStatus (defining RF access allowed)
rosarium 0:71bff5ad0a49 616 * @brief Need an presentation of I2C Password to be effective
rosarium 0:71bff5ad0a49 617 * @param SectorNb : Sector number to set RF security
rosarium 0:71bff5ad0a49 618 * @param pData : M24LR_SECTOR_SEC pointer of the data to write
rosarium 0:71bff5ad0a49 619 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 620 */
rosarium 0:71bff5ad0a49 621 NFCTAG_StatusTypeDef M24LR::i2c_WriteSSSx( const uint8_t SectorNb, const M24LR_SECTOR_SEC * const pData )
rosarium 0:71bff5ad0a49 622 {
rosarium 0:71bff5ad0a49 623 uint8_t reg_value;
rosarium 0:71bff5ad0a49 624 uint16_t sector_security_addr;
rosarium 0:71bff5ad0a49 625
rosarium 0:71bff5ad0a49 626 /* Compute Sector Security register address */
rosarium 0:71bff5ad0a49 627 sector_security_addr = M24LR_SSS_REG | SectorNb;
rosarium 0:71bff5ad0a49 628
rosarium 0:71bff5ad0a49 629 /* Update Sector Security Status */
rosarium 0:71bff5ad0a49 630 reg_value = (pData->PassCtrl << 3) & M24LR_SSS_PASSCTRL_MASK;
rosarium 0:71bff5ad0a49 631 reg_value |= ((pData->RW_Protection << 1) & M24LR_SSS_RW_MASK);
rosarium 0:71bff5ad0a49 632 reg_value |= (pData->SectorLock & M24LR_SSS_LOCK_MASK);
rosarium 0:71bff5ad0a49 633
rosarium 0:71bff5ad0a49 634 /* Write SectorSecurityStatus register */
rosarium 0:71bff5ad0a49 635 return i2c_WriteRegister( &reg_value, sector_security_addr, 1 );
rosarium 0:71bff5ad0a49 636 }
rosarium 0:71bff5ad0a49 637
rosarium 0:71bff5ad0a49 638 /**
rosarium 0:71bff5ad0a49 639 * @brief Read Memory Size info
rosarium 0:71bff5ad0a49 640 * @param SizeInfo : M24LR_Mem_Size pointer of the data to store
rosarium 0:71bff5ad0a49 641 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 642 */
rosarium 0:71bff5ad0a49 643 NFCTAG_StatusTypeDef M24LR::i2c_ReadMemSize( M24LR_Mem_Size * const pSizeInfo )
rosarium 0:71bff5ad0a49 644 {
rosarium 0:71bff5ad0a49 645 uint8_t areg_value[3];
rosarium 0:71bff5ad0a49 646 NFCTAG_StatusTypeDef status;
rosarium 0:71bff5ad0a49 647
rosarium 0:71bff5ad0a49 648 /* Read actual value of Mem_Size register */
rosarium 0:71bff5ad0a49 649 status = i2c_ReadRegister( areg_value, M24LR_MEMSIZE_REG, 3 );
rosarium 0:71bff5ad0a49 650 if( status != NFCTAG_OK )
rosarium 0:71bff5ad0a49 651 {
rosarium 0:71bff5ad0a49 652 return status;
rosarium 0:71bff5ad0a49 653 }
rosarium 0:71bff5ad0a49 654
rosarium 0:71bff5ad0a49 655 /* Extract Mem information */
rosarium 0:71bff5ad0a49 656 pSizeInfo->BlockSize = areg_value[2];
rosarium 0:71bff5ad0a49 657 pSizeInfo->Mem_Size = areg_value[1];
rosarium 0:71bff5ad0a49 658 pSizeInfo->Mem_Size = (pSizeInfo->Mem_Size << 8) | areg_value[0];
rosarium 0:71bff5ad0a49 659
rosarium 0:71bff5ad0a49 660 return NFCTAG_OK;
rosarium 0:71bff5ad0a49 661 }
rosarium 0:71bff5ad0a49 662
rosarium 0:71bff5ad0a49 663 /**
rosarium 0:71bff5ad0a49 664 * @brief Get GPO Configuration status
rosarium 0:71bff5ad0a49 665 * @param Rf_Wip_Busy : M24LR_GPO_STATUS pointer of the data to store
rosarium 0:71bff5ad0a49 666 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 667 */
rosarium 0:71bff5ad0a49 668 NFCTAG_StatusTypeDef M24LR::i2c_GetRF_WIP_BUSY( M24LR_GPO_STATUS * const pRf_Wip_Busy )
rosarium 0:71bff5ad0a49 669 {
rosarium 0:71bff5ad0a49 670 uint8_t reg_value;
rosarium 0:71bff5ad0a49 671 NFCTAG_StatusTypeDef status;
rosarium 0:71bff5ad0a49 672
rosarium 0:71bff5ad0a49 673 /* Read actual value of CFG register */
rosarium 0:71bff5ad0a49 674 status = i2c_ReadRegister( &reg_value, M24LR_CFG_REG, 1 );
rosarium 0:71bff5ad0a49 675 if( status != NFCTAG_OK )
rosarium 0:71bff5ad0a49 676 {
rosarium 0:71bff5ad0a49 677 return status;
rosarium 0:71bff5ad0a49 678 }
rosarium 0:71bff5ad0a49 679
rosarium 0:71bff5ad0a49 680 /* Extract RF WIP/BUSY information */
rosarium 0:71bff5ad0a49 681 if( (reg_value & M24LR_CFG_WIPBUSY_MASK) == M24LR_CFG_WIPBUSY_MASK )
rosarium 0:71bff5ad0a49 682 {
rosarium 0:71bff5ad0a49 683 *pRf_Wip_Busy = M24LR_GPO_WIP;
rosarium 0:71bff5ad0a49 684 }
rosarium 0:71bff5ad0a49 685 else
rosarium 0:71bff5ad0a49 686 {
rosarium 0:71bff5ad0a49 687 *pRf_Wip_Busy = M24LR_GPO_BUSY;
rosarium 0:71bff5ad0a49 688 }
rosarium 0:71bff5ad0a49 689
rosarium 0:71bff5ad0a49 690 return NFCTAG_OK;
rosarium 0:71bff5ad0a49 691 }
rosarium 0:71bff5ad0a49 692
rosarium 0:71bff5ad0a49 693 /**
rosarium 0:71bff5ad0a49 694 * @brief Configure GPO as RF Busy
rosarium 0:71bff5ad0a49 695 * @param None
rosarium 0:71bff5ad0a49 696 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 697 */
rosarium 0:71bff5ad0a49 698 NFCTAG_StatusTypeDef M24LR::i2c_SetRFBUSY( void )
rosarium 0:71bff5ad0a49 699 {
rosarium 0:71bff5ad0a49 700 uint8_t reg_value;
rosarium 0:71bff5ad0a49 701 int status;
rosarium 0:71bff5ad0a49 702
rosarium 0:71bff5ad0a49 703 /* Read actual value of CFG register */
rosarium 0:71bff5ad0a49 704 status = dev_I2C.i2c_read( &reg_value, i2c_address_syst, (uint16_t)M24LR_CFG_REG, 1 );
rosarium 0:71bff5ad0a49 705 if( status != 0 )
rosarium 0:71bff5ad0a49 706 {
rosarium 0:71bff5ad0a49 707 return NFCTAG_TIMEOUT;
rosarium 0:71bff5ad0a49 708 }
rosarium 0:71bff5ad0a49 709
rosarium 0:71bff5ad0a49 710 /* Update register value for BUSY configuration */
rosarium 0:71bff5ad0a49 711 reg_value &= !M24LR_CFG_WIPBUSY_MASK;
rosarium 0:71bff5ad0a49 712
rosarium 0:71bff5ad0a49 713 /* Write CFG register */
rosarium 0:71bff5ad0a49 714 status = i2c_WriteRegister( &reg_value, M24LR_CFG_REG, 1 );
rosarium 0:71bff5ad0a49 715 if ( status == 0 )
rosarium 0:71bff5ad0a49 716 return NFCTAG_OK;
rosarium 0:71bff5ad0a49 717 else
rosarium 0:71bff5ad0a49 718 return NFCTAG_TIMEOUT;
rosarium 0:71bff5ad0a49 719 }
rosarium 0:71bff5ad0a49 720
rosarium 0:71bff5ad0a49 721
rosarium 0:71bff5ad0a49 722 /**
rosarium 0:71bff5ad0a49 723 * @brief Get Energy harvesting mode status
rosarium 0:71bff5ad0a49 724 * @param EH_mode : M24LR_EH_MODE_STATUS pointer of the data to store
rosarium 0:71bff5ad0a49 725 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 726 */
rosarium 0:71bff5ad0a49 727 NFCTAG_StatusTypeDef M24LR::i2c_Read_EH_mode( M24LR_EH_MODE_STATUS * const pEH_mode )
rosarium 0:71bff5ad0a49 728 {
rosarium 0:71bff5ad0a49 729 uint8_t reg_value;
rosarium 0:71bff5ad0a49 730 NFCTAG_StatusTypeDef status;
rosarium 0:71bff5ad0a49 731
rosarium 0:71bff5ad0a49 732 /* Read actual value of CFG register */
rosarium 0:71bff5ad0a49 733 status = i2c_ReadRegister( &reg_value, M24LR_CFG_REG, 1 );
rosarium 0:71bff5ad0a49 734 if( status != NFCTAG_OK )
rosarium 0:71bff5ad0a49 735 {
rosarium 0:71bff5ad0a49 736 return status;
rosarium 0:71bff5ad0a49 737 }
rosarium 0:71bff5ad0a49 738
rosarium 0:71bff5ad0a49 739 /* Extract EH_mode configuration */
rosarium 0:71bff5ad0a49 740 if( (reg_value & M24LR_CFG_EHMODE_MASK) == M24LR_CFG_EHMODE_MASK )
rosarium 0:71bff5ad0a49 741 {
rosarium 0:71bff5ad0a49 742 *pEH_mode = M24LR_EH_MODE_DISABLE;
rosarium 0:71bff5ad0a49 743 }
rosarium 0:71bff5ad0a49 744 else
rosarium 0:71bff5ad0a49 745 {
rosarium 0:71bff5ad0a49 746 *pEH_mode = M24LR_EH_MODE_ENABLE;
rosarium 0:71bff5ad0a49 747 }
rosarium 0:71bff5ad0a49 748
rosarium 0:71bff5ad0a49 749 return NFCTAG_OK;
rosarium 0:71bff5ad0a49 750 }
rosarium 0:71bff5ad0a49 751
rosarium 0:71bff5ad0a49 752 /**
rosarium 0:71bff5ad0a49 753 * @brief Enable Energy harvesting mode
rosarium 0:71bff5ad0a49 754 * @param None
rosarium 0:71bff5ad0a49 755 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 756 */
rosarium 0:71bff5ad0a49 757 NFCTAG_StatusTypeDef M24LR::i2c_Enable_EH_mode( void )
rosarium 0:71bff5ad0a49 758 {
rosarium 0:71bff5ad0a49 759 uint8_t reg_value;
rosarium 0:71bff5ad0a49 760 NFCTAG_StatusTypeDef status;
rosarium 0:71bff5ad0a49 761
rosarium 0:71bff5ad0a49 762 /* Read actual value of CFG register */
rosarium 0:71bff5ad0a49 763 status = i2c_ReadRegister( &reg_value, M24LR_CFG_REG, 1 );
rosarium 0:71bff5ad0a49 764 if( status != NFCTAG_OK )
rosarium 0:71bff5ad0a49 765 {
rosarium 0:71bff5ad0a49 766 return status;
rosarium 0:71bff5ad0a49 767 }
rosarium 0:71bff5ad0a49 768
rosarium 0:71bff5ad0a49 769 /* Update EH_mode */
rosarium 0:71bff5ad0a49 770 reg_value &= ~M24LR_CFG_EHMODE_MASK;
rosarium 0:71bff5ad0a49 771
rosarium 0:71bff5ad0a49 772 /* Write CFG register */
rosarium 0:71bff5ad0a49 773 return i2c_WriteRegister( &reg_value, M24LR_CFG_REG, 1 );
rosarium 0:71bff5ad0a49 774 }
rosarium 0:71bff5ad0a49 775
rosarium 0:71bff5ad0a49 776 /**
rosarium 0:71bff5ad0a49 777 * @brief Disable Energy harvesting mode
rosarium 0:71bff5ad0a49 778 * @param None
rosarium 0:71bff5ad0a49 779 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 780 */
rosarium 0:71bff5ad0a49 781 NFCTAG_StatusTypeDef M24LR::i2c_Disable_EH_mode( void )
rosarium 0:71bff5ad0a49 782 {
rosarium 0:71bff5ad0a49 783 uint8_t reg_value;
rosarium 0:71bff5ad0a49 784 NFCTAG_StatusTypeDef status;
rosarium 0:71bff5ad0a49 785
rosarium 0:71bff5ad0a49 786 /* Read actual value of CFG register */
rosarium 0:71bff5ad0a49 787 status = i2c_ReadRegister( &reg_value, M24LR_CFG_REG, 1 );
rosarium 0:71bff5ad0a49 788 if( status != NFCTAG_OK )
rosarium 0:71bff5ad0a49 789 {
rosarium 0:71bff5ad0a49 790 return status;
rosarium 0:71bff5ad0a49 791 }
rosarium 0:71bff5ad0a49 792
rosarium 0:71bff5ad0a49 793 /* Update EH_mode */
rosarium 0:71bff5ad0a49 794 reg_value |= M24LR_CFG_EHMODE_MASK;
rosarium 0:71bff5ad0a49 795
rosarium 0:71bff5ad0a49 796 /* Write CFG register */
rosarium 0:71bff5ad0a49 797 return i2c_WriteRegister( &reg_value, M24LR_CFG_REG, 1 );
rosarium 0:71bff5ad0a49 798 }
rosarium 0:71bff5ad0a49 799
rosarium 0:71bff5ad0a49 800 /**
rosarium 0:71bff5ad0a49 801 * @brief Read Vout sink current configuration status for Energy Harvesting
rosarium 0:71bff5ad0a49 802 * @param EH_Cfg : M24LR_EH_CFG_VOUT pointer of the data to store
rosarium 0:71bff5ad0a49 803 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 804 */
rosarium 0:71bff5ad0a49 805 NFCTAG_StatusTypeDef M24LR::i2c_ReadEH_Cfg( M24LR_EH_CFG_VOUT * const pEH_Cfg )
rosarium 0:71bff5ad0a49 806 {
rosarium 0:71bff5ad0a49 807 uint8_t reg_value;
rosarium 0:71bff5ad0a49 808 NFCTAG_StatusTypeDef status;
rosarium 0:71bff5ad0a49 809
rosarium 0:71bff5ad0a49 810 /* Read actual value of CFG register */
rosarium 0:71bff5ad0a49 811 status = i2c_ReadRegister( &reg_value, M24LR_CFG_REG, 1 );
rosarium 0:71bff5ad0a49 812 if( status != NFCTAG_OK )
rosarium 0:71bff5ad0a49 813 {
rosarium 0:71bff5ad0a49 814 return status;
rosarium 0:71bff5ad0a49 815 }
rosarium 0:71bff5ad0a49 816
rosarium 0:71bff5ad0a49 817 /* Extract Vout configuration for EH information */
rosarium 0:71bff5ad0a49 818 reg_value &= (M24LR_CFG_EHCFG1_MASK | M24LR_CFG_EHCFG0_MASK);
rosarium 0:71bff5ad0a49 819 switch( reg_value )
rosarium 0:71bff5ad0a49 820 {
rosarium 0:71bff5ad0a49 821 case 0:
rosarium 0:71bff5ad0a49 822 *pEH_Cfg = M24LR_EH_Cfg_6MA;
rosarium 0:71bff5ad0a49 823 break;
rosarium 0:71bff5ad0a49 824 case 1:
rosarium 0:71bff5ad0a49 825 *pEH_Cfg = M24LR_EH_Cfg_3MA;
rosarium 0:71bff5ad0a49 826 break;
rosarium 0:71bff5ad0a49 827 case 2:
rosarium 0:71bff5ad0a49 828 *pEH_Cfg = M24LR_EH_Cfg_1MA;
rosarium 0:71bff5ad0a49 829 break;
rosarium 0:71bff5ad0a49 830 case 3:
rosarium 0:71bff5ad0a49 831 *pEH_Cfg = M24LR_EH_Cfg_300UA;
rosarium 0:71bff5ad0a49 832 break;
rosarium 0:71bff5ad0a49 833
rosarium 0:71bff5ad0a49 834 default:
rosarium 0:71bff5ad0a49 835 *pEH_Cfg = M24LR_EH_Cfg_6MA;
rosarium 0:71bff5ad0a49 836 }
rosarium 0:71bff5ad0a49 837
rosarium 0:71bff5ad0a49 838 return NFCTAG_OK;
rosarium 0:71bff5ad0a49 839 }
rosarium 0:71bff5ad0a49 840
rosarium 0:71bff5ad0a49 841 /**
rosarium 0:71bff5ad0a49 842 * @brief Write Vout sink current configuration status for Energy Harvesting
rosarium 0:71bff5ad0a49 843 * @param EH_Cfg : M24LR_EH_CFG_VOUT value to configure Vout
rosarium 0:71bff5ad0a49 844 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 845 */
rosarium 0:71bff5ad0a49 846 NFCTAG_StatusTypeDef M24LR::i2c_WriteEH_Cfg( const M24LR_EH_CFG_VOUT EH_Cfg )
rosarium 0:71bff5ad0a49 847 {
rosarium 0:71bff5ad0a49 848 uint8_t reg_value;
rosarium 0:71bff5ad0a49 849 NFCTAG_StatusTypeDef status;
rosarium 0:71bff5ad0a49 850
rosarium 0:71bff5ad0a49 851 /* Read actual value of CFG register */
rosarium 0:71bff5ad0a49 852 status = i2c_ReadRegister( &reg_value, M24LR_CFG_REG, 1 );
rosarium 0:71bff5ad0a49 853 if( status != NFCTAG_OK )
rosarium 0:71bff5ad0a49 854 {
rosarium 0:71bff5ad0a49 855 return status;
rosarium 0:71bff5ad0a49 856 }
rosarium 0:71bff5ad0a49 857
rosarium 0:71bff5ad0a49 858 /* Update Vout configuration */
rosarium 0:71bff5ad0a49 859 reg_value &= ~(M24LR_CFG_EHCFG1_MASK | M24LR_CFG_EHCFG0_MASK);
rosarium 0:71bff5ad0a49 860 reg_value |= EH_Cfg;
rosarium 0:71bff5ad0a49 861
rosarium 0:71bff5ad0a49 862 /* Write CFG register */
rosarium 0:71bff5ad0a49 863 return i2c_WriteRegister( &reg_value, M24LR_CFG_REG, 1 );
rosarium 0:71bff5ad0a49 864 }
rosarium 0:71bff5ad0a49 865
rosarium 0:71bff5ad0a49 866 /**
rosarium 0:71bff5ad0a49 867 * @brief Get Energy Harvesting status
rosarium 0:71bff5ad0a49 868 * @param EH_Val : M24LR_EH_STATUS pointer of the data to store
rosarium 0:71bff5ad0a49 869 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 870 */
rosarium 0:71bff5ad0a49 871 NFCTAG_StatusTypeDef M24LR::i2c_GetEH( M24LR_EH_STATUS * const pEH_Val )
rosarium 0:71bff5ad0a49 872 {
rosarium 0:71bff5ad0a49 873 uint8_t reg_value;
rosarium 0:71bff5ad0a49 874 NFCTAG_StatusTypeDef status;
rosarium 0:71bff5ad0a49 875
rosarium 0:71bff5ad0a49 876 /* Read actual value of CTRL register */
rosarium 0:71bff5ad0a49 877 status = i2c_ReadRegister( &reg_value, M24LR_CTRL_REG, 1 );
rosarium 0:71bff5ad0a49 878 if( status != NFCTAG_OK )
rosarium 0:71bff5ad0a49 879 {
rosarium 0:71bff5ad0a49 880 return status;
rosarium 0:71bff5ad0a49 881 }
rosarium 0:71bff5ad0a49 882
rosarium 0:71bff5ad0a49 883 /* Extract EH information */
rosarium 0:71bff5ad0a49 884 if( (reg_value & M24LR_CTRL_EHEN_MASK) == M24LR_CTRL_EHEN_MASK )
rosarium 0:71bff5ad0a49 885 {
rosarium 0:71bff5ad0a49 886 *pEH_Val = M24LR_EH_ENABLE;
rosarium 0:71bff5ad0a49 887 }
rosarium 0:71bff5ad0a49 888 else
rosarium 0:71bff5ad0a49 889 {
rosarium 0:71bff5ad0a49 890 *pEH_Val = M24LR_EH_DISABLE;
rosarium 0:71bff5ad0a49 891 }
rosarium 0:71bff5ad0a49 892
rosarium 0:71bff5ad0a49 893 return NFCTAG_OK;
rosarium 0:71bff5ad0a49 894 }
rosarium 0:71bff5ad0a49 895
rosarium 0:71bff5ad0a49 896 /**
rosarium 0:71bff5ad0a49 897 * @brief Enable Energy Harvesting
rosarium 0:71bff5ad0a49 898 * @param None
rosarium 0:71bff5ad0a49 899 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 900 */
rosarium 0:71bff5ad0a49 901 NFCTAG_StatusTypeDef M24LR::i2c_SetEH( void )
rosarium 0:71bff5ad0a49 902 {
rosarium 0:71bff5ad0a49 903 uint8_t reg_value;
rosarium 0:71bff5ad0a49 904 NFCTAG_StatusTypeDef status;
rosarium 0:71bff5ad0a49 905
rosarium 0:71bff5ad0a49 906 /* Read actual value of CTRL register */
rosarium 0:71bff5ad0a49 907 status = i2c_ReadRegister( &reg_value, M24LR_CTRL_REG, 1 );
rosarium 0:71bff5ad0a49 908 if( status != NFCTAG_OK )
rosarium 0:71bff5ad0a49 909 {
rosarium 0:71bff5ad0a49 910 return status;
rosarium 0:71bff5ad0a49 911 }
rosarium 0:71bff5ad0a49 912
rosarium 0:71bff5ad0a49 913 /* Update EH configuration */
rosarium 0:71bff5ad0a49 914 reg_value |= M24LR_CTRL_EHEN_MASK;
rosarium 0:71bff5ad0a49 915
rosarium 0:71bff5ad0a49 916 /* Write CTRL Register */
rosarium 0:71bff5ad0a49 917 return i2c_WriteRegister( &reg_value, M24LR_CTRL_REG, 1 );
rosarium 0:71bff5ad0a49 918 }
rosarium 0:71bff5ad0a49 919
rosarium 0:71bff5ad0a49 920 /**
rosarium 0:71bff5ad0a49 921 * @brief Disable Energy Harvesting
rosarium 0:71bff5ad0a49 922 * @param None
rosarium 0:71bff5ad0a49 923 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 924 */
rosarium 0:71bff5ad0a49 925 NFCTAG_StatusTypeDef M24LR::i2c_ResetEH( void )
rosarium 0:71bff5ad0a49 926 {
rosarium 0:71bff5ad0a49 927 uint8_t reg_value;
rosarium 0:71bff5ad0a49 928 NFCTAG_StatusTypeDef status;
rosarium 0:71bff5ad0a49 929
rosarium 0:71bff5ad0a49 930 /* Read actual value of CTRL register */
rosarium 0:71bff5ad0a49 931 status = i2c_ReadRegister( &reg_value, M24LR_CTRL_REG, 1 );
rosarium 0:71bff5ad0a49 932 if( status != NFCTAG_OK )
rosarium 0:71bff5ad0a49 933 {
rosarium 0:71bff5ad0a49 934 return status;
rosarium 0:71bff5ad0a49 935 }
rosarium 0:71bff5ad0a49 936
rosarium 0:71bff5ad0a49 937 /* Update EH configuration */
rosarium 0:71bff5ad0a49 938 reg_value &= ~M24LR_CTRL_EHEN_MASK;
rosarium 0:71bff5ad0a49 939
rosarium 0:71bff5ad0a49 940 /* Write CTRL register */
rosarium 0:71bff5ad0a49 941 return i2c_WriteRegister( &reg_value, M24LR_CTRL_REG, 1 );
rosarium 0:71bff5ad0a49 942 }
rosarium 0:71bff5ad0a49 943
rosarium 0:71bff5ad0a49 944 /**
rosarium 0:71bff5ad0a49 945 * @brief Check if RF Field is present in front of M24LR
rosarium 0:71bff5ad0a49 946 * @param pRF_Field : M24LR_FIELD_STATUS pointer of the data to store
rosarium 0:71bff5ad0a49 947 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 948 */
rosarium 0:71bff5ad0a49 949 NFCTAG_StatusTypeDef M24LR::i2c_GetRFField( M24LR_FIELD_STATUS * const pRF_Field )
rosarium 0:71bff5ad0a49 950 {
rosarium 0:71bff5ad0a49 951 NFCTAG_StatusTypeDef status;
rosarium 0:71bff5ad0a49 952 uint8_t reg_value = 0;
rosarium 0:71bff5ad0a49 953
rosarium 0:71bff5ad0a49 954 /* Read actual value of CTRL register */
rosarium 0:71bff5ad0a49 955 status = i2c_ReadRegister( &reg_value, M24LR_CTRL_REG, 1 );
rosarium 0:71bff5ad0a49 956
rosarium 0:71bff5ad0a49 957 /* Extract RF Field information */
rosarium 0:71bff5ad0a49 958 if( status == NFCTAG_OK )
rosarium 0:71bff5ad0a49 959 {
rosarium 0:71bff5ad0a49 960 if( (reg_value & M24LR_CTRL_FIELD_MASK) == M24LR_CTRL_FIELD_MASK )
rosarium 0:71bff5ad0a49 961 {
rosarium 0:71bff5ad0a49 962 *pRF_Field = M24LR_FIELD_ON;
rosarium 0:71bff5ad0a49 963 }
rosarium 0:71bff5ad0a49 964 else
rosarium 0:71bff5ad0a49 965 {
rosarium 0:71bff5ad0a49 966 *pRF_Field = M24LR_FIELD_OFF;
rosarium 0:71bff5ad0a49 967 }
rosarium 0:71bff5ad0a49 968
rosarium 0:71bff5ad0a49 969 return NFCTAG_OK;
rosarium 0:71bff5ad0a49 970 }
rosarium 0:71bff5ad0a49 971
rosarium 0:71bff5ad0a49 972 return status;
rosarium 0:71bff5ad0a49 973 }
rosarium 0:71bff5ad0a49 974
rosarium 0:71bff5ad0a49 975 /**
rosarium 0:71bff5ad0a49 976 * @brief Check if Write Timing is good
rosarium 0:71bff5ad0a49 977 * @param pT_Prog : M24LR_T_PROG_STATUS pointer of the data to store
rosarium 0:71bff5ad0a49 978 * @retval NFCTAG enum status
rosarium 0:71bff5ad0a49 979 */
rosarium 0:71bff5ad0a49 980 NFCTAG_StatusTypeDef M24LR::i2c_GetTProg( M24LR_T_PROG_STATUS * const pT_Prog )
rosarium 0:71bff5ad0a49 981 {
rosarium 0:71bff5ad0a49 982 NFCTAG_StatusTypeDef status;
rosarium 0:71bff5ad0a49 983 uint8_t reg_value = 0;
rosarium 0:71bff5ad0a49 984
rosarium 0:71bff5ad0a49 985 /* Read actual value of CTRL register */
rosarium 0:71bff5ad0a49 986 status = i2c_ReadRegister( &reg_value, M24LR_CTRL_REG, 1 );
rosarium 0:71bff5ad0a49 987
rosarium 0:71bff5ad0a49 988 /* Extract T-Prog information */
rosarium 0:71bff5ad0a49 989 if( status == NFCTAG_OK )
rosarium 0:71bff5ad0a49 990 {
rosarium 0:71bff5ad0a49 991 if( (reg_value & M24LR_CTRL_TPROG_MASK) == M24LR_CTRL_TPROG_MASK )
rosarium 0:71bff5ad0a49 992 {
rosarium 0:71bff5ad0a49 993 *pT_Prog = M24LR_T_PROG_OK;
rosarium 0:71bff5ad0a49 994 }
rosarium 0:71bff5ad0a49 995 else
rosarium 0:71bff5ad0a49 996 {
rosarium 0:71bff5ad0a49 997 *pT_Prog = M24LR_T_PROG_NO;
rosarium 0:71bff5ad0a49 998 }
rosarium 0:71bff5ad0a49 999
rosarium 0:71bff5ad0a49 1000 return NFCTAG_OK;
rosarium 0:71bff5ad0a49 1001 }
rosarium 0:71bff5ad0a49 1002 else
rosarium 0:71bff5ad0a49 1003 return status;
rosarium 0:71bff5ad0a49 1004 }
rosarium 0:71bff5ad0a49 1005
rosarium 0:71bff5ad0a49 1006 /**
rosarium 0:71bff5ad0a49 1007 * @}
rosarium 0:71bff5ad0a49 1008 */
rosarium 0:71bff5ad0a49 1009
rosarium 0:71bff5ad0a49 1010 /**
rosarium 0:71bff5ad0a49 1011 * @}
rosarium 0:71bff5ad0a49 1012 */
rosarium 0:71bff5ad0a49 1013
rosarium 0:71bff5ad0a49 1014 /**
rosarium 0:71bff5ad0a49 1015 * @}
rosarium 0:71bff5ad0a49 1016 */
rosarium 0:71bff5ad0a49 1017
rosarium 0:71bff5ad0a49 1018 /**
rosarium 0:71bff5ad0a49 1019 * @}
rosarium 0:71bff5ad0a49 1020 */
rosarium 0:71bff5ad0a49 1021
rosarium 0:71bff5ad0a49 1022 /******************* (C) COPYRIGHT 2016 STMicroelectronics *****END OF FILE****/