3-Axis Accelerometer

Committer:
mcm
Date:
Wed May 30 15:09:33 2018 +0000
Revision:
3:d8cf2591cab6
Parent:
2:292a5265228e
MC3635 driver was completed and tested, it works as expected ( it was tested using a NUCLEO-L152RE )

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcm 2:292a5265228e 1 /**
mcm 2:292a5265228e 2 * @brief MC3635.h
mcm 2:292a5265228e 3 * @details 3-Axis Accelerometer.
mcm 2:292a5265228e 4 * Function file.
mcm 2:292a5265228e 5 *
mcm 2:292a5265228e 6 *
mcm 2:292a5265228e 7 * @return N/A
mcm 2:292a5265228e 8 *
mcm 2:292a5265228e 9 * @author Manuel Caballero
mcm 2:292a5265228e 10 * @date 30/May/2018
mcm 2:292a5265228e 11 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 12 * @pre N/A.
mcm 2:292a5265228e 13 * @warning N/A
mcm 2:292a5265228e 14 * @pre This code belongs to Nimbus Centre ( http://www.nimbus.cit.ie ).
mcm 2:292a5265228e 15 */
mcm 2:292a5265228e 16
mcm 2:292a5265228e 17 #include "MC3635.h"
mcm 2:292a5265228e 18
mcm 2:292a5265228e 19
mcm 2:292a5265228e 20 MC3635::MC3635 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq )
mcm 2:292a5265228e 21 : _i2c ( sda, scl )
mcm 2:292a5265228e 22 , _MC3635_Addr ( addr )
mcm 2:292a5265228e 23 {
mcm 2:292a5265228e 24 _i2c.frequency( freq );
mcm 2:292a5265228e 25 }
mcm 2:292a5265228e 26
mcm 2:292a5265228e 27
mcm 2:292a5265228e 28 MC3635::~MC3635()
mcm 2:292a5265228e 29 {
mcm 2:292a5265228e 30 }
mcm 2:292a5265228e 31
mcm 2:292a5265228e 32
mcm 2:292a5265228e 33
mcm 2:292a5265228e 34 /**
mcm 2:292a5265228e 35 * @brief MC3635_SetStandbyMode ( void )
mcm 2:292a5265228e 36 *
mcm 2:292a5265228e 37 * @details It puts the device into the STANDBY mode.
mcm 2:292a5265228e 38 *
mcm 2:292a5265228e 39 * @param[in] N/A.
mcm 2:292a5265228e 40 *
mcm 2:292a5265228e 41 * @param[out] N/A.
mcm 2:292a5265228e 42 *
mcm 2:292a5265228e 43 *
mcm 2:292a5265228e 44 * @return Status of MC3635_SetStandbyMode.
mcm 2:292a5265228e 45 *
mcm 2:292a5265228e 46 *
mcm 2:292a5265228e 47 *
mcm 2:292a5265228e 48 * @author Manuel Caballero
mcm 2:292a5265228e 49 * @date 30/May/2018
mcm 2:292a5265228e 50 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 51 * @pre N/A.
mcm 2:292a5265228e 52 * @warning N/A.
mcm 2:292a5265228e 53 */
mcm 2:292a5265228e 54 MC3635::MC3635_status_t MC3635::MC3635_SetStandbyMode ( void )
mcm 2:292a5265228e 55 {
mcm 2:292a5265228e 56 char cmd[] = { MODE_C, 0 };
mcm 2:292a5265228e 57 uint32_t aux = 0;
mcm 2:292a5265228e 58
mcm 2:292a5265228e 59
mcm 2:292a5265228e 60 /* Get the register data */
mcm 2:292a5265228e 61 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 62 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 63
mcm 2:292a5265228e 64
mcm 2:292a5265228e 65 /* Update the register data */
mcm 2:292a5265228e 66 cmd[1] &= ~MODE_C_MCTRL_MASK;
mcm 2:292a5265228e 67 cmd[1] |= MODE_C_MCTRL_STANDBY;
mcm 2:292a5265228e 68 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 69
mcm 2:292a5265228e 70
mcm 2:292a5265228e 71
mcm 2:292a5265228e 72
mcm 2:292a5265228e 73 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 74 return MC3635_SUCCESS;
mcm 2:292a5265228e 75 else
mcm 2:292a5265228e 76 return MC3635_FAILURE;
mcm 2:292a5265228e 77 }
mcm 2:292a5265228e 78
mcm 2:292a5265228e 79
mcm 2:292a5265228e 80
mcm 2:292a5265228e 81 /**
mcm 2:292a5265228e 82 * @brief MC3635_SetSleepMode ( void )
mcm 2:292a5265228e 83 *
mcm 2:292a5265228e 84 * @details It puts the device into the SLEEP mode.
mcm 2:292a5265228e 85 *
mcm 2:292a5265228e 86 * @param[in] N/A.
mcm 2:292a5265228e 87 *
mcm 2:292a5265228e 88 * @param[out] N/A.
mcm 2:292a5265228e 89 *
mcm 2:292a5265228e 90 *
mcm 2:292a5265228e 91 * @return Status of MC3635_SetSleepMode.
mcm 2:292a5265228e 92 *
mcm 2:292a5265228e 93 *
mcm 2:292a5265228e 94 *
mcm 2:292a5265228e 95 * @author Manuel Caballero
mcm 2:292a5265228e 96 * @date 30/May/2018
mcm 2:292a5265228e 97 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 98 * @pre N/A.
mcm 2:292a5265228e 99 * @warning N/A.
mcm 2:292a5265228e 100 */
mcm 2:292a5265228e 101 MC3635::MC3635_status_t MC3635::MC3635_SetSleepMode ( void )
mcm 2:292a5265228e 102 {
mcm 2:292a5265228e 103 char cmd[] = { MODE_C, 0 };
mcm 2:292a5265228e 104 uint32_t aux = 0;
mcm 2:292a5265228e 105
mcm 2:292a5265228e 106
mcm 2:292a5265228e 107 /* Get the register data */
mcm 2:292a5265228e 108 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 109 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 110
mcm 2:292a5265228e 111
mcm 2:292a5265228e 112 /* Update the register data */
mcm 2:292a5265228e 113 cmd[1] &= ~MODE_C_MCTRL_MASK;
mcm 2:292a5265228e 114 cmd[1] |= MODE_C_MCTRL_SLEEP;
mcm 2:292a5265228e 115 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 116
mcm 2:292a5265228e 117
mcm 2:292a5265228e 118
mcm 2:292a5265228e 119
mcm 2:292a5265228e 120 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 121 return MC3635_SUCCESS;
mcm 2:292a5265228e 122 else
mcm 2:292a5265228e 123 return MC3635_FAILURE;
mcm 2:292a5265228e 124 }
mcm 2:292a5265228e 125
mcm 2:292a5265228e 126
mcm 2:292a5265228e 127 /**
mcm 2:292a5265228e 128 * @brief MC3635_InitializationSequence ( void )
mcm 2:292a5265228e 129 *
mcm 2:292a5265228e 130 * @details It starts an initialization sequence ( recommended sequence ).
mcm 2:292a5265228e 131 *
mcm 2:292a5265228e 132 * @param[in] N/A.
mcm 2:292a5265228e 133 *
mcm 2:292a5265228e 134 * @param[out] N/A.
mcm 2:292a5265228e 135 *
mcm 2:292a5265228e 136 *
mcm 2:292a5265228e 137 * @return Status of MC3635_InitializationSequence.
mcm 2:292a5265228e 138 *
mcm 2:292a5265228e 139 *
mcm 2:292a5265228e 140 *
mcm 2:292a5265228e 141 * @author Manuel Caballero
mcm 2:292a5265228e 142 * @date 30/May/2018
mcm 2:292a5265228e 143 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 144 * @pre Data sheet APS-048-0044v1.5 p.22
mcm 2:292a5265228e 145 * @warning The device MUST be in STANDBY mode, the user has to call this function
mcm 2:292a5265228e 146 * first: MC3635_SetStandbyMode.
mcm 2:292a5265228e 147 */
mcm 2:292a5265228e 148 MC3635::MC3635_status_t MC3635::MC3635_InitializationSequence ( void )
mcm 2:292a5265228e 149 {
mcm 2:292a5265228e 150 char cmd[] = { 0, 0 };
mcm 2:292a5265228e 151 uint32_t aux = 0;
mcm 2:292a5265228e 152
mcm 2:292a5265228e 153
mcm 2:292a5265228e 154 /* Feature 1: Specify Interface */
mcm 2:292a5265228e 155 cmd[0] = FREG_1;
mcm 2:292a5265228e 156 cmd[1] = FREG_1_I2C_EN_ENABLED;
mcm 2:292a5265228e 157 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 158
mcm 2:292a5265228e 159 /* Initialization Register 1 */
mcm 2:292a5265228e 160 cmd[0] = INIT_1;
mcm 2:292a5265228e 161 cmd[1] = INIT_1_INIT_1_FIXED_VALUE;
mcm 2:292a5265228e 162 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 163
mcm 2:292a5265228e 164 /* Drive Motion X */
mcm 2:292a5265228e 165 cmd[0] = DMX;
mcm 2:292a5265228e 166 cmd[1] = 0x01;
mcm 2:292a5265228e 167 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 168
mcm 2:292a5265228e 169 /* Drive Motion Y */
mcm 2:292a5265228e 170 cmd[0] = DMY;
mcm 2:292a5265228e 171 cmd[1] = 0x80;
mcm 2:292a5265228e 172 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 173
mcm 2:292a5265228e 174 /* Initialization Register 2 */
mcm 2:292a5265228e 175 cmd[0] = INIT_2;
mcm 2:292a5265228e 176 cmd[1] = INIT_2_INT_2_FIXED_VALUE;
mcm 2:292a5265228e 177 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 178
mcm 2:292a5265228e 179 /* Initialization Register 3 */
mcm 2:292a5265228e 180 cmd[0] = INIT_3;
mcm 2:292a5265228e 181 cmd[1] = INIT_3_INT_3_FIXED_VALUE;
mcm 2:292a5265228e 182 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 183
mcm 2:292a5265228e 184
mcm 2:292a5265228e 185
mcm 2:292a5265228e 186 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 187 return MC3635_SUCCESS;
mcm 2:292a5265228e 188 else
mcm 2:292a5265228e 189 return MC3635_FAILURE;
mcm 2:292a5265228e 190 }
mcm 2:292a5265228e 191
mcm 2:292a5265228e 192
mcm 2:292a5265228e 193 /**
mcm 2:292a5265228e 194 * @brief MC3635_WriteScratchpadRegister ( MC3635_data_t )
mcm 2:292a5265228e 195 *
mcm 2:292a5265228e 196 * @details This register can store any 8-bit value and has no effect on hardware.
mcm 2:292a5265228e 197 *
mcm 2:292a5265228e 198 * @param[in] myScratchpadRegister: Data to be written.
mcm 2:292a5265228e 199 *
mcm 2:292a5265228e 200 * @param[out] N/A.
mcm 2:292a5265228e 201 *
mcm 2:292a5265228e 202 *
mcm 2:292a5265228e 203 * @return Status of MC3635_WriteScratchpadRegister.
mcm 2:292a5265228e 204 *
mcm 2:292a5265228e 205 *
mcm 2:292a5265228e 206 *
mcm 2:292a5265228e 207 * @author Manuel Caballero
mcm 2:292a5265228e 208 * @date 30/May/2018
mcm 2:292a5265228e 209 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 210 * @pre N/A
mcm 2:292a5265228e 211 * @warning The device MUST be in STANDBY mode, the user has to call this function
mcm 2:292a5265228e 212 * first: MC3635_SetStandbyMode.
mcm 2:292a5265228e 213 */
mcm 2:292a5265228e 214 MC3635::MC3635_status_t MC3635::MC3635_WriteScratchpadRegister ( MC3635_data_t myScratchpadRegister )
mcm 2:292a5265228e 215 {
mcm 2:292a5265228e 216 char cmd[] = { 0, 0 };
mcm 2:292a5265228e 217 uint32_t aux = 0;
mcm 2:292a5265228e 218
mcm 2:292a5265228e 219
mcm 2:292a5265228e 220 /* Write the data */
mcm 2:292a5265228e 221 cmd[0] = SCRATCH;
mcm 2:292a5265228e 222 cmd[1] = myScratchpadRegister.scratch;
mcm 2:292a5265228e 223 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 224
mcm 2:292a5265228e 225
mcm 2:292a5265228e 226
mcm 2:292a5265228e 227
mcm 2:292a5265228e 228 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 229 return MC3635_SUCCESS;
mcm 2:292a5265228e 230 else
mcm 2:292a5265228e 231 return MC3635_FAILURE;
mcm 2:292a5265228e 232 }
mcm 2:292a5265228e 233
mcm 2:292a5265228e 234
mcm 2:292a5265228e 235
mcm 2:292a5265228e 236 /**
mcm 2:292a5265228e 237 * @brief MC3635_ReadScratchpadRegister ( MC3635_data_t* )
mcm 2:292a5265228e 238 *
mcm 2:292a5265228e 239 * @details It reads the scratch pad register.
mcm 2:292a5265228e 240 *
mcm 2:292a5265228e 241 * @param[in] N/A
mcm 2:292a5265228e 242 *
mcm 2:292a5265228e 243 * @param[out] myScratchpadRegister: Data into SCRATCH register.
mcm 2:292a5265228e 244 *
mcm 2:292a5265228e 245 *
mcm 2:292a5265228e 246 * @return Status of MC3635_ReadScratchpadRegister.
mcm 2:292a5265228e 247 *
mcm 2:292a5265228e 248 *
mcm 2:292a5265228e 249 *
mcm 2:292a5265228e 250 * @author Manuel Caballero
mcm 2:292a5265228e 251 * @date 30/May/2018
mcm 2:292a5265228e 252 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 253 * @pre N/A
mcm 2:292a5265228e 254 * @warning N/A.
mcm 2:292a5265228e 255 */
mcm 2:292a5265228e 256 MC3635::MC3635_status_t MC3635::MC3635_ReadScratchpadRegister ( MC3635_data_t* myScratchpadRegister )
mcm 2:292a5265228e 257 {
mcm 2:292a5265228e 258 char cmd = SCRATCH;
mcm 2:292a5265228e 259 uint32_t aux = 0;
mcm 2:292a5265228e 260
mcm 2:292a5265228e 261 /* Get the data */
mcm 2:292a5265228e 262 aux = _i2c.write ( _MC3635_Addr, &cmd, 1, true );
mcm 2:292a5265228e 263 aux = _i2c.read ( _MC3635_Addr, &cmd, 1 );
mcm 2:292a5265228e 264
mcm 2:292a5265228e 265 /* Update the value */
mcm 2:292a5265228e 266 myScratchpadRegister->scratch = cmd;
mcm 2:292a5265228e 267
mcm 2:292a5265228e 268
mcm 2:292a5265228e 269
mcm 2:292a5265228e 270 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 271 return MC3635_SUCCESS;
mcm 2:292a5265228e 272 else
mcm 2:292a5265228e 273 return MC3635_FAILURE;
mcm 2:292a5265228e 274 }
mcm 2:292a5265228e 275
mcm 2:292a5265228e 276
mcm 2:292a5265228e 277
mcm 2:292a5265228e 278 /**
mcm 2:292a5265228e 279 * @brief MC3635_SetSoftwareReset ( void )
mcm 2:292a5265228e 280 *
mcm 2:292a5265228e 281 * @details It performs a software reset.
mcm 2:292a5265228e 282 *
mcm 2:292a5265228e 283 * @param[in] N/A.
mcm 2:292a5265228e 284 *
mcm 2:292a5265228e 285 * @param[out] N/A.
mcm 2:292a5265228e 286 *
mcm 2:292a5265228e 287 *
mcm 2:292a5265228e 288 * @return Status of MC3635_SetSoftwareReset.
mcm 2:292a5265228e 289 *
mcm 2:292a5265228e 290 *
mcm 2:292a5265228e 291 *
mcm 2:292a5265228e 292 * @author Manuel Caballero
mcm 2:292a5265228e 293 * @date 30/May/2018
mcm 2:292a5265228e 294 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 295 * @pre N/A
mcm 2:292a5265228e 296 * @warning Immediately after a RESET or power-up event, several registers must be written with initialization values,
mcm 2:292a5265228e 297 * MC3635_InitializationSequence MUST be called.
mcm 2:292a5265228e 298 * @warning It takes reset to be completed at least 1ms, the user MUST take care of this delay.
mcm 2:292a5265228e 299 */
mcm 2:292a5265228e 300 MC3635::MC3635_status_t MC3635::MC3635_SetSoftwareReset ( void )
mcm 2:292a5265228e 301 {
mcm 2:292a5265228e 302 char cmd[] = { RESET , 0 };
mcm 2:292a5265228e 303 uint32_t aux = 0;
mcm 2:292a5265228e 304
mcm 2:292a5265228e 305
mcm 2:292a5265228e 306 /* Get the register data */
mcm 2:292a5265228e 307 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 308 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 309
mcm 2:292a5265228e 310 cmd[1] |= RESET_RESET_FORCE_POWER_ON_RESET;
mcm 2:292a5265228e 311
mcm 2:292a5265228e 312 /* Write into the register */
mcm 2:292a5265228e 313 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 314
mcm 2:292a5265228e 315
mcm 2:292a5265228e 316
mcm 2:292a5265228e 317 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 318 return MC3635_SUCCESS;
mcm 2:292a5265228e 319 else
mcm 2:292a5265228e 320 return MC3635_FAILURE;
mcm 2:292a5265228e 321 }
mcm 2:292a5265228e 322
mcm 2:292a5265228e 323
mcm 2:292a5265228e 324
mcm 2:292a5265228e 325 /**
mcm 2:292a5265228e 326 * @brief MC3635_SetReload ( void )
mcm 2:292a5265228e 327 *
mcm 2:292a5265228e 328 * @details It performs a reload.
mcm 2:292a5265228e 329 *
mcm 2:292a5265228e 330 * @param[in] N/A.
mcm 2:292a5265228e 331 *
mcm 2:292a5265228e 332 * @param[out] N/A.
mcm 2:292a5265228e 333 *
mcm 2:292a5265228e 334 *
mcm 2:292a5265228e 335 * @return Status of MC3635_SetReload.
mcm 2:292a5265228e 336 *
mcm 2:292a5265228e 337 *
mcm 2:292a5265228e 338 *
mcm 2:292a5265228e 339 * @author Manuel Caballero
mcm 2:292a5265228e 340 * @date 30/May/2018
mcm 2:292a5265228e 341 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 342 * @pre This bit must be cleared by software.
mcm 2:292a5265228e 343 * @warning It takes reset to be completed at least 1ms, the user MUST take care of this delay.
mcm 2:292a5265228e 344 * @warning The device MUST be in STANDBY mode, the user has to call this function
mcm 2:292a5265228e 345 * first: MC3635_SetStandbyMode.
mcm 2:292a5265228e 346 */
mcm 2:292a5265228e 347 MC3635::MC3635_status_t MC3635::MC3635_SetReload ( void )
mcm 2:292a5265228e 348 {
mcm 2:292a5265228e 349 char cmd[] = { RESET , 0 };
mcm 2:292a5265228e 350 uint32_t myTimeOut = 23232323;
mcm 2:292a5265228e 351 uint32_t aux = 0;
mcm 2:292a5265228e 352
mcm 2:292a5265228e 353
mcm 2:292a5265228e 354 /* Get the register data */
mcm 2:292a5265228e 355 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 356 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 357
mcm 2:292a5265228e 358 cmd[1] |= RESET_RELOAD_RELOAD_REGISTER_FROM_OTP;
mcm 2:292a5265228e 359
mcm 2:292a5265228e 360
mcm 2:292a5265228e 361 /* Write into the register */
mcm 2:292a5265228e 362 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 363
mcm 2:292a5265228e 364
mcm 2:292a5265228e 365 /* Wait until the action was DONE */
mcm 2:292a5265228e 366 cmd[0] = EXT_STAT_2;
mcm 2:292a5265228e 367 do {
mcm 2:292a5265228e 368 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 369 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 370 myTimeOut--;
mcm 2:292a5265228e 371 } while ( ( ( cmd[1] & EXT_STAT_2_OTP_BUSY_MASK ) == EXT_STAT_2_OTP_BUSY_OTP_POWERED ) && ( myTimeOut > 0 ) );
mcm 2:292a5265228e 372
mcm 2:292a5265228e 373
mcm 2:292a5265228e 374 /* Clear the flag */
mcm 2:292a5265228e 375 cmd[0] = RESET;
mcm 2:292a5265228e 376 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 377 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 378
mcm 2:292a5265228e 379 cmd[1] &= ~RESET_RELOAD_MASK;
mcm 2:292a5265228e 380 cmd[1] |= RESET_RELOAD_NORMAL_OPERATION;
mcm 2:292a5265228e 381 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 382
mcm 2:292a5265228e 383
mcm 2:292a5265228e 384
mcm 2:292a5265228e 385
mcm 2:292a5265228e 386 if ( ( aux == I2C_SUCCESS ) && ( myTimeOut > 0 ) )
mcm 2:292a5265228e 387 return MC3635_SUCCESS;
mcm 2:292a5265228e 388 else
mcm 2:292a5265228e 389 return MC3635_FAILURE;
mcm 2:292a5265228e 390 }
mcm 2:292a5265228e 391
mcm 2:292a5265228e 392
mcm 2:292a5265228e 393
mcm 2:292a5265228e 394 /**
mcm 2:292a5265228e 395 * @brief MC3635_ReadExtendedStatusRegister2 ( MC3635_data_t* )
mcm 2:292a5265228e 396 *
mcm 2:292a5265228e 397 * @details It reads the Extended Status Register 2.
mcm 2:292a5265228e 398 *
mcm 2:292a5265228e 399 * @param[in] N/A.
mcm 2:292a5265228e 400 *
mcm 2:292a5265228e 401 * @param[out] myExt_stat_2: The data of the register.
mcm 2:292a5265228e 402 *
mcm 2:292a5265228e 403 *
mcm 2:292a5265228e 404 * @return Status of MC3635_ReadExtendedStatusRegister2.
mcm 2:292a5265228e 405 *
mcm 2:292a5265228e 406 *
mcm 2:292a5265228e 407 *
mcm 2:292a5265228e 408 * @author Manuel Caballero
mcm 2:292a5265228e 409 * @date 30/May/2018
mcm 2:292a5265228e 410 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 411 * @pre N/A
mcm 2:292a5265228e 412 * @warning N/A.
mcm 2:292a5265228e 413 */
mcm 2:292a5265228e 414 MC3635::MC3635_status_t MC3635::MC3635_ReadExtendedStatusRegister2 ( MC3635_data_t* myExt_stat_2 )
mcm 2:292a5265228e 415 {
mcm 2:292a5265228e 416 char cmd = EXT_STAT_2;
mcm 2:292a5265228e 417 uint32_t aux = 0;
mcm 2:292a5265228e 418
mcm 2:292a5265228e 419
mcm 2:292a5265228e 420 /* Get the register data */
mcm 2:292a5265228e 421 aux = _i2c.write ( _MC3635_Addr, &cmd, 1, true );
mcm 2:292a5265228e 422 aux = _i2c.read ( _MC3635_Addr, &cmd, 1 );
mcm 2:292a5265228e 423
mcm 2:292a5265228e 424 /* Update the value */
mcm 2:292a5265228e 425 myExt_stat_2->ext_stat_2 = cmd;
mcm 2:292a5265228e 426
mcm 2:292a5265228e 427
mcm 2:292a5265228e 428
mcm 2:292a5265228e 429 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 430 return MC3635_SUCCESS;
mcm 2:292a5265228e 431 else
mcm 2:292a5265228e 432 return MC3635_FAILURE;
mcm 2:292a5265228e 433 }
mcm 2:292a5265228e 434
mcm 2:292a5265228e 435
mcm 2:292a5265228e 436
mcm 2:292a5265228e 437 /**
mcm 2:292a5265228e 438 * @brief MC3635_ReadRawData ( MC3635_data_t* )
mcm 2:292a5265228e 439 *
mcm 2:292a5265228e 440 * @details It reads X, Y and Z raw data output.
mcm 2:292a5265228e 441 *
mcm 2:292a5265228e 442 * @param[in] N/A.
mcm 2:292a5265228e 443 *
mcm 2:292a5265228e 444 * @param[out] myRawData: Raw data for X, Y and Z axis.
mcm 2:292a5265228e 445 *
mcm 2:292a5265228e 446 *
mcm 2:292a5265228e 447 * @return Status of MC3635_ReadRawData.
mcm 2:292a5265228e 448 *
mcm 2:292a5265228e 449 *
mcm 2:292a5265228e 450 *
mcm 2:292a5265228e 451 * @author Manuel Caballero
mcm 2:292a5265228e 452 * @date 30/May/2018
mcm 2:292a5265228e 453 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 454 * @pre N/A
mcm 2:292a5265228e 455 * @warning N/A.
mcm 2:292a5265228e 456 */
mcm 2:292a5265228e 457 MC3635::MC3635_status_t MC3635::MC3635_ReadRawData ( MC3635_data_t* myRawData )
mcm 2:292a5265228e 458 {
mcm 2:292a5265228e 459 char cmd[] = { XOUT_LSB, 0, 0, 0, 0, 0 };
mcm 2:292a5265228e 460 uint32_t aux = 0;
mcm 2:292a5265228e 461
mcm 2:292a5265228e 462
mcm 2:292a5265228e 463 /* Get the register data */
mcm 2:292a5265228e 464 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 465 aux = _i2c.read ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:292a5265228e 466
mcm 2:292a5265228e 467 /* Parse the data */
mcm 2:292a5265228e 468 myRawData->XAxis_mg = cmd[1];
mcm 2:292a5265228e 469 myRawData->XAxis_mg <<= 8;
mcm 2:292a5265228e 470 myRawData->XAxis_mg |= cmd[0];
mcm 2:292a5265228e 471
mcm 2:292a5265228e 472 myRawData->YAxis_mg = cmd[3];
mcm 2:292a5265228e 473 myRawData->YAxis_mg <<= 8;
mcm 2:292a5265228e 474 myRawData->YAxis_mg |= cmd[2];
mcm 2:292a5265228e 475
mcm 2:292a5265228e 476 myRawData->ZAxis_mg = cmd[5];
mcm 2:292a5265228e 477 myRawData->ZAxis_mg <<= 8;
mcm 2:292a5265228e 478 myRawData->ZAxis_mg |= cmd[4];
mcm 2:292a5265228e 479
mcm 2:292a5265228e 480 /* Get the range.
mcm 2:292a5265228e 481 NOTE: 2G and 12-bit are the reference, other values have to be
mcm 2:292a5265228e 482 adapted to the configuration.
mcm 2:292a5265228e 483 This information is NOT in the datasheet, it was calculated
mcm 2:292a5265228e 484 experimentally.
mcm 2:292a5265228e 485 */
mcm 2:292a5265228e 486 MC3635_GetRange ( myRawData );
mcm 2:292a5265228e 487
mcm 2:292a5265228e 488 switch ( myRawData->range ) {
mcm 2:292a5265228e 489 default:
mcm 2:292a5265228e 490 case RANGE_C_RANGE_2G:
mcm 2:292a5265228e 491 // The reference
mcm 2:292a5265228e 492 break;
mcm 2:292a5265228e 493
mcm 2:292a5265228e 494 case RANGE_C_RANGE_4G:
mcm 2:292a5265228e 495 // RANGE_C_RANGE_2G * 2
mcm 2:292a5265228e 496 myRawData->XAxis_mg <<= 1;
mcm 2:292a5265228e 497 myRawData->YAxis_mg <<= 1;
mcm 2:292a5265228e 498 myRawData->ZAxis_mg <<= 1;
mcm 2:292a5265228e 499 break;
mcm 2:292a5265228e 500
mcm 2:292a5265228e 501 case RANGE_C_RANGE_8G:
mcm 2:292a5265228e 502 // RANGE_C_RANGE_2G * 4
mcm 2:292a5265228e 503 myRawData->XAxis_mg <<= 2;
mcm 2:292a5265228e 504 myRawData->YAxis_mg <<= 2;
mcm 2:292a5265228e 505 myRawData->ZAxis_mg <<= 2;
mcm 2:292a5265228e 506 break;
mcm 2:292a5265228e 507
mcm 2:292a5265228e 508 case RANGE_C_RANGE_16G:
mcm 2:292a5265228e 509 // RANGE_C_RANGE_2G * 8
mcm 2:292a5265228e 510 myRawData->XAxis_mg <<= 3;
mcm 2:292a5265228e 511 myRawData->YAxis_mg <<= 3;
mcm 2:292a5265228e 512 myRawData->ZAxis_mg <<= 3;
mcm 2:292a5265228e 513 break;
mcm 2:292a5265228e 514
mcm 2:292a5265228e 515 case RANGE_C_RANGE_12G:
mcm 2:292a5265228e 516 // RANGE_C_RANGE_2G * 6
mcm 2:292a5265228e 517 myRawData->XAxis_mg *= 6.0;
mcm 2:292a5265228e 518 myRawData->YAxis_mg *= 6.0;
mcm 2:292a5265228e 519 myRawData->ZAxis_mg *= 6.0;
mcm 2:292a5265228e 520 break;
mcm 2:292a5265228e 521 }
mcm 2:292a5265228e 522
mcm 2:292a5265228e 523
mcm 2:292a5265228e 524 /* Get the resolution.
mcm 2:292a5265228e 525 NOTE: 2G and 12-bit are the reference, other values have to be
mcm 2:292a5265228e 526 adapted to the configuration.
mcm 2:292a5265228e 527 This information is NOT in the datasheet, it was calculated
mcm 2:292a5265228e 528 experimentally.
mcm 2:292a5265228e 529 */
mcm 2:292a5265228e 530 MC3635_GetResolution ( myRawData );
mcm 2:292a5265228e 531
mcm 2:292a5265228e 532 switch ( myRawData->resolution ) {
mcm 2:292a5265228e 533 default:
mcm 2:292a5265228e 534 case RANGE_C_RES_6_BITS:
mcm 2:292a5265228e 535 // RANGE_C_RES_12_BITS * 64
mcm 2:292a5265228e 536 myRawData->XAxis_mg <<= 6;
mcm 2:292a5265228e 537 myRawData->YAxis_mg <<= 6;
mcm 2:292a5265228e 538 myRawData->ZAxis_mg <<= 6;
mcm 2:292a5265228e 539 break;
mcm 2:292a5265228e 540
mcm 2:292a5265228e 541 case RANGE_C_RES_7_BITS:
mcm 2:292a5265228e 542 // RANGE_C_RES_12_BITS * 32
mcm 2:292a5265228e 543 myRawData->XAxis_mg <<= 5;
mcm 2:292a5265228e 544 myRawData->YAxis_mg <<= 5;
mcm 2:292a5265228e 545 myRawData->ZAxis_mg <<= 5;
mcm 2:292a5265228e 546 break;
mcm 2:292a5265228e 547
mcm 2:292a5265228e 548 case RANGE_C_RES_8_BITS:
mcm 2:292a5265228e 549 // RANGE_C_RES_12_BITS * 16
mcm 2:292a5265228e 550 myRawData->XAxis_mg <<= 4;
mcm 2:292a5265228e 551 myRawData->YAxis_mg <<= 4;
mcm 2:292a5265228e 552 myRawData->ZAxis_mg <<= 4;
mcm 2:292a5265228e 553 break;
mcm 2:292a5265228e 554
mcm 2:292a5265228e 555 case RANGE_C_RES_10_BITS:
mcm 2:292a5265228e 556 // RANGE_C_RES_12_BITS * 4
mcm 2:292a5265228e 557 myRawData->XAxis_mg <<= 2;
mcm 2:292a5265228e 558 myRawData->YAxis_mg <<= 2;
mcm 2:292a5265228e 559 myRawData->ZAxis_mg <<= 2;
mcm 2:292a5265228e 560 break;
mcm 2:292a5265228e 561
mcm 2:292a5265228e 562 case RANGE_C_RES_12_BITS:
mcm 2:292a5265228e 563 // The reference
mcm 2:292a5265228e 564 break;
mcm 2:292a5265228e 565
mcm 2:292a5265228e 566 case RANGE_C_RES_14_BITS:
mcm 2:292a5265228e 567 // RANGE_C_RES_12_BITS / 4
mcm 2:292a5265228e 568 myRawData->XAxis_mg >>= 2;
mcm 2:292a5265228e 569 myRawData->YAxis_mg >>= 2;
mcm 2:292a5265228e 570 myRawData->ZAxis_mg >>= 2;
mcm 2:292a5265228e 571 break;
mcm 2:292a5265228e 572 }
mcm 2:292a5265228e 573
mcm 2:292a5265228e 574
mcm 2:292a5265228e 575
mcm 2:292a5265228e 576 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 577 return MC3635_SUCCESS;
mcm 2:292a5265228e 578 else
mcm 2:292a5265228e 579 return MC3635_FAILURE;
mcm 2:292a5265228e 580 }
mcm 2:292a5265228e 581
mcm 2:292a5265228e 582
mcm 2:292a5265228e 583
mcm 2:292a5265228e 584 /**
mcm 2:292a5265228e 585 * @brief MC3635_ReadStatusRegister1 ( MC3635_data_t* )
mcm 2:292a5265228e 586 *
mcm 2:292a5265228e 587 * @details It reads the Status Register 1.
mcm 2:292a5265228e 588 *
mcm 2:292a5265228e 589 * @param[in] N/A.
mcm 2:292a5265228e 590 *
mcm 2:292a5265228e 591 * @param[out] myStatus_1: The data of the register.
mcm 2:292a5265228e 592 *
mcm 2:292a5265228e 593 *
mcm 2:292a5265228e 594 * @return Status of MC3635_ReadStatusRegister1.
mcm 2:292a5265228e 595 *
mcm 2:292a5265228e 596 *
mcm 2:292a5265228e 597 *
mcm 2:292a5265228e 598 * @author Manuel Caballero
mcm 2:292a5265228e 599 * @date 30/May/2018
mcm 2:292a5265228e 600 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 601 * @pre N/A
mcm 2:292a5265228e 602 * @warning N/A.
mcm 2:292a5265228e 603 */
mcm 2:292a5265228e 604 MC3635::MC3635_status_t MC3635::MC3635_ReadStatusRegister1 ( MC3635_data_t* myStatus_1 )
mcm 2:292a5265228e 605 {
mcm 2:292a5265228e 606 char cmd = STATUS_1;
mcm 2:292a5265228e 607 uint32_t aux = 0;
mcm 2:292a5265228e 608
mcm 2:292a5265228e 609
mcm 2:292a5265228e 610 /* Get the register data */
mcm 2:292a5265228e 611 aux = _i2c.write ( _MC3635_Addr, &cmd, 1, true );
mcm 2:292a5265228e 612 aux = _i2c.read ( _MC3635_Addr, &cmd, 1 );
mcm 2:292a5265228e 613
mcm 2:292a5265228e 614 /* Update the value */
mcm 2:292a5265228e 615 myStatus_1->status_1 = cmd;
mcm 2:292a5265228e 616
mcm 2:292a5265228e 617
mcm 2:292a5265228e 618
mcm 2:292a5265228e 619 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 620 return MC3635_SUCCESS;
mcm 2:292a5265228e 621 else
mcm 2:292a5265228e 622 return MC3635_FAILURE;
mcm 2:292a5265228e 623 }
mcm 2:292a5265228e 624
mcm 2:292a5265228e 625
mcm 2:292a5265228e 626
mcm 2:292a5265228e 627 /**
mcm 2:292a5265228e 628 * @brief MC3635_ReadStatusRegister2 ( MC3635_data_t* )
mcm 2:292a5265228e 629 *
mcm 2:292a5265228e 630 * @details It reads the Status Register 2.
mcm 2:292a5265228e 631 *
mcm 2:292a5265228e 632 * @param[in] N/A.
mcm 2:292a5265228e 633 *
mcm 2:292a5265228e 634 * @param[out] myStatus_2: The data of the register.
mcm 2:292a5265228e 635 *
mcm 2:292a5265228e 636 *
mcm 2:292a5265228e 637 * @return Status of MC3635_ReadStatusRegister2.
mcm 2:292a5265228e 638 *
mcm 2:292a5265228e 639 *
mcm 2:292a5265228e 640 *
mcm 2:292a5265228e 641 * @author Manuel Caballero
mcm 2:292a5265228e 642 * @date 30/May/2018
mcm 2:292a5265228e 643 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 644 * @pre N/A
mcm 2:292a5265228e 645 * @warning N/A.
mcm 2:292a5265228e 646 */
mcm 2:292a5265228e 647 MC3635::MC3635_status_t MC3635::MC3635_ReadStatusRegister2 ( MC3635_data_t* myStatus_2 )
mcm 2:292a5265228e 648 {
mcm 2:292a5265228e 649 char cmd = STATUS_2;
mcm 2:292a5265228e 650 uint32_t aux = 0;
mcm 2:292a5265228e 651
mcm 2:292a5265228e 652
mcm 2:292a5265228e 653 /* Get the register data */
mcm 2:292a5265228e 654 aux = _i2c.write ( _MC3635_Addr, &cmd, 1, true );
mcm 2:292a5265228e 655 aux = _i2c.read ( _MC3635_Addr, &cmd, 1 );
mcm 2:292a5265228e 656
mcm 2:292a5265228e 657 /* Update the value */
mcm 2:292a5265228e 658 myStatus_2->status_2 = cmd;
mcm 2:292a5265228e 659
mcm 2:292a5265228e 660
mcm 2:292a5265228e 661
mcm 2:292a5265228e 662 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 663 return MC3635_SUCCESS;
mcm 2:292a5265228e 664 else
mcm 2:292a5265228e 665 return MC3635_FAILURE;
mcm 2:292a5265228e 666 }
mcm 2:292a5265228e 667
mcm 2:292a5265228e 668
mcm 2:292a5265228e 669
mcm 2:292a5265228e 670 /**
mcm 2:292a5265228e 671 * @brief MC3635_ReadFeatureRegister1 ( MC3635_data_t* )
mcm 2:292a5265228e 672 *
mcm 2:292a5265228e 673 * @details It reads the Feature Register 1.
mcm 2:292a5265228e 674 *
mcm 2:292a5265228e 675 * @param[in] N/A.
mcm 2:292a5265228e 676 *
mcm 2:292a5265228e 677 * @param[out] myFeatureRegister1: The data of the register.
mcm 2:292a5265228e 678 *
mcm 2:292a5265228e 679 *
mcm 2:292a5265228e 680 * @return Status of MC3635_ReadFeatureRegister1.
mcm 2:292a5265228e 681 *
mcm 2:292a5265228e 682 *
mcm 2:292a5265228e 683 *
mcm 2:292a5265228e 684 * @author Manuel Caballero
mcm 2:292a5265228e 685 * @date 30/May/2018
mcm 2:292a5265228e 686 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 687 * @pre N/A
mcm 2:292a5265228e 688 * @warning N/A.
mcm 2:292a5265228e 689 */
mcm 2:292a5265228e 690 MC3635::MC3635_status_t MC3635::MC3635_ReadFeatureRegister1 ( MC3635_data_t* myFeatureRegister1 )
mcm 2:292a5265228e 691 {
mcm 2:292a5265228e 692 char cmd = FREG_1;
mcm 2:292a5265228e 693 uint32_t aux = 0;
mcm 2:292a5265228e 694
mcm 2:292a5265228e 695
mcm 2:292a5265228e 696 /* Get the register data */
mcm 2:292a5265228e 697 aux = _i2c.write ( _MC3635_Addr, &cmd, 1, true );
mcm 2:292a5265228e 698 aux = _i2c.read ( _MC3635_Addr, &cmd, 1 );
mcm 2:292a5265228e 699
mcm 2:292a5265228e 700 /* Update the value */
mcm 2:292a5265228e 701 myFeatureRegister1->FeatureRegister1 = cmd;
mcm 2:292a5265228e 702
mcm 2:292a5265228e 703
mcm 2:292a5265228e 704 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 705 return MC3635_SUCCESS;
mcm 2:292a5265228e 706 else
mcm 2:292a5265228e 707 return MC3635_FAILURE;
mcm 2:292a5265228e 708 }
mcm 2:292a5265228e 709
mcm 2:292a5265228e 710
mcm 2:292a5265228e 711
mcm 2:292a5265228e 712 /**
mcm 2:292a5265228e 713 * @brief MC3635_ReadFeatureRegister2 ( MC3635_data_t* )
mcm 2:292a5265228e 714 *
mcm 2:292a5265228e 715 * @details It reads the Feature Register 2.
mcm 2:292a5265228e 716 *
mcm 2:292a5265228e 717 * @param[in] N/A.
mcm 2:292a5265228e 718 *
mcm 2:292a5265228e 719 * @param[out] myFeatureRegister2: The data of the register.
mcm 2:292a5265228e 720 *
mcm 2:292a5265228e 721 *
mcm 2:292a5265228e 722 * @return Status of MC3635_ReadFeatureRegister2.
mcm 2:292a5265228e 723 *
mcm 2:292a5265228e 724 *
mcm 2:292a5265228e 725 *
mcm 2:292a5265228e 726 * @author Manuel Caballero
mcm 2:292a5265228e 727 * @date 30/May/2018
mcm 2:292a5265228e 728 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 729 * @pre N/A
mcm 2:292a5265228e 730 * @warning N/A.
mcm 2:292a5265228e 731 */
mcm 2:292a5265228e 732 MC3635::MC3635_status_t MC3635::MC3635_ReadFeatureRegister2 ( MC3635_data_t* myFeatureRegister2 )
mcm 2:292a5265228e 733 {
mcm 2:292a5265228e 734 char cmd = FREG_2;
mcm 2:292a5265228e 735 uint32_t aux = 0;
mcm 2:292a5265228e 736
mcm 2:292a5265228e 737
mcm 2:292a5265228e 738 /* Get the register data */
mcm 2:292a5265228e 739 aux = _i2c.write ( _MC3635_Addr, &cmd, 1, true );
mcm 2:292a5265228e 740 aux = _i2c.read ( _MC3635_Addr, &cmd, 1 );
mcm 2:292a5265228e 741
mcm 2:292a5265228e 742 /* Update the value */
mcm 2:292a5265228e 743 myFeatureRegister2->FeatureRegister2 = cmd;
mcm 2:292a5265228e 744
mcm 2:292a5265228e 745
mcm 2:292a5265228e 746
mcm 2:292a5265228e 747 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 748 return MC3635_SUCCESS;
mcm 2:292a5265228e 749 else
mcm 2:292a5265228e 750 return MC3635_FAILURE;
mcm 2:292a5265228e 751 }
mcm 2:292a5265228e 752
mcm 2:292a5265228e 753
mcm 2:292a5265228e 754
mcm 2:292a5265228e 755 /**
mcm 2:292a5265228e 756 * @brief MC3635_EnableAxis ( MC3635_mode_c_mctrl_t , MC3635_mode_c_x_axis_pd_t , MC3635_mode_c_y_axis_pd_t , MC3635_mode_c_z_axis_pd_t )
mcm 2:292a5265228e 757 *
mcm 2:292a5265228e 758 * @details It enables/disables X/Y/Z Axis.
mcm 2:292a5265228e 759 *
mcm 2:292a5265228e 760 * @param[in] myXAxis: Enabled/Disabled.
mcm 2:292a5265228e 761 * @param[in] myYAxis: Enabled/Disabled.
mcm 2:292a5265228e 762 * @param[in] myZAxis: Enabled/Disabled.
mcm 2:292a5265228e 763 *
mcm 2:292a5265228e 764 * @param[out] N/A.
mcm 2:292a5265228e 765 *
mcm 2:292a5265228e 766 *
mcm 2:292a5265228e 767 * @return Status of MC3635_EnableAxis.
mcm 2:292a5265228e 768 *
mcm 2:292a5265228e 769 *
mcm 2:292a5265228e 770 *
mcm 2:292a5265228e 771 * @author Manuel Caballero
mcm 2:292a5265228e 772 * @date 30/May/2018
mcm 2:292a5265228e 773 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 774 * @pre N/A.
mcm 2:292a5265228e 775 * @warning The device MUST be in STANDBY mode, the user has to call this function
mcm 2:292a5265228e 776 * first: MC3635_SetStandbyMode.
mcm 2:292a5265228e 777 */
mcm 2:292a5265228e 778 MC3635::MC3635_status_t MC3635::MC3635_EnableAxis ( MC3635_mode_c_x_axis_pd_t myXAxis, MC3635_mode_c_y_axis_pd_t myYAxis, MC3635_mode_c_z_axis_pd_t myZAxis )
mcm 2:292a5265228e 779 {
mcm 2:292a5265228e 780 char cmd[] = { MODE_C, 0 };
mcm 2:292a5265228e 781 uint32_t aux = 0;
mcm 2:292a5265228e 782
mcm 2:292a5265228e 783
mcm 2:292a5265228e 784 /* Update the register data */
mcm 2:292a5265228e 785 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 786 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 787
mcm 2:292a5265228e 788 cmd[1] &= ~( MODE_C_X_AXIS_PD_MASK | MODE_C_Y_AXIS_PD_MASK | MODE_C_Z_AXIS_PD_MASK );
mcm 2:292a5265228e 789 cmd[1] |= ( myXAxis | myYAxis | myZAxis );
mcm 2:292a5265228e 790 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 791
mcm 2:292a5265228e 792
mcm 2:292a5265228e 793
mcm 2:292a5265228e 794
mcm 2:292a5265228e 795 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 796 return MC3635_SUCCESS;
mcm 2:292a5265228e 797 else
mcm 2:292a5265228e 798 return MC3635_FAILURE;
mcm 2:292a5265228e 799 }
mcm 2:292a5265228e 800
mcm 2:292a5265228e 801
mcm 2:292a5265228e 802
mcm 2:292a5265228e 803 /**
mcm 2:292a5265228e 804 * @brief MC3635_SetStandbyClockRate ( MC3635_sniff_c_stb_rate_t )
mcm 2:292a5265228e 805 *
mcm 2:292a5265228e 806 * @details It sets the clock rate for STANDBY mode.
mcm 2:292a5265228e 807 *
mcm 2:292a5265228e 808 * @param[in] mySTANDBY_ClockRate: Wake Power Mode.
mcm 2:292a5265228e 809 *
mcm 2:292a5265228e 810 * @param[out] N/A.
mcm 2:292a5265228e 811 *
mcm 2:292a5265228e 812 *
mcm 2:292a5265228e 813 * @return Status of MC3635_SetStandbyClockRate.
mcm 2:292a5265228e 814 *
mcm 2:292a5265228e 815 *
mcm 2:292a5265228e 816 *
mcm 2:292a5265228e 817 * @author Manuel Caballero
mcm 2:292a5265228e 818 * @date 30/May/2018
mcm 2:292a5265228e 819 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 820 * @pre N/A.
mcm 2:292a5265228e 821 * @warning The device MUST be in STANDBY mode, the user has to call this function
mcm 2:292a5265228e 822 * first: MC3635_SetStandbyMode.
mcm 2:292a5265228e 823 */
mcm 2:292a5265228e 824 MC3635::MC3635_status_t MC3635::MC3635_SetStandbyClockRate ( MC3635_sniff_c_stb_rate_t mySTANDBY_ClockRate )
mcm 2:292a5265228e 825 {
mcm 2:292a5265228e 826 char cmd[] = { SNIFF_C, 0 };
mcm 2:292a5265228e 827 uint32_t aux = 0;
mcm 2:292a5265228e 828
mcm 2:292a5265228e 829
mcm 2:292a5265228e 830 /* Get the register data */
mcm 2:292a5265228e 831 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 832 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 833
mcm 2:292a5265228e 834
mcm 2:292a5265228e 835 /* Update the register data */
mcm 2:292a5265228e 836 cmd[1] &= ~SNIFF_C_STB_RATE_MASK;
mcm 2:292a5265228e 837 cmd[1] |= mySTANDBY_ClockRate;
mcm 2:292a5265228e 838 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 839
mcm 2:292a5265228e 840
mcm 2:292a5265228e 841
mcm 2:292a5265228e 842
mcm 2:292a5265228e 843 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 844 return MC3635_SUCCESS;
mcm 2:292a5265228e 845 else
mcm 2:292a5265228e 846 return MC3635_FAILURE;
mcm 2:292a5265228e 847 }
mcm 2:292a5265228e 848
mcm 2:292a5265228e 849
mcm 2:292a5265228e 850
mcm 2:292a5265228e 851 /**
mcm 2:292a5265228e 852 * @brief MC3635_SetMode ( MC3635_mode_c_mctrl_t , MC3635_power_mode_t , MC3635_sample_rate_t )
mcm 2:292a5265228e 853 *
mcm 2:292a5265228e 854 * @details It sets the device mode, power mode and the ODR.
mcm 2:292a5265228e 855 *
mcm 2:292a5265228e 856 * @param[in] myMode: Device mode: SNIFF, CWAKE or SWAKE.
mcm 2:292a5265228e 857 * @param[in] myPowerMode: Device power mode.
mcm 2:292a5265228e 858 * @param[in] myODR: Sample Rate.
mcm 2:292a5265228e 859 *
mcm 2:292a5265228e 860 * @param[out] N/A.
mcm 2:292a5265228e 861 *
mcm 2:292a5265228e 862 *
mcm 2:292a5265228e 863 * @return Status of MC3635_SetMode.
mcm 2:292a5265228e 864 *
mcm 2:292a5265228e 865 *
mcm 2:292a5265228e 866 *
mcm 2:292a5265228e 867 * @author Manuel Caballero
mcm 2:292a5265228e 868 * @date 30/May/2018
mcm 2:292a5265228e 869 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 870 * @pre If you want to put the device into either STANDBY, SLEEP or TRIG mode, DO NOT use this function,
mcm 2:292a5265228e 871 * just use the its own functions.
mcm 2:292a5265228e 872 * @warning The device MUST be in STANDBY mode, the user has to call this function
mcm 2:292a5265228e 873 * first: MC3635_SetStandbyMode.
mcm 2:292a5265228e 874 */
mcm 2:292a5265228e 875 MC3635::MC3635_status_t MC3635::MC3635_SetMode ( MC3635_mode_c_mctrl_t myMode, MC3635_power_mode_t myPowerMode, MC3635_sample_rate_t myODR )
mcm 2:292a5265228e 876 {
mcm 2:292a5265228e 877 char cmd[] = { 0, 0 };
mcm 2:292a5265228e 878 uint32_t aux = 0;
mcm 2:292a5265228e 879
mcm 2:292a5265228e 880
mcm 2:292a5265228e 881 /* CHECK INVALID MODES */
mcm 2:292a5265228e 882 // TRIG, STANDBY and SLEEP mode have their own function, do NOT use this one!
mcm 2:292a5265228e 883 if ( ( myMode == MODE_C_MCTRL_STANDBY ) || ( myMode == MODE_C_MCTRL_SLEEP ) || ( myMode == MODE_C_MCTRL_TRIG ) ) {
mcm 2:292a5265228e 884 return MC3635_FAILURE;
mcm 2:292a5265228e 885 }
mcm 2:292a5265228e 886
mcm 2:292a5265228e 887 /* POWER MODE */
mcm 2:292a5265228e 888 // Get the register data
mcm 2:292a5265228e 889 cmd[0] = PMCR;
mcm 2:292a5265228e 890 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 891 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 892
mcm 2:292a5265228e 893 if ( myMode == MODE_C_MCTRL_SNIFF ) {
mcm 2:292a5265228e 894 cmd[1] &= ~PMCR_SPM_MASK;
mcm 2:292a5265228e 895 cmd[1] |= ( myPowerMode << 4U );
mcm 2:292a5265228e 896 } else {
mcm 2:292a5265228e 897 cmd[1] &= ~PMCR_CSPM_MASK;
mcm 2:292a5265228e 898 cmd[1] |= ( myPowerMode << 0U );
mcm 2:292a5265228e 899 }
mcm 2:292a5265228e 900
mcm 2:292a5265228e 901 // Update the register
mcm 2:292a5265228e 902 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 903
mcm 2:292a5265228e 904
mcm 2:292a5265228e 905
mcm 2:292a5265228e 906 /* SAMPLE RATE FOR THE GIVEN MODE */
mcm 2:292a5265228e 907 // SNIFF mode
mcm 2:292a5265228e 908 if ( myMode == MODE_C_MCTRL_SNIFF ) {
mcm 2:292a5265228e 909 cmd[0] = SNIFF_C;
mcm 2:292a5265228e 910
mcm 2:292a5265228e 911 switch ( myPowerMode ) {
mcm 2:292a5265228e 912 case ULTRA_LOW_POWER_MODE:
mcm 2:292a5265228e 913 if ( ( myODR == ODR_13 ) || ( myODR == ODR_14 ) ) {
mcm 2:292a5265228e 914 return MC3635_FAILURE;
mcm 2:292a5265228e 915 }
mcm 2:292a5265228e 916 break;
mcm 2:292a5265228e 917
mcm 2:292a5265228e 918 default:
mcm 2:292a5265228e 919 case LOW_POWER_MODE:
mcm 2:292a5265228e 920 if ( ( myODR == ODR_12 ) || ( myODR == ODR_13 ) || ( myODR == ODR_14 ) ) {
mcm 2:292a5265228e 921 return MC3635_FAILURE;
mcm 2:292a5265228e 922 }
mcm 2:292a5265228e 923 break;
mcm 2:292a5265228e 924
mcm 2:292a5265228e 925 case PRECISION:
mcm 2:292a5265228e 926 if ( ( myODR == ODR_9 ) || ( myODR == ODR_10 ) || ( myODR == ODR_11 ) || ( myODR == ODR_12 ) || ( myODR == ODR_13 ) || ( myODR == ODR_14 ) ) {
mcm 2:292a5265228e 927 return MC3635_FAILURE;
mcm 2:292a5265228e 928 }
mcm 2:292a5265228e 929 break;
mcm 2:292a5265228e 930 }
mcm 2:292a5265228e 931 }
mcm 2:292a5265228e 932 // CWAKE and SWAKE mode
mcm 2:292a5265228e 933 else {
mcm 2:292a5265228e 934 cmd[0] = RATE_1;
mcm 2:292a5265228e 935
mcm 2:292a5265228e 936 if ( ( myODR == ODR_0 ) || ( myODR == ODR_1 ) || ( myODR == ODR_2 ) || ( myODR == ODR_3 ) || ( myODR == ODR_4 ) || ( myODR == ODR_13 ) || ( myODR == ODR_14 ) ) {
mcm 2:292a5265228e 937 return MC3635_FAILURE;
mcm 2:292a5265228e 938 } else {
mcm 2:292a5265228e 939 switch ( myPowerMode ) {
mcm 2:292a5265228e 940 case ULTRA_LOW_POWER_MODE:
mcm 2:292a5265228e 941 if ( myODR == ODR_5 ) {
mcm 2:292a5265228e 942 return MC3635_FAILURE;
mcm 2:292a5265228e 943 }
mcm 2:292a5265228e 944 break;
mcm 2:292a5265228e 945
mcm 2:292a5265228e 946 default:
mcm 2:292a5265228e 947 case LOW_POWER_MODE:
mcm 2:292a5265228e 948 if ( myODR == ODR_12 ) {
mcm 2:292a5265228e 949 return MC3635_FAILURE;
mcm 2:292a5265228e 950 }
mcm 2:292a5265228e 951 break;
mcm 2:292a5265228e 952
mcm 2:292a5265228e 953 case PRECISION:
mcm 2:292a5265228e 954 if ( ( myODR == ODR_9 ) || ( myODR == ODR_10 ) || ( myODR == ODR_11 ) || ( myODR == ODR_12 ) ) {
mcm 2:292a5265228e 955 return MC3635_FAILURE;
mcm 2:292a5265228e 956 }
mcm 2:292a5265228e 957 break;
mcm 2:292a5265228e 958 }
mcm 2:292a5265228e 959 }
mcm 2:292a5265228e 960 }
mcm 2:292a5265228e 961
mcm 2:292a5265228e 962
mcm 2:292a5265228e 963 // Check if Specific setup steps are required
mcm 2:292a5265228e 964 if ( myODR == ODR_15 ) {
mcm 2:292a5265228e 965 // Previous steps ( Step 1, Step 2 and Step 3 ) have to be implemented by the user before calling this function
mcm 2:292a5265228e 966 // Step 4 is implemented at the begging of this function.
mcm 2:292a5265228e 967
mcm 2:292a5265228e 968 // Step 5: Point to set wake/sniff settings
mcm 2:292a5265228e 969 cmd[0] = RATE_1;
mcm 2:292a5265228e 970 cmd[1] = 0x10;
mcm 2:292a5265228e 971 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 972
mcm 2:292a5265228e 973 if ( cmd[0] == SNIFF_C ) {
mcm 2:292a5265228e 974 // Step 6: Rate 15 setup 1 for sniff
mcm 2:292a5265228e 975 cmd[0] = TRIGC;
mcm 2:292a5265228e 976 cmd[1] = 0x30;
mcm 2:292a5265228e 977 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 978
mcm 2:292a5265228e 979 // Step 7: Rate 15 setup 2 for sniff
mcm 2:292a5265228e 980 cmd[0] = RATE_1;
mcm 2:292a5265228e 981 cmd[1] = 0x30;
mcm 2:292a5265228e 982 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 983
mcm 2:292a5265228e 984 // Step 8: Rate 15 setup 3 for sniff
mcm 2:292a5265228e 985 cmd[0] = TRIGC;
mcm 2:292a5265228e 986 cmd[1] = 0x01;
mcm 2:292a5265228e 987 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 988
mcm 2:292a5265228e 989 // Step 9: Point to value 1
mcm 2:292a5265228e 990 cmd[0] = RATE_1;
mcm 2:292a5265228e 991 cmd[1] = 0x60;
mcm 2:292a5265228e 992 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 993
mcm 2:292a5265228e 994 // Step 10: Write value 1
mcm 2:292a5265228e 995 cmd[0] = TRIGC;
mcm 2:292a5265228e 996 switch ( myPowerMode ) {
mcm 2:292a5265228e 997 case ULTRA_LOW_POWER_MODE:
mcm 2:292a5265228e 998 cmd[1] = 0x52;
mcm 2:292a5265228e 999 break;
mcm 2:292a5265228e 1000
mcm 2:292a5265228e 1001 default:
mcm 2:292a5265228e 1002 case LOW_POWER_MODE:
mcm 2:292a5265228e 1003 cmd[1] = 0x72;
mcm 2:292a5265228e 1004 break;
mcm 2:292a5265228e 1005
mcm 2:292a5265228e 1006 case PRECISION:
mcm 2:292a5265228e 1007 cmd[1] = 0x32;
mcm 2:292a5265228e 1008 break;
mcm 2:292a5265228e 1009 }
mcm 2:292a5265228e 1010
mcm 2:292a5265228e 1011 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 1012
mcm 2:292a5265228e 1013 // Step 11: Point to value 2
mcm 2:292a5265228e 1014 cmd[0] = RATE_1;
mcm 2:292a5265228e 1015 cmd[1] = 0x70;
mcm 2:292a5265228e 1016 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 1017 } else {
mcm 2:292a5265228e 1018 // Step 6: Rate 15 setup 1 for the given device mode
mcm 2:292a5265228e 1019 cmd[0] = TRIGC;
mcm 2:292a5265228e 1020 cmd[1] = 0x03;
mcm 2:292a5265228e 1021 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 1022
mcm 2:292a5265228e 1023 // Step 7: Rate 15 setup 2 for the given device mode
mcm 2:292a5265228e 1024 cmd[0] = RATE_1;
mcm 2:292a5265228e 1025 cmd[1] = 0x20;
mcm 2:292a5265228e 1026 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 1027
mcm 2:292a5265228e 1028 // Step 8: Rate 15 setup 3 for the given device mode
mcm 2:292a5265228e 1029 cmd[0] = TRIGC;
mcm 2:292a5265228e 1030 cmd[1] = 0x01;
mcm 2:292a5265228e 1031 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 1032
mcm 2:292a5265228e 1033 // Step 9: Point to value 1
mcm 2:292a5265228e 1034 cmd[0] = RATE_1;
mcm 2:292a5265228e 1035 cmd[1] = 0x40;
mcm 2:292a5265228e 1036 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 1037
mcm 2:292a5265228e 1038 // Step 10: Write value 1
mcm 2:292a5265228e 1039 cmd[0] = TRIGC;
mcm 2:292a5265228e 1040 switch ( myPowerMode ) {
mcm 2:292a5265228e 1041 case ULTRA_LOW_POWER_MODE:
mcm 2:292a5265228e 1042 cmd[1] = 0x52;
mcm 2:292a5265228e 1043 break;
mcm 2:292a5265228e 1044
mcm 2:292a5265228e 1045 default:
mcm 2:292a5265228e 1046 case LOW_POWER_MODE:
mcm 2:292a5265228e 1047 cmd[1] = 0x72;
mcm 2:292a5265228e 1048 break;
mcm 2:292a5265228e 1049
mcm 2:292a5265228e 1050 case PRECISION:
mcm 2:292a5265228e 1051 cmd[1] = 0x32;
mcm 2:292a5265228e 1052 break;
mcm 2:292a5265228e 1053 }
mcm 2:292a5265228e 1054
mcm 2:292a5265228e 1055 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 1056
mcm 2:292a5265228e 1057 // Step 11: Point to value 2
mcm 2:292a5265228e 1058 cmd[0] = RATE_1;
mcm 2:292a5265228e 1059 cmd[1] = 0x50;
mcm 2:292a5265228e 1060 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 1061 }
mcm 2:292a5265228e 1062
mcm 2:292a5265228e 1063 // Step 12: Write value 2
mcm 2:292a5265228e 1064 cmd[0] = TRIGC;
mcm 2:292a5265228e 1065 switch ( myPowerMode ) {
mcm 2:292a5265228e 1066 case ULTRA_LOW_POWER_MODE:
mcm 2:292a5265228e 1067 cmd[1] = 0x01;
mcm 2:292a5265228e 1068 break;
mcm 2:292a5265228e 1069
mcm 2:292a5265228e 1070 default:
mcm 2:292a5265228e 1071 case LOW_POWER_MODE:
mcm 2:292a5265228e 1072 cmd[1] = 0x02;
mcm 2:292a5265228e 1073 break;
mcm 2:292a5265228e 1074
mcm 2:292a5265228e 1075 case PRECISION:
mcm 2:292a5265228e 1076 cmd[1] = 0x12;
mcm 2:292a5265228e 1077 break;
mcm 2:292a5265228e 1078 }
mcm 2:292a5265228e 1079 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 1080
mcm 2:292a5265228e 1081 // Step 13: Apply the values
mcm 2:292a5265228e 1082 cmd[0] = RATE_1;
mcm 2:292a5265228e 1083 cmd[1] = 0x0F;
mcm 2:292a5265228e 1084 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 1085 } else {
mcm 2:292a5265228e 1086 // Get the register data
mcm 2:292a5265228e 1087 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 1088 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 1089
mcm 2:292a5265228e 1090
mcm 2:292a5265228e 1091 // Update the register data for the specific mode
mcm 2:292a5265228e 1092 if ( cmd[0] == SNIFF_C ) {
mcm 2:292a5265228e 1093 cmd[1] &= ~SNIFF_C_SNIFF_SR_MASK;
mcm 2:292a5265228e 1094 cmd[1] |= myODR;
mcm 2:292a5265228e 1095 } else {
mcm 2:292a5265228e 1096 cmd[1] &= ~RATE_1_RR_MASK;
mcm 2:292a5265228e 1097 cmd[1] |= myODR;
mcm 2:292a5265228e 1098 }
mcm 2:292a5265228e 1099
mcm 2:292a5265228e 1100 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 1101 }
mcm 2:292a5265228e 1102
mcm 2:292a5265228e 1103
mcm 2:292a5265228e 1104 /* DEVICE MODE */
mcm 2:292a5265228e 1105 // Step 14: Go to the given device mode
mcm 2:292a5265228e 1106 cmd[0] = MODE_C;
mcm 2:292a5265228e 1107 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 1108 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 1109
mcm 2:292a5265228e 1110 cmd[1] &= ~MODE_C_MCTRL_MASK;
mcm 2:292a5265228e 1111 cmd[1] |= myMode;
mcm 2:292a5265228e 1112 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 1113
mcm 2:292a5265228e 1114
mcm 2:292a5265228e 1115
mcm 2:292a5265228e 1116
mcm 2:292a5265228e 1117 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 1118 return MC3635_SUCCESS;
mcm 2:292a5265228e 1119 else
mcm 2:292a5265228e 1120 return MC3635_FAILURE;
mcm 2:292a5265228e 1121 }
mcm 2:292a5265228e 1122
mcm 2:292a5265228e 1123
mcm 2:292a5265228e 1124
mcm 2:292a5265228e 1125 /**
mcm 2:292a5265228e 1126 * @brief MC3635_SetTriggerMode ( MC3635_mode_c_trig_cmd_t , uint8_t , MC3635_sniff_c_stb_rate_t )
mcm 2:292a5265228e 1127 *
mcm 2:292a5265228e 1128 * @details It sets the TRIGGER mode.
mcm 2:292a5265228e 1129 *
mcm 2:292a5265228e 1130 * @param[in] myTriggerEnable: Enable/Disable Trigger mode.
mcm 2:292a5265228e 1131 * @param[in] myTriggerSamples: Number of samples for the trigger mode.
mcm 2:292a5265228e 1132 * @param[in] mySTANDBY_ClockRate: ODR for the trigger mode.
mcm 2:292a5265228e 1133 *
mcm 2:292a5265228e 1134 * @param[out] N/A.
mcm 2:292a5265228e 1135 *
mcm 2:292a5265228e 1136 *
mcm 2:292a5265228e 1137 * @return Status of MC3635_SetTriggerMode.
mcm 2:292a5265228e 1138 *
mcm 2:292a5265228e 1139 *
mcm 2:292a5265228e 1140 *
mcm 2:292a5265228e 1141 * @author Manuel Caballero
mcm 2:292a5265228e 1142 * @date 30/May/2018
mcm 2:292a5265228e 1143 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 1144 * @pre N/A.
mcm 2:292a5265228e 1145 * @warning The device MUST be in STANDBY mode, the user has to call this function
mcm 2:292a5265228e 1146 * first: MC3635_SetStandbyMode.
mcm 2:292a5265228e 1147 */
mcm 2:292a5265228e 1148 MC3635::MC3635_status_t MC3635::MC3635_SetTriggerMode ( MC3635_mode_c_trig_cmd_t myTriggerEnable, uint8_t myTriggerSamples,
mcm 2:292a5265228e 1149 MC3635_sniff_c_stb_rate_t mySTANDBY_ClockRate )
mcm 2:292a5265228e 1150 {
mcm 2:292a5265228e 1151 char cmd[] = { 0, 0 };
mcm 2:292a5265228e 1152 uint32_t aux = 0;
mcm 2:292a5265228e 1153
mcm 2:292a5265228e 1154
mcm 2:292a5265228e 1155 if ( myTriggerSamples == 0 ) {
mcm 2:292a5265228e 1156 return MC3635_FAILURE;
mcm 2:292a5265228e 1157 } else {
mcm 2:292a5265228e 1158 /* ODR */
mcm 2:292a5265228e 1159 MC3635_SetStandbyClockRate ( mySTANDBY_ClockRate );
mcm 2:292a5265228e 1160
mcm 2:292a5265228e 1161
mcm 2:292a5265228e 1162 /* NUMBER OF SAMPLES */
mcm 2:292a5265228e 1163 cmd[0] = TRIGC;
mcm 2:292a5265228e 1164 cmd[1] = myTriggerSamples;
mcm 2:292a5265228e 1165 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 1166
mcm 2:292a5265228e 1167
mcm 2:292a5265228e 1168 /* TRIGGER MODE AND ENABLE/DISABLE TRIGGER */
mcm 2:292a5265228e 1169 // Get the register data
mcm 2:292a5265228e 1170 cmd[0] = MODE_C;
mcm 2:292a5265228e 1171 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 1172 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 1173
mcm 2:292a5265228e 1174 // Update the register data
mcm 2:292a5265228e 1175 cmd[1] &= ~( MODE_C_MCTRL_MASK | MODE_C_TRIG_CMD_MASK );
mcm 2:292a5265228e 1176 cmd[1] |= ( MODE_C_MCTRL_TRIG | myTriggerEnable );
mcm 2:292a5265228e 1177 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 1178 }
mcm 2:292a5265228e 1179
mcm 2:292a5265228e 1180
mcm 2:292a5265228e 1181
mcm 2:292a5265228e 1182
mcm 2:292a5265228e 1183 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 1184 return MC3635_SUCCESS;
mcm 2:292a5265228e 1185 else
mcm 2:292a5265228e 1186 return MC3635_FAILURE;
mcm 2:292a5265228e 1187 }
mcm 2:292a5265228e 1188
mcm 2:292a5265228e 1189
mcm 2:292a5265228e 1190
mcm 2:292a5265228e 1191 /**
mcm 2:292a5265228e 1192 * @brief MC3635_ManualSniffReset ( MC3635_sniffcf_c_sniff_reset_t )
mcm 2:292a5265228e 1193 *
mcm 2:292a5265228e 1194 * @details It is a manual reset for the Sniff block.
mcm 2:292a5265228e 1195 *
mcm 2:292a5265228e 1196 * @param[in] mySniffResetBit: Sniff block reset.
mcm 2:292a5265228e 1197 *
mcm 2:292a5265228e 1198 * @param[out] N/A.
mcm 2:292a5265228e 1199 *
mcm 2:292a5265228e 1200 *
mcm 2:292a5265228e 1201 * @return Status of MC3635_ManualSniffReset.
mcm 2:292a5265228e 1202 *
mcm 2:292a5265228e 1203 *
mcm 2:292a5265228e 1204 *
mcm 2:292a5265228e 1205 * @author Manuel Caballero
mcm 2:292a5265228e 1206 * @date 30/May/2018
mcm 2:292a5265228e 1207 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 1208 * @pre N/A.
mcm 2:292a5265228e 1209 * @warning The device MUST be in STANDBY mode, the user has to call this function
mcm 2:292a5265228e 1210 * first: MC3635_SetStandbyMode.
mcm 2:292a5265228e 1211 */
mcm 2:292a5265228e 1212 MC3635::MC3635_status_t MC3635::MC3635_ManualSniffReset ( MC3635_sniffcf_c_sniff_reset_t mySniffResetBit )
mcm 2:292a5265228e 1213 {
mcm 2:292a5265228e 1214 char cmd[] = { SNIFFCF_C, 0 };
mcm 2:292a5265228e 1215 uint32_t aux = 0;
mcm 2:292a5265228e 1216
mcm 2:292a5265228e 1217
mcm 2:292a5265228e 1218 // Get the register data
mcm 2:292a5265228e 1219 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 1220 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 1221
mcm 2:292a5265228e 1222 // Update the register data
mcm 2:292a5265228e 1223 cmd[1] &= ~SNIFFCF_C_SNIFF_RESET_MASK;
mcm 2:292a5265228e 1224 cmd[1] |= mySniffResetBit;
mcm 2:292a5265228e 1225 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 1226
mcm 2:292a5265228e 1227
mcm 2:292a5265228e 1228
mcm 2:292a5265228e 1229
mcm 2:292a5265228e 1230 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 1231 return MC3635_SUCCESS;
mcm 2:292a5265228e 1232 else
mcm 2:292a5265228e 1233 return MC3635_FAILURE;
mcm 2:292a5265228e 1234 }
mcm 2:292a5265228e 1235
mcm 2:292a5265228e 1236
mcm 2:292a5265228e 1237
mcm 2:292a5265228e 1238 /**
mcm 2:292a5265228e 1239 * @brief MC3635_ConfSniffMode ( MC3635_sniffcf_c_sniff_thadr_t , uint8_t , MC3635_sniffth_c_sniff_and_or_t , MC3635_sniffth_c_sniff_mode_t , MC3635_sniffcf_c_sniff_cnten_t ,
mcm 2:292a5265228e 1240 * MC3635_sniffcf_c_sniff_mux_t )
mcm 2:292a5265228e 1241 *
mcm 2:292a5265228e 1242 * @details It configures the parameters for the SNIFF mode.
mcm 2:292a5265228e 1243 *
mcm 2:292a5265228e 1244 * @param[in] mySniffADR: Sniff block reset.
mcm 2:292a5265228e 1245 * @param[in] mySniffThreshold: Sniff block reset.
mcm 2:292a5265228e 1246 * @param[in] mySniffLogicalMode: Sniff block reset.
mcm 2:292a5265228e 1247 * @param[in] mySniffDeltaCount: Sniff block reset.
mcm 2:292a5265228e 1248 * @param[in] mySniffEnableDetectionCount: Sniff block reset.
mcm 2:292a5265228e 1249 * @param[in] mySniffMux: Sniff block reset.
mcm 2:292a5265228e 1250 *
mcm 2:292a5265228e 1251 * @param[out] N/A.
mcm 2:292a5265228e 1252 *
mcm 2:292a5265228e 1253 *
mcm 2:292a5265228e 1254 * @return Status of MC3635_ConfSniffMode.
mcm 2:292a5265228e 1255 *
mcm 2:292a5265228e 1256 *
mcm 2:292a5265228e 1257 *
mcm 2:292a5265228e 1258 * @author Manuel Caballero
mcm 2:292a5265228e 1259 * @date 30/May/2018
mcm 2:292a5265228e 1260 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 1261 * @pre N/A.
mcm 2:292a5265228e 1262 * @warning The device MUST be in STANDBY mode, the user has to call this function
mcm 2:292a5265228e 1263 * first: MC3635_SetStandbyMode.
mcm 2:292a5265228e 1264 */
mcm 2:292a5265228e 1265 MC3635::MC3635_status_t MC3635::MC3635_ConfSniffMode ( MC3635_sniffcf_c_sniff_thadr_t mySniffADR, uint8_t mySniffThreshold, MC3635_sniffth_c_sniff_and_or_t mySniffLogicalMode,
mcm 2:292a5265228e 1266 MC3635_sniffth_c_sniff_mode_t mySniffDeltaCount, MC3635_sniffcf_c_sniff_cnten_t mySniffEnableDetectionCount, MC3635_sniffcf_c_sniff_mux_t mySniffMux )
mcm 2:292a5265228e 1267 {
mcm 2:292a5265228e 1268 char cmd[] = { 0, 0 };
mcm 2:292a5265228e 1269 uint32_t aux = 0;
mcm 2:292a5265228e 1270
mcm 2:292a5265228e 1271
mcm 2:292a5265228e 1272 /* SNIFF THRESHOLD, LOGICAL MODE and DELTA COUNT */
mcm 2:292a5265228e 1273 // If threshold is selected: 0 <= mySniffThreshold <= 63
mcm 2:292a5265228e 1274 // If detection count is selected: 0 < mySniffThreshold <= 62
mcm 2:292a5265228e 1275 if ( ( ( ( mySniffADR == SNIFFCF_C_SNIFF_THADR_SNIFF_THRESHOLD_X_AXIS ) || ( mySniffADR == SNIFFCF_C_SNIFF_THADR_SNIFF_THRESHOLD_Y_AXIS ) || ( mySniffADR == SNIFFCF_C_SNIFF_THADR_SNIFF_THRESHOLD_Z_AXIS ) ) && ( mySniffThreshold > 63 ) ) ||
mcm 2:292a5265228e 1276 ( ( ( mySniffADR == SNIFFCF_C_SNIFF_THADR_SNIFF_DETECTION_X_AXIS ) || ( mySniffADR == SNIFFCF_C_SNIFF_THADR_SNIFF_DETECTION_Y_AXIS ) || ( mySniffADR == SNIFFCF_C_SNIFF_THADR_SNIFF_DETECTION_Z_AXIS ) ) && ( ( mySniffThreshold == 0 ) || ( mySniffThreshold > 62 ) ) ) ) {
mcm 2:292a5265228e 1277 return MC3635_FAILURE;
mcm 2:292a5265228e 1278 } else {
mcm 2:292a5265228e 1279 // Update the register data
mcm 2:292a5265228e 1280 cmd[0] = SNIFFTH_C;
mcm 2:292a5265228e 1281 cmd[1] = ( mySniffADR | mySniffLogicalMode | mySniffDeltaCount );
mcm 2:292a5265228e 1282 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 1283 }
mcm 2:292a5265228e 1284
mcm 2:292a5265228e 1285 /* SNIFF THRESHOLD ADDRESS, DETECTION COUNT and MUX */
mcm 2:292a5265228e 1286 // Get the register data
mcm 2:292a5265228e 1287 cmd[0] = SNIFFCF_C;
mcm 2:292a5265228e 1288 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 1289 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 1290
mcm 2:292a5265228e 1291 // Update the register data
mcm 2:292a5265228e 1292 cmd[1] &= ~( SNIFFCF_C_SNIFF_THADR_MASK | SNIFFCF_C_SNIFF_CNTEN_MASK | SNIFFCF_C_SNIFF_MUX_MASK );
mcm 2:292a5265228e 1293 cmd[1] |= ( mySniffADR | mySniffEnableDetectionCount | mySniffMux );
mcm 2:292a5265228e 1294 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 1295
mcm 2:292a5265228e 1296
mcm 2:292a5265228e 1297
mcm 2:292a5265228e 1298
mcm 2:292a5265228e 1299
mcm 2:292a5265228e 1300 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 1301 return MC3635_SUCCESS;
mcm 2:292a5265228e 1302 else
mcm 2:292a5265228e 1303 return MC3635_FAILURE;
mcm 2:292a5265228e 1304 }
mcm 2:292a5265228e 1305
mcm 2:292a5265228e 1306
mcm 2:292a5265228e 1307
mcm 2:292a5265228e 1308 /**
mcm 2:292a5265228e 1309 * @brief MC3635_SetResolution ( MC3635_range_c_res_t )
mcm 2:292a5265228e 1310 *
mcm 2:292a5265228e 1311 * @details It sets the accelerometer resolution.
mcm 2:292a5265228e 1312 *
mcm 2:292a5265228e 1313 * @param[in] myResolution: Resolution.
mcm 2:292a5265228e 1314 *
mcm 2:292a5265228e 1315 * @param[out] N/A.
mcm 2:292a5265228e 1316 *
mcm 2:292a5265228e 1317 *
mcm 2:292a5265228e 1318 * @return Status of MC3635_SetResolution.
mcm 2:292a5265228e 1319 *
mcm 2:292a5265228e 1320 *
mcm 2:292a5265228e 1321 *
mcm 2:292a5265228e 1322 * @author Manuel Caballero
mcm 2:292a5265228e 1323 * @date 30/May/2018
mcm 2:292a5265228e 1324 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 1325 * @pre N/A.
mcm 2:292a5265228e 1326 * @warning The device MUST be in STANDBY mode, the user has to call this function
mcm 2:292a5265228e 1327 * first: MC3635_SetStandbyMode.
mcm 2:292a5265228e 1328 */
mcm 2:292a5265228e 1329 MC3635::MC3635_status_t MC3635::MC3635_SetResolution ( MC3635_range_c_res_t myResolution )
mcm 2:292a5265228e 1330 {
mcm 2:292a5265228e 1331 char cmd[] = { RANGE_C, 0 };
mcm 2:292a5265228e 1332 uint32_t aux = 0;
mcm 2:292a5265228e 1333
mcm 2:292a5265228e 1334
mcm 2:292a5265228e 1335 // Get the register data
mcm 2:292a5265228e 1336 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 1337 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 1338
mcm 2:292a5265228e 1339 // Update the register data
mcm 2:292a5265228e 1340 cmd[1] &= ~RANGE_C_RES_MASK;
mcm 2:292a5265228e 1341 cmd[1] |= myResolution;
mcm 2:292a5265228e 1342 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 1343
mcm 2:292a5265228e 1344
mcm 2:292a5265228e 1345
mcm 2:292a5265228e 1346
mcm 2:292a5265228e 1347 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 1348 return MC3635_SUCCESS;
mcm 2:292a5265228e 1349 else
mcm 2:292a5265228e 1350 return MC3635_FAILURE;
mcm 2:292a5265228e 1351 }
mcm 2:292a5265228e 1352
mcm 2:292a5265228e 1353
mcm 2:292a5265228e 1354
mcm 2:292a5265228e 1355 /**
mcm 2:292a5265228e 1356 * @brief MC3635_GetResolution ( MC3635_data_t* )
mcm 2:292a5265228e 1357 *
mcm 2:292a5265228e 1358 * @details It gets the accelerometer resolution.
mcm 2:292a5265228e 1359 *
mcm 2:292a5265228e 1360 * @param[in] myResolution: Accelerometer Resolution.
mcm 2:292a5265228e 1361 *
mcm 2:292a5265228e 1362 * @param[out] N/A.
mcm 2:292a5265228e 1363 *
mcm 2:292a5265228e 1364 *
mcm 2:292a5265228e 1365 * @return Status of MC3635_GetResolution.
mcm 2:292a5265228e 1366 *
mcm 2:292a5265228e 1367 *
mcm 2:292a5265228e 1368 *
mcm 2:292a5265228e 1369 * @author Manuel Caballero
mcm 2:292a5265228e 1370 * @date 30/May/2018
mcm 2:292a5265228e 1371 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 1372 * @pre N/A.
mcm 2:292a5265228e 1373 * @warning N/A.
mcm 2:292a5265228e 1374 */
mcm 2:292a5265228e 1375 MC3635::MC3635_status_t MC3635::MC3635_GetResolution ( MC3635_data_t* myResolution )
mcm 2:292a5265228e 1376 {
mcm 2:292a5265228e 1377 char cmd[] = { RANGE_C, 0 };
mcm 2:292a5265228e 1378 uint32_t aux = 0;
mcm 2:292a5265228e 1379
mcm 2:292a5265228e 1380
mcm 2:292a5265228e 1381 // Get the register data
mcm 2:292a5265228e 1382 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 1383 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 1384
mcm 2:292a5265228e 1385 // Parse the data
mcm 2:292a5265228e 1386 myResolution->resolution = ( MC3635_range_c_res_t )( cmd[1] & RANGE_C_RES_MASK );
mcm 2:292a5265228e 1387
mcm 2:292a5265228e 1388
mcm 2:292a5265228e 1389
mcm 2:292a5265228e 1390 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 1391 return MC3635_SUCCESS;
mcm 2:292a5265228e 1392 else
mcm 2:292a5265228e 1393 return MC3635_FAILURE;
mcm 2:292a5265228e 1394 }
mcm 2:292a5265228e 1395
mcm 2:292a5265228e 1396
mcm 2:292a5265228e 1397
mcm 2:292a5265228e 1398 /**
mcm 2:292a5265228e 1399 * @brief MC3635_SetRange ( MC3635_range_c_range_t )
mcm 2:292a5265228e 1400 *
mcm 2:292a5265228e 1401 * @details It sets the accelerometer range.
mcm 2:292a5265228e 1402 *
mcm 2:292a5265228e 1403 * @param[in] myRange: Range.
mcm 2:292a5265228e 1404 *
mcm 2:292a5265228e 1405 * @param[out] N/A.
mcm 2:292a5265228e 1406 *
mcm 2:292a5265228e 1407 *
mcm 2:292a5265228e 1408 * @return Status of MC3635_SetRange.
mcm 2:292a5265228e 1409 *
mcm 2:292a5265228e 1410 *
mcm 2:292a5265228e 1411 *
mcm 2:292a5265228e 1412 * @author Manuel Caballero
mcm 2:292a5265228e 1413 * @date 30/May/2018
mcm 2:292a5265228e 1414 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 1415 * @pre N/A.
mcm 2:292a5265228e 1416 * @warning The device MUST be in STANDBY mode, the user has to call this function
mcm 2:292a5265228e 1417 * first: MC3635_SetStandbyMode.
mcm 2:292a5265228e 1418 */
mcm 2:292a5265228e 1419 MC3635::MC3635_status_t MC3635::MC3635_SetRange ( MC3635_range_c_range_t myRange )
mcm 2:292a5265228e 1420 {
mcm 2:292a5265228e 1421 char cmd[] = { RANGE_C, 0 };
mcm 2:292a5265228e 1422 uint32_t aux = 0;
mcm 2:292a5265228e 1423
mcm 2:292a5265228e 1424
mcm 2:292a5265228e 1425 // Get the register data
mcm 2:292a5265228e 1426 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 1427 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 1428
mcm 2:292a5265228e 1429 // Update the register data
mcm 2:292a5265228e 1430 cmd[1] &= ~RANGE_C_RANGE_MASK;
mcm 2:292a5265228e 1431 cmd[1] |= myRange;
mcm 2:292a5265228e 1432 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 1433
mcm 2:292a5265228e 1434
mcm 2:292a5265228e 1435
mcm 2:292a5265228e 1436
mcm 2:292a5265228e 1437 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 1438 return MC3635_SUCCESS;
mcm 2:292a5265228e 1439 else
mcm 2:292a5265228e 1440 return MC3635_FAILURE;
mcm 2:292a5265228e 1441 }
mcm 2:292a5265228e 1442
mcm 2:292a5265228e 1443
mcm 2:292a5265228e 1444
mcm 2:292a5265228e 1445 /**
mcm 2:292a5265228e 1446 * @brief MC3635_GetRange ( MC3635_data_t* )
mcm 2:292a5265228e 1447 *
mcm 2:292a5265228e 1448 * @details It gets the accelerometer range.
mcm 2:292a5265228e 1449 *
mcm 2:292a5265228e 1450 * @param[in] myResolution: Accelerometer Range.
mcm 2:292a5265228e 1451 *
mcm 2:292a5265228e 1452 * @param[out] N/A.
mcm 2:292a5265228e 1453 *
mcm 2:292a5265228e 1454 *
mcm 2:292a5265228e 1455 * @return Status of MC3635_GetRange.
mcm 2:292a5265228e 1456 *
mcm 2:292a5265228e 1457 *
mcm 2:292a5265228e 1458 *
mcm 2:292a5265228e 1459 * @author Manuel Caballero
mcm 2:292a5265228e 1460 * @date 30/May/2018
mcm 2:292a5265228e 1461 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 1462 * @pre N/A.
mcm 2:292a5265228e 1463 * @warning N/A.
mcm 2:292a5265228e 1464 */
mcm 2:292a5265228e 1465 MC3635::MC3635_status_t MC3635::MC3635_GetRange ( MC3635_data_t* myRange )
mcm 2:292a5265228e 1466 {
mcm 2:292a5265228e 1467 char cmd[] = { RANGE_C, 0 };
mcm 2:292a5265228e 1468 uint32_t aux = 0;
mcm 2:292a5265228e 1469
mcm 2:292a5265228e 1470
mcm 2:292a5265228e 1471 // Get the register data
mcm 2:292a5265228e 1472 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 1473 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 1474
mcm 2:292a5265228e 1475 // Parse the data
mcm 2:292a5265228e 1476 myRange->range = ( MC3635_range_c_range_t )( cmd[1] & RANGE_C_RANGE_MASK );
mcm 2:292a5265228e 1477
mcm 2:292a5265228e 1478
mcm 2:292a5265228e 1479
mcm 2:292a5265228e 1480 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 1481 return MC3635_SUCCESS;
mcm 2:292a5265228e 1482 else
mcm 2:292a5265228e 1483 return MC3635_FAILURE;
mcm 2:292a5265228e 1484 }
mcm 2:292a5265228e 1485
mcm 2:292a5265228e 1486
mcm 2:292a5265228e 1487
mcm 2:292a5265228e 1488 /**
mcm 2:292a5265228e 1489 * @brief MC3635_SetFIFO ( uint8_t , MC3635_fifo_c_fifo_mode_t )
mcm 2:292a5265228e 1490 *
mcm 2:292a5265228e 1491 * @details It sets the FIFO behavior.
mcm 2:292a5265228e 1492 *
mcm 2:292a5265228e 1493 * @param[in] myNumberOfSamples: Number of samples in the FIFO.
mcm 2:292a5265228e 1494 * @param[in] myFIFO_Mode: FIFO mode: Normal operation/Watermark.
mcm 2:292a5265228e 1495 *
mcm 2:292a5265228e 1496 * @param[out] N/A.
mcm 2:292a5265228e 1497 *
mcm 2:292a5265228e 1498 *
mcm 2:292a5265228e 1499 * @return Status of MC3635_SetFIFO.
mcm 2:292a5265228e 1500 *
mcm 2:292a5265228e 1501 *
mcm 2:292a5265228e 1502 *
mcm 2:292a5265228e 1503 * @author Manuel Caballero
mcm 2:292a5265228e 1504 * @date 30/May/2018
mcm 2:292a5265228e 1505 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 1506 * @pre N/A.
mcm 2:292a5265228e 1507 * @warning The device MUST be in STANDBY mode, the user has to call this function
mcm 2:292a5265228e 1508 * first: MC3635_SetStandbyMode.
mcm 2:292a5265228e 1509 */
mcm 2:292a5265228e 1510 MC3635::MC3635_status_t MC3635::MC3635_SetFIFO ( uint8_t myNumberOfSamples, MC3635_fifo_c_fifo_mode_t myFIFO_Mode )
mcm 2:292a5265228e 1511 {
mcm 2:292a5265228e 1512 char cmd[] = { FIFO_C, 0 };
mcm 2:292a5265228e 1513 uint32_t aux = 0;
mcm 2:292a5265228e 1514
mcm 2:292a5265228e 1515
mcm 2:292a5265228e 1516 // Check FIFO number of samples
mcm 2:292a5265228e 1517 if ( ( myNumberOfSamples < 1 ) || ( myNumberOfSamples > 31 ) ) {
mcm 2:292a5265228e 1518 return MC3635_FAILURE;
mcm 2:292a5265228e 1519 }
mcm 2:292a5265228e 1520
mcm 2:292a5265228e 1521 // Get the register data
mcm 2:292a5265228e 1522 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 1523 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 1524
mcm 2:292a5265228e 1525 // Update the register data
mcm 2:292a5265228e 1526 cmd[1] &= ~( FIFO_C_FIFO_TH_MASK | FIFO_C_FIFO_MODE_MASK );
mcm 2:292a5265228e 1527 cmd[1] |= ( myNumberOfSamples | myFIFO_Mode );
mcm 2:292a5265228e 1528 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 1529
mcm 2:292a5265228e 1530
mcm 2:292a5265228e 1531
mcm 2:292a5265228e 1532
mcm 2:292a5265228e 1533 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 1534 return MC3635_SUCCESS;
mcm 2:292a5265228e 1535 else
mcm 2:292a5265228e 1536 return MC3635_FAILURE;
mcm 2:292a5265228e 1537 }
mcm 2:292a5265228e 1538
mcm 2:292a5265228e 1539
mcm 2:292a5265228e 1540
mcm 2:292a5265228e 1541 /**
mcm 2:292a5265228e 1542 * @brief MC3635_EnableFIFO ( MC3635_fifo_c_fifo_en_t )
mcm 2:292a5265228e 1543 *
mcm 2:292a5265228e 1544 * @details It enables/disables the FIFO.
mcm 2:292a5265228e 1545 *
mcm 2:292a5265228e 1546 * @param[in] myFIFO_Enable: Enable/Disable FIFO.
mcm 2:292a5265228e 1547 *
mcm 2:292a5265228e 1548 * @param[out] N/A.
mcm 2:292a5265228e 1549 *
mcm 2:292a5265228e 1550 *
mcm 2:292a5265228e 1551 * @return Status of MC3635_EnableFIFO.
mcm 2:292a5265228e 1552 *
mcm 2:292a5265228e 1553 *
mcm 2:292a5265228e 1554 *
mcm 2:292a5265228e 1555 * @author Manuel Caballero
mcm 2:292a5265228e 1556 * @date 30/May/2018
mcm 2:292a5265228e 1557 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 1558 * @pre N/A.
mcm 2:292a5265228e 1559 * @warning The device MUST be in STANDBY mode, the user has to call this function
mcm 2:292a5265228e 1560 * first: MC3635_SetStandbyMode.
mcm 2:292a5265228e 1561 */
mcm 2:292a5265228e 1562 MC3635::MC3635_status_t MC3635::MC3635_EnableFIFO ( MC3635_fifo_c_fifo_en_t myFIFO_Enable )
mcm 2:292a5265228e 1563 {
mcm 2:292a5265228e 1564 char cmd[] = { FIFO_C, 0 };
mcm 2:292a5265228e 1565 uint32_t aux = 0;
mcm 2:292a5265228e 1566
mcm 2:292a5265228e 1567
mcm 2:292a5265228e 1568 // Get the register data
mcm 2:292a5265228e 1569 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 1570 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 1571
mcm 2:292a5265228e 1572 // Update the register data
mcm 2:292a5265228e 1573 cmd[1] &= ~FIFO_C_FIFO_EN_MASK;
mcm 2:292a5265228e 1574 cmd[1] |= myFIFO_Enable;
mcm 2:292a5265228e 1575 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 1576
mcm 2:292a5265228e 1577
mcm 2:292a5265228e 1578
mcm 2:292a5265228e 1579
mcm 2:292a5265228e 1580 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 1581 return MC3635_SUCCESS;
mcm 2:292a5265228e 1582 else
mcm 2:292a5265228e 1583 return MC3635_FAILURE;
mcm 2:292a5265228e 1584 }
mcm 2:292a5265228e 1585
mcm 2:292a5265228e 1586
mcm 2:292a5265228e 1587
mcm 2:292a5265228e 1588 /**
mcm 2:292a5265228e 1589 * @brief MC3635_ResetFIFO ( void )
mcm 2:292a5265228e 1590 *
mcm 2:292a5265228e 1591 * @details It resets the FIFO pointers.
mcm 2:292a5265228e 1592 *
mcm 2:292a5265228e 1593 * @param[in] N/A.
mcm 2:292a5265228e 1594 *
mcm 2:292a5265228e 1595 * @param[out] N/A.
mcm 2:292a5265228e 1596 *
mcm 2:292a5265228e 1597 *
mcm 2:292a5265228e 1598 * @return Status of MC3635_ResetFIFO.
mcm 2:292a5265228e 1599 *
mcm 2:292a5265228e 1600 *
mcm 2:292a5265228e 1601 *
mcm 2:292a5265228e 1602 * @author Manuel Caballero
mcm 2:292a5265228e 1603 * @date 30/May/2018
mcm 2:292a5265228e 1604 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 1605 * @pre N/A.
mcm 2:292a5265228e 1606 * @warning The device MUST be in STANDBY mode, the user has to call this function
mcm 2:292a5265228e 1607 * first: MC3635_SetStandbyMode.
mcm 2:292a5265228e 1608 */
mcm 2:292a5265228e 1609 MC3635::MC3635_status_t MC3635::MC3635_ResetFIFO ( void )
mcm 2:292a5265228e 1610 {
mcm 2:292a5265228e 1611 char cmd[] = { FIFO_C, 0 };
mcm 2:292a5265228e 1612 uint32_t aux = 0;
mcm 2:292a5265228e 1613
mcm 2:292a5265228e 1614
mcm 2:292a5265228e 1615 // Get the register data
mcm 2:292a5265228e 1616 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 1617 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 1618
mcm 2:292a5265228e 1619 // Update the register data
mcm 2:292a5265228e 1620 cmd[1] &= ~FIFO_C_FIFO_RESET_MASK;
mcm 2:292a5265228e 1621 cmd[1] |= FIFO_C_FIFO_RESET_ENABLED;
mcm 2:292a5265228e 1622 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 1623
mcm 2:292a5265228e 1624
mcm 2:292a5265228e 1625
mcm 2:292a5265228e 1626
mcm 2:292a5265228e 1627 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 1628 return MC3635_SUCCESS;
mcm 2:292a5265228e 1629 else
mcm 2:292a5265228e 1630 return MC3635_FAILURE;
mcm 2:292a5265228e 1631 }
mcm 2:292a5265228e 1632
mcm 2:292a5265228e 1633
mcm 2:292a5265228e 1634
mcm 2:292a5265228e 1635 /**
mcm 2:292a5265228e 1636 * @brief MC3635_GetGain ( MC3635_axis_t , MC3635_data_t* )
mcm 2:292a5265228e 1637 *
mcm 2:292a5265228e 1638 * @details It gets the gain for a certain axis.
mcm 2:292a5265228e 1639 *
mcm 2:292a5265228e 1640 * @param[in] myChosenAxis: Axis gain.
mcm 2:292a5265228e 1641 *
mcm 2:292a5265228e 1642 * @param[out] myGain: Gain itself.
mcm 2:292a5265228e 1643 *
mcm 2:292a5265228e 1644 *
mcm 2:292a5265228e 1645 * @return Status of MC3635_GetGain.
mcm 2:292a5265228e 1646 *
mcm 2:292a5265228e 1647 *
mcm 2:292a5265228e 1648 *
mcm 2:292a5265228e 1649 * @author Manuel Caballero
mcm 2:292a5265228e 1650 * @date 30/May/2018
mcm 2:292a5265228e 1651 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 1652 * @pre N/A.
mcm 2:292a5265228e 1653 * @warning N/A.
mcm 2:292a5265228e 1654 */
mcm 2:292a5265228e 1655 MC3635::MC3635_status_t MC3635::MC3635_GetGain ( MC3635_axis_t myChosenAxis, MC3635_data_t* myGain )
mcm 2:292a5265228e 1656 {
mcm 2:292a5265228e 1657 char cmd[] = { 0, 0 };
mcm 2:292a5265228e 1658 uint8_t myAuxReg1, myAuxReg2;
mcm 2:292a5265228e 1659 uint16_t myAuxGain = 0;
mcm 2:292a5265228e 1660 uint32_t aux = 0;
mcm 2:292a5265228e 1661
mcm 2:292a5265228e 1662
mcm 2:292a5265228e 1663 /* Select the right axis */
mcm 2:292a5265228e 1664 switch ( myChosenAxis ) {
mcm 2:292a5265228e 1665 case X_AXIS:
mcm 2:292a5265228e 1666 myAuxReg1 = XOFFH;
mcm 2:292a5265228e 1667 myAuxReg2 = XGAIN;
mcm 2:292a5265228e 1668 break;
mcm 2:292a5265228e 1669
mcm 2:292a5265228e 1670 case Y_AXIS:
mcm 2:292a5265228e 1671 myAuxReg1 = YOFFH;
mcm 2:292a5265228e 1672 myAuxReg2 = YGAIN;
mcm 2:292a5265228e 1673 break;
mcm 2:292a5265228e 1674
mcm 2:292a5265228e 1675 case Z_AXIS:
mcm 2:292a5265228e 1676 myAuxReg1 = ZOFFH;
mcm 2:292a5265228e 1677 myAuxReg2 = ZGAIN;
mcm 2:292a5265228e 1678 break;
mcm 2:292a5265228e 1679
mcm 2:292a5265228e 1680 default:
mcm 2:292a5265228e 1681 return MC3635_FAILURE;
mcm 2:292a5265228e 1682 //break;
mcm 2:292a5265228e 1683 }
mcm 2:292a5265228e 1684
mcm 2:292a5265228e 1685
mcm 2:292a5265228e 1686 /* MSB GAIN: Get the register data */
mcm 2:292a5265228e 1687 cmd[0] = myAuxReg1;
mcm 2:292a5265228e 1688 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 1689 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 1690
mcm 2:292a5265228e 1691
mcm 2:292a5265228e 1692 myAuxGain = ( cmd[1] & XGAINH_GAIN_MASK );
mcm 2:292a5265228e 1693 myAuxGain <<= 1;
mcm 2:292a5265228e 1694
mcm 2:292a5265228e 1695 /* LSB GAIN: Get the register data */
mcm 2:292a5265228e 1696 cmd[0] = myAuxReg2;
mcm 2:292a5265228e 1697 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 1698 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 1699
mcm 2:292a5265228e 1700
mcm 2:292a5265228e 1701 myAuxGain |= cmd[1];
mcm 2:292a5265228e 1702
mcm 2:292a5265228e 1703
mcm 2:292a5265228e 1704 /* Parse the data into the chosen axis */
mcm 2:292a5265228e 1705 switch ( myChosenAxis ) {
mcm 2:292a5265228e 1706 case X_AXIS:
mcm 2:292a5265228e 1707 myGain->XGAIN = myAuxGain;
mcm 2:292a5265228e 1708 break;
mcm 2:292a5265228e 1709
mcm 2:292a5265228e 1710 case Y_AXIS:
mcm 2:292a5265228e 1711 myGain->YGAIN = myAuxGain;
mcm 2:292a5265228e 1712 break;
mcm 2:292a5265228e 1713
mcm 2:292a5265228e 1714 case Z_AXIS:
mcm 2:292a5265228e 1715 myGain->ZGAIN = myAuxGain;
mcm 2:292a5265228e 1716 break;
mcm 2:292a5265228e 1717
mcm 2:292a5265228e 1718 default:
mcm 2:292a5265228e 1719 return MC3635_FAILURE;
mcm 2:292a5265228e 1720 //break;
mcm 2:292a5265228e 1721 }
mcm 2:292a5265228e 1722
mcm 2:292a5265228e 1723
mcm 2:292a5265228e 1724
mcm 2:292a5265228e 1725 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 1726 return MC3635_SUCCESS;
mcm 2:292a5265228e 1727 else
mcm 2:292a5265228e 1728 return MC3635_FAILURE;
mcm 2:292a5265228e 1729 }
mcm 2:292a5265228e 1730
mcm 2:292a5265228e 1731
mcm 2:292a5265228e 1732
mcm 2:292a5265228e 1733 /**
mcm 2:292a5265228e 1734 * @brief MC3635_GetOffset ( MC3635_axis_t , MC3635_data_t* )
mcm 2:292a5265228e 1735 *
mcm 2:292a5265228e 1736 * @details It gets the offset for a certain axis.
mcm 2:292a5265228e 1737 *
mcm 2:292a5265228e 1738 * @param[in] myChosenAxis: Axis gain.
mcm 2:292a5265228e 1739 *
mcm 2:292a5265228e 1740 * @param[out] myOffset: Offset itself.
mcm 2:292a5265228e 1741 *
mcm 2:292a5265228e 1742 *
mcm 2:292a5265228e 1743 * @return Status of MC3635_GetOffset.
mcm 2:292a5265228e 1744 *
mcm 2:292a5265228e 1745 *
mcm 2:292a5265228e 1746 *
mcm 2:292a5265228e 1747 * @author Manuel Caballero
mcm 2:292a5265228e 1748 * @date 30/May/2018
mcm 2:292a5265228e 1749 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 1750 * @pre N/A.
mcm 2:292a5265228e 1751 * @warning N/A.
mcm 2:292a5265228e 1752 */
mcm 2:292a5265228e 1753 MC3635::MC3635_status_t MC3635::MC3635_GetOffset ( MC3635_axis_t myChosenAxis, MC3635_data_t* myOffset )
mcm 2:292a5265228e 1754 {
mcm 2:292a5265228e 1755 char cmd[] = { 0, 0 };
mcm 2:292a5265228e 1756 uint8_t myAuxReg1, myAuxReg2;
mcm 2:292a5265228e 1757 int16_t myAuxOffset = 0;
mcm 2:292a5265228e 1758 uint32_t aux = 0;
mcm 2:292a5265228e 1759
mcm 2:292a5265228e 1760
mcm 2:292a5265228e 1761 /* Select the right axis */
mcm 2:292a5265228e 1762 switch ( myChosenAxis ) {
mcm 2:292a5265228e 1763 case X_AXIS:
mcm 2:292a5265228e 1764 myAuxReg1 = XOFFH;
mcm 2:292a5265228e 1765 myAuxReg2 = XOFFL;
mcm 2:292a5265228e 1766 break;
mcm 2:292a5265228e 1767
mcm 2:292a5265228e 1768 case Y_AXIS:
mcm 2:292a5265228e 1769 myAuxReg1 = YOFFH;
mcm 2:292a5265228e 1770 myAuxReg2 = YOFFL;
mcm 2:292a5265228e 1771 break;
mcm 2:292a5265228e 1772
mcm 2:292a5265228e 1773 case Z_AXIS:
mcm 2:292a5265228e 1774 myAuxReg1 = ZOFFH;
mcm 2:292a5265228e 1775 myAuxReg2 = ZOFFL;
mcm 2:292a5265228e 1776 break;
mcm 2:292a5265228e 1777
mcm 2:292a5265228e 1778 default:
mcm 2:292a5265228e 1779 return MC3635_FAILURE;
mcm 2:292a5265228e 1780 //break;
mcm 2:292a5265228e 1781 }
mcm 2:292a5265228e 1782
mcm 2:292a5265228e 1783
mcm 2:292a5265228e 1784 /* MSB OFFSET: Get the register data */
mcm 2:292a5265228e 1785 cmd[0] = myAuxReg1;
mcm 2:292a5265228e 1786 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 1787 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 1788
mcm 2:292a5265228e 1789
mcm 2:292a5265228e 1790 myAuxOffset = ( cmd[1] & XOFFH_MASK );
mcm 2:292a5265228e 1791 myAuxOffset <<= 8;
mcm 2:292a5265228e 1792
mcm 2:292a5265228e 1793
mcm 2:292a5265228e 1794 /* LSB OFFSET: Get the register data */
mcm 2:292a5265228e 1795 cmd[0] = myAuxReg2;
mcm 2:292a5265228e 1796 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 1797 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 1798
mcm 2:292a5265228e 1799
mcm 2:292a5265228e 1800 myAuxOffset |= cmd[1];
mcm 2:292a5265228e 1801
mcm 2:292a5265228e 1802
mcm 2:292a5265228e 1803 /* Parse the data into the chosen axis */
mcm 2:292a5265228e 1804 switch ( myChosenAxis ) {
mcm 2:292a5265228e 1805 case X_AXIS:
mcm 2:292a5265228e 1806 myOffset->XOffset = myAuxOffset;
mcm 2:292a5265228e 1807 break;
mcm 2:292a5265228e 1808
mcm 2:292a5265228e 1809 case Y_AXIS:
mcm 2:292a5265228e 1810 myOffset->YOffset = myAuxOffset;
mcm 2:292a5265228e 1811 break;
mcm 2:292a5265228e 1812
mcm 2:292a5265228e 1813 case Z_AXIS:
mcm 2:292a5265228e 1814 myOffset->ZOffset = myAuxOffset;
mcm 2:292a5265228e 1815 break;
mcm 2:292a5265228e 1816
mcm 2:292a5265228e 1817 default:
mcm 2:292a5265228e 1818 return MC3635_FAILURE;
mcm 2:292a5265228e 1819 //break;
mcm 2:292a5265228e 1820 }
mcm 2:292a5265228e 1821
mcm 2:292a5265228e 1822
mcm 2:292a5265228e 1823
mcm 2:292a5265228e 1824 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 1825 return MC3635_SUCCESS;
mcm 2:292a5265228e 1826 else
mcm 2:292a5265228e 1827 return MC3635_FAILURE;
mcm 2:292a5265228e 1828 }
mcm 2:292a5265228e 1829
mcm 2:292a5265228e 1830
mcm 2:292a5265228e 1831
mcm 2:292a5265228e 1832 /**
mcm 2:292a5265228e 1833 * @brief MC3635_Conf_INTN ( MC3635_intr_c_ipp_t , MC3635_intr_c_iah_t )
mcm 2:292a5265228e 1834 *
mcm 2:292a5265228e 1835 * @details It configures the interrupt pin mode and level control.
mcm 2:292a5265228e 1836 *
mcm 2:292a5265228e 1837 * @param[in] myINTN_ModeControl: INTN pin interrupt pin mode control.
mcm 2:292a5265228e 1838 * @param[in] myINTN_LevelControl: The active drive level of the INTN pin.
mcm 2:292a5265228e 1839 *
mcm 2:292a5265228e 1840 * @param[out] N/A.
mcm 2:292a5265228e 1841 *
mcm 2:292a5265228e 1842 *
mcm 2:292a5265228e 1843 * @return Status of MC3635_Conf_INTN.
mcm 2:292a5265228e 1844 *
mcm 2:292a5265228e 1845 *
mcm 2:292a5265228e 1846 *
mcm 2:292a5265228e 1847 * @author Manuel Caballero
mcm 2:292a5265228e 1848 * @date 30/May/2018
mcm 2:292a5265228e 1849 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 1850 * @pre N/A.
mcm 2:292a5265228e 1851 * @warning The device MUST be in STANDBY mode, the user has to call this function
mcm 2:292a5265228e 1852 * first: MC3635_SetStandbyMode.
mcm 2:292a5265228e 1853 */
mcm 2:292a5265228e 1854 MC3635::MC3635_status_t MC3635::MC3635_Conf_INTN ( MC3635_intr_c_ipp_t myINTN_ModeControl, MC3635_intr_c_iah_t myINTN_LevelControl )
mcm 2:292a5265228e 1855 {
mcm 2:292a5265228e 1856 char cmd[] = { INTR_C, 0 };
mcm 2:292a5265228e 1857 uint32_t aux = 0;
mcm 2:292a5265228e 1858
mcm 2:292a5265228e 1859
mcm 2:292a5265228e 1860 /* Get the register data */
mcm 2:292a5265228e 1861 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 1862 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 1863
mcm 2:292a5265228e 1864
mcm 2:292a5265228e 1865 /* Update the register data */
mcm 2:292a5265228e 1866 cmd[1] &= ~( INTR_C_IPP_MASK | INTR_C_IAH_MASK );
mcm 2:292a5265228e 1867 cmd[1] |= ( myINTN_ModeControl | myINTN_LevelControl );
mcm 2:292a5265228e 1868 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 1869
mcm 2:292a5265228e 1870
mcm 2:292a5265228e 1871
mcm 2:292a5265228e 1872 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 1873 return MC3635_SUCCESS;
mcm 2:292a5265228e 1874 else
mcm 2:292a5265228e 1875 return MC3635_FAILURE;
mcm 2:292a5265228e 1876 }
mcm 2:292a5265228e 1877
mcm 2:292a5265228e 1878
mcm 2:292a5265228e 1879
mcm 2:292a5265228e 1880 /**
mcm 2:292a5265228e 1881 * @brief MC3635_Set_INTN ( MC3635_intr_c_int_wake_t , MC3635_intr_c_int_acq_t , MC3635_intr_c_int_fifo_empty_t , MC3635_intr_c_int_fifo_full_t ,
mcm 2:292a5265228e 1882 * MC3635_intr_c_int_fifo_thresh_t , MC3635_intr_c_int_fifo_swake_t )
mcm 2:292a5265228e 1883 *
mcm 2:292a5265228e 1884 * @details It activates the interrupts on INTN pin.
mcm 2:292a5265228e 1885 *
mcm 2:292a5265228e 1886 * @param[in] myINT_WakeMode: WAKE interrupt (SNIFF to WAKE) enable.
mcm 2:292a5265228e 1887 * @param[in] myINT_ACQMode: Interrupt on sample or acquisition enable.
mcm 2:292a5265228e 1888 * @param[in] myINT_FIFO_EmptyMode: FIFO empty interrupt enable.
mcm 2:292a5265228e 1889 * @param[in] myINT_FIFO_FullMode: FIFO full interrupt enable.
mcm 2:292a5265228e 1890 * @param[in] myINT_FIFO_ThreshMode: FIFO threshold interrupt enable.
mcm 2:292a5265228e 1891 * @param[in] myINT_SwakeMode: This interrupt is valid only in SWAKE mode.
mcm 2:292a5265228e 1892 *
mcm 2:292a5265228e 1893 * @param[out] N/A.
mcm 2:292a5265228e 1894 *
mcm 2:292a5265228e 1895 *
mcm 2:292a5265228e 1896 * @return Status of MC3635_Set_INTN.
mcm 2:292a5265228e 1897 *
mcm 2:292a5265228e 1898 *
mcm 2:292a5265228e 1899 *
mcm 2:292a5265228e 1900 * @author Manuel Caballero
mcm 2:292a5265228e 1901 * @date 30/May/2018
mcm 2:292a5265228e 1902 * @version 30/May/2018 The ORIGIN
mcm 2:292a5265228e 1903 * @pre N/A.
mcm 2:292a5265228e 1904 * @warning The device MUST be in STANDBY mode, the user has to call this function
mcm 2:292a5265228e 1905 * first: MC3635_SetStandbyMode.
mcm 2:292a5265228e 1906 */
mcm 2:292a5265228e 1907 MC3635::MC3635_status_t MC3635::MC3635_Set_INTN ( MC3635_intr_c_int_wake_t myINT_WakeMode, MC3635_intr_c_int_acq_t myINT_ACQMode,
mcm 2:292a5265228e 1908 MC3635_intr_c_int_fifo_empty_t myINT_FIFO_EmptyMode, MC3635_intr_c_int_fifo_full_t myINT_FIFO_FullMode,
mcm 2:292a5265228e 1909 MC3635_intr_c_int_fifo_thresh_t myINT_FIFO_ThreshMode, MC3635_intr_c_int_fifo_swake_t myINT_SwakeMode )
mcm 2:292a5265228e 1910 {
mcm 2:292a5265228e 1911 char cmd[] = { INTR_C, 0 };
mcm 2:292a5265228e 1912 uint32_t aux = 0;
mcm 2:292a5265228e 1913
mcm 2:292a5265228e 1914
mcm 2:292a5265228e 1915 /* Get the register data */
mcm 2:292a5265228e 1916 aux = _i2c.write ( _MC3635_Addr, &cmd[0], 1, true );
mcm 2:292a5265228e 1917 aux = _i2c.read ( _MC3635_Addr, &cmd[1], 1 );
mcm 2:292a5265228e 1918
mcm 2:292a5265228e 1919
mcm 2:292a5265228e 1920 /* Update the register data */
mcm 2:292a5265228e 1921 cmd[1] &= ~( INTR_C_INT_WAKE_MASK | INTR_C_INT_ACQ_MASK | INTR_C_INT_FIFO_EMPTY_MASK | INTR_C_INT_FIFO_FULL_MASK | INTR_C_INT_FIFO_THRESH_MASK | INTR_C_INT_SWAKE_MASK );
mcm 2:292a5265228e 1922 cmd[1] |= ( myINT_WakeMode | myINT_ACQMode | myINT_FIFO_EmptyMode | myINT_FIFO_FullMode | myINT_FIFO_ThreshMode | myINT_SwakeMode );
mcm 2:292a5265228e 1923 aux = _i2c.write ( _MC3635_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:292a5265228e 1924
mcm 2:292a5265228e 1925
mcm 2:292a5265228e 1926
mcm 2:292a5265228e 1927 if ( aux == I2C_SUCCESS )
mcm 2:292a5265228e 1928 return MC3635_SUCCESS;
mcm 2:292a5265228e 1929 else
mcm 2:292a5265228e 1930 return MC3635_FAILURE;
mcm 2:292a5265228e 1931 }