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:
Davidroid
Date:
Wed Jul 12 12:34:12 2017 +0000
Revision:
8:7c4cf671960b
Parent:
7:b876cdcf095a
Updated to fit ARM mbed coding style.

Who changed what in which revision?

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