Complete mbed library/workspace for HelloWorld_NFC02A1

Dependencies:   NDefLib X_NUCLEO_NFC02A1 mbed

Fork of HelloWorld_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.

Example Application

This is just a simple "hello world" style program for the X-NUCLEO-NFC02A1 Dynamic NFC Tag Expansion Board. The program writes a URI link to the M24LR dynamic tag using the synchronous programming model. It then reads back the URI from the tag to display it on terminal. The URI can also be retrieved from an NFC enabled smartphone/tablet.

Committer:
rosarium
Date:
Tue Aug 30 09:18:50 2016 +0000
Revision:
1:11ae12d41082
Parent:
0:892175366555
NDefLib middle-ware library ported on HelloWorld_NFC02A1. Now NFC02A1 using the same middle-ware library as NFC01A1.

Who changed what in which revision?

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