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:
Tue Jul 11 15:23:56 2017 +0000
Revision:
7:b876cdcf095a
Parent:
6:8c1eca41b3a9
Child:
8:7c4cf671960b
Updating with the new mbed library.

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