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:
Wed Jul 27 09:25:33 2016 +0000
Revision:
0:892175366555
Child:
1:11ae12d41082
first release of the complete mbed library for HelloWorld_NFC02A1

Who changed what in which revision?

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