mbed OS 5 example application using X-NUCLEO-NFC02A1

Dependencies:   NDefLib X_NUCLEO_NFC02A1

Fork of HelloWorld_NFC02A1 by ST

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

Who changed what in which revision?

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