mbed OS 5 example application using X-NUCLEO-NFC02A1

Dependencies:   NDefLib X_NUCLEO_NFC02A1

Fork of HelloWorld_NFC02A1 by ST

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****/