3-Axis Digital Compass IC

Committer:
mcm
Date:
Fri Oct 13 15:44:23 2017 +0000
Revision:
4:f95da142fd3a
Parent:
2:e02c2a91d2ea
Minor changes, some comments were improved

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcm 2:e02c2a91d2ea 1 /**
mcm 2:e02c2a91d2ea 2 * @brief HMC5883L.h
mcm 2:e02c2a91d2ea 3 * @details 3-Axis Digital Compass IC.
mcm 2:e02c2a91d2ea 4 * Functions file.
mcm 2:e02c2a91d2ea 5 *
mcm 2:e02c2a91d2ea 6 *
mcm 2:e02c2a91d2ea 7 * @return NA
mcm 2:e02c2a91d2ea 8 *
mcm 2:e02c2a91d2ea 9 * @author Manuel Caballero
mcm 2:e02c2a91d2ea 10 * @date 13/October/2017
mcm 2:e02c2a91d2ea 11 * @version 13/October/2017 The ORIGIN
mcm 2:e02c2a91d2ea 12 * @pre NaN.
mcm 2:e02c2a91d2ea 13 * @warning NaN
mcm 2:e02c2a91d2ea 14 * @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ).
mcm 2:e02c2a91d2ea 15 */
mcm 2:e02c2a91d2ea 16
mcm 2:e02c2a91d2ea 17 #include "HMC5883L.h"
mcm 2:e02c2a91d2ea 18
mcm 2:e02c2a91d2ea 19
mcm 2:e02c2a91d2ea 20 HMC5883L::HMC5883L ( PinName sda, PinName scl, uint32_t addr, uint32_t freq )
mcm 2:e02c2a91d2ea 21 : _i2c ( sda, scl )
mcm 2:e02c2a91d2ea 22 , _HMC5883L_Addr ( addr )
mcm 2:e02c2a91d2ea 23 {
mcm 2:e02c2a91d2ea 24 _i2c.frequency( freq );
mcm 2:e02c2a91d2ea 25 }
mcm 2:e02c2a91d2ea 26
mcm 2:e02c2a91d2ea 27
mcm 2:e02c2a91d2ea 28 HMC5883L::~HMC5883L()
mcm 2:e02c2a91d2ea 29 {
mcm 2:e02c2a91d2ea 30 }
mcm 2:e02c2a91d2ea 31
mcm 2:e02c2a91d2ea 32
mcm 2:e02c2a91d2ea 33
mcm 2:e02c2a91d2ea 34 /**
mcm 2:e02c2a91d2ea 35 * @brief HMC5883L_Conf ( HMC5883L_register_list_t , HMC5883L_conf_reg_a_samples_t , HMC5883L_conf_reg_a_dor_t , HMC5883L_conf_reg_a_measurement_mode_t
mcm 2:e02c2a91d2ea 36 * HMC5883L_conf_reg_b_gain_t , HMC5883L_mode_register_high_speed_t , HMC5883L_mode_register_operation_mode_t )
mcm 2:e02c2a91d2ea 37 *
mcm 2:e02c2a91d2ea 38 * @details It configures the device.
mcm 2:e02c2a91d2ea 39 *
mcm 2:e02c2a91d2ea 40 * @param[in] mySamples: Number of average samples.
mcm 2:e02c2a91d2ea 41 * @param[in] myDataRate: Data output rate.
mcm 2:e02c2a91d2ea 42 * @param[in] myMeasurementMode: Measurement mode.
mcm 2:e02c2a91d2ea 43 * @param[in] myGain: Gain.
mcm 2:e02c2a91d2ea 44 * @param[in] myI2CMode: I2C High Speed / Normal speed.
mcm 2:e02c2a91d2ea 45 * @param[in] myOperationMode: Operation mode.
mcm 2:e02c2a91d2ea 46 *
mcm 2:e02c2a91d2ea 47 * @param[out] NaN.
mcm 2:e02c2a91d2ea 48 *
mcm 2:e02c2a91d2ea 49 *
mcm 2:e02c2a91d2ea 50 * @return Status of HMC5883L_Conf.
mcm 2:e02c2a91d2ea 51 *
mcm 2:e02c2a91d2ea 52 *
mcm 2:e02c2a91d2ea 53 * @author Manuel Caballero
mcm 2:e02c2a91d2ea 54 * @date 13/October/2017
mcm 2:e02c2a91d2ea 55 * @version 13/October/2017 The ORIGIN
mcm 2:e02c2a91d2ea 56 * @pre NaN
mcm 2:e02c2a91d2ea 57 * @warning NaN.
mcm 2:e02c2a91d2ea 58 */
mcm 2:e02c2a91d2ea 59 HMC5883L::HMC5883L_status_t HMC5883L::HMC5883L_Conf ( HMC5883L_conf_reg_a_samples_t mySamples, HMC5883L_conf_reg_a_dor_t myDataRate, HMC5883L_conf_reg_a_measurement_mode_t myMeasurementMode,
mcm 2:e02c2a91d2ea 60 HMC5883L_conf_reg_b_gain_t myGain, HMC5883L_mode_register_high_speed_t myI2CMode, HMC5883L_mode_register_operation_mode_t myOperationMode )
mcm 2:e02c2a91d2ea 61 {
mcm 2:e02c2a91d2ea 62 char cmd[] = { 0, 0 };
mcm 2:e02c2a91d2ea 63 uint32_t aux = 0;
mcm 2:e02c2a91d2ea 64
mcm 2:e02c2a91d2ea 65
mcm 2:e02c2a91d2ea 66 // CONFIGURATION REGISTER A
mcm 2:e02c2a91d2ea 67 cmd[0] = HMC5883L_CONFIGURATION_REGISTER_A;
mcm 2:e02c2a91d2ea 68
mcm 2:e02c2a91d2ea 69 // Number of Samples Averaged
mcm 2:e02c2a91d2ea 70 cmd[1] = mySamples;
mcm 2:e02c2a91d2ea 71
mcm 2:e02c2a91d2ea 72 // Data Output Rate Bits
mcm 2:e02c2a91d2ea 73 cmd[1] |= myDataRate;
mcm 2:e02c2a91d2ea 74
mcm 2:e02c2a91d2ea 75 // Measurement Configuration Bits
mcm 2:e02c2a91d2ea 76 cmd[1] |= myMeasurementMode;
mcm 2:e02c2a91d2ea 77
mcm 2:e02c2a91d2ea 78
mcm 2:e02c2a91d2ea 79 // Write the command to Configuration Register A
mcm 2:e02c2a91d2ea 80 aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 2 );
mcm 2:e02c2a91d2ea 81
mcm 2:e02c2a91d2ea 82
mcm 2:e02c2a91d2ea 83
mcm 2:e02c2a91d2ea 84 // CONFIGURATION REGISTER A
mcm 2:e02c2a91d2ea 85 cmd[0] = HMC5883L_CONFIGURATION_REGISTER_B;
mcm 2:e02c2a91d2ea 86
mcm 2:e02c2a91d2ea 87 // Gain Configuration Bits
mcm 2:e02c2a91d2ea 88 cmd[1] = myGain;
mcm 2:e02c2a91d2ea 89
mcm 2:e02c2a91d2ea 90 // Write the command to Configuration Register B
mcm 2:e02c2a91d2ea 91 aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 2 );
mcm 2:e02c2a91d2ea 92
mcm 2:e02c2a91d2ea 93
mcm 2:e02c2a91d2ea 94
mcm 2:e02c2a91d2ea 95 // MODE REGISTER
mcm 2:e02c2a91d2ea 96 cmd[0] = HMC5883L_MODE_REGISTER;
mcm 2:e02c2a91d2ea 97
mcm 2:e02c2a91d2ea 98 // High Speed I2C, 3400kHz
mcm 2:e02c2a91d2ea 99 cmd[1] = myI2CMode;
mcm 2:e02c2a91d2ea 100
mcm 2:e02c2a91d2ea 101 // Mode Select Bits
mcm 2:e02c2a91d2ea 102 cmd[1] |= myOperationMode;
mcm 2:e02c2a91d2ea 103
mcm 2:e02c2a91d2ea 104
mcm 2:e02c2a91d2ea 105 // Write the command to Mode Register
mcm 2:e02c2a91d2ea 106 aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 2 );
mcm 2:e02c2a91d2ea 107
mcm 2:e02c2a91d2ea 108
mcm 2:e02c2a91d2ea 109
mcm 2:e02c2a91d2ea 110
mcm 2:e02c2a91d2ea 111
mcm 2:e02c2a91d2ea 112 if ( aux == I2C_SUCCESS )
mcm 2:e02c2a91d2ea 113 return HMC5883L_SUCCESS;
mcm 2:e02c2a91d2ea 114 else
mcm 2:e02c2a91d2ea 115 return HMC5883L_FAILURE;
mcm 2:e02c2a91d2ea 116 }
mcm 2:e02c2a91d2ea 117
mcm 2:e02c2a91d2ea 118
mcm 2:e02c2a91d2ea 119
mcm 2:e02c2a91d2ea 120 /**
mcm 2:e02c2a91d2ea 121 * @brief HMC5883L_GetIdentificationRegister ( HMC5883L_register_list_t , HMC5883L_vector_data_t* )
mcm 2:e02c2a91d2ea 122 *
mcm 2:e02c2a91d2ea 123 * @details It gets the identification register.
mcm 2:e02c2a91d2ea 124 *
mcm 2:e02c2a91d2ea 125 * @param[in] myID_reg: Identification register to be read.
mcm 2:e02c2a91d2ea 126 *
mcm 2:e02c2a91d2ea 127 * @param[out] myID: Identification register value.
mcm 2:e02c2a91d2ea 128 *
mcm 2:e02c2a91d2ea 129 *
mcm 2:e02c2a91d2ea 130 * @return Status of HMC5883L_GetIdentificationRegister.
mcm 2:e02c2a91d2ea 131 *
mcm 2:e02c2a91d2ea 132 *
mcm 2:e02c2a91d2ea 133 * @author Manuel Caballero
mcm 2:e02c2a91d2ea 134 * @date 13/October/2017
mcm 2:e02c2a91d2ea 135 * @version 13/October/2017 The ORIGIN
mcm 2:e02c2a91d2ea 136 * @pre NaN
mcm 2:e02c2a91d2ea 137 * @warning NaN.
mcm 2:e02c2a91d2ea 138 */
mcm 2:e02c2a91d2ea 139 HMC5883L::HMC5883L_status_t HMC5883L::HMC5883L_GetIdentificationRegister ( HMC5883L_register_list_t myID_reg, HMC5883L_vector_data_t* myID )
mcm 2:e02c2a91d2ea 140 {
mcm 2:e02c2a91d2ea 141 char cmd = 0;
mcm 2:e02c2a91d2ea 142 uint32_t aux = 0;
mcm 2:e02c2a91d2ea 143
mcm 2:e02c2a91d2ea 144
mcm 2:e02c2a91d2ea 145 // Write the command
mcm 2:e02c2a91d2ea 146 cmd = myID_reg;
mcm 2:e02c2a91d2ea 147 aux = _i2c.write ( _HMC5883L_Addr, &cmd, 1, true );
mcm 2:e02c2a91d2ea 148
mcm 2:e02c2a91d2ea 149 // Read the data
mcm 2:e02c2a91d2ea 150 aux = _i2c.read ( _HMC5883L_Addr, &cmd, 1 );
mcm 2:e02c2a91d2ea 151
mcm 2:e02c2a91d2ea 152
mcm 2:e02c2a91d2ea 153
mcm 2:e02c2a91d2ea 154 // Choose which ID was requested
mcm 2:e02c2a91d2ea 155 switch ( myID_reg )
mcm 2:e02c2a91d2ea 156 {
mcm 2:e02c2a91d2ea 157 case HMC5883L_IDENTIFICATION_REGISTER_A:
mcm 2:e02c2a91d2ea 158 myID->IdentificationRegisterA = cmd;
mcm 2:e02c2a91d2ea 159 break;
mcm 2:e02c2a91d2ea 160
mcm 2:e02c2a91d2ea 161 case HMC5883L_IDENTIFICATION_REGISTER_B:
mcm 2:e02c2a91d2ea 162 myID->IdentificationRegisterB = cmd;
mcm 2:e02c2a91d2ea 163 break;
mcm 2:e02c2a91d2ea 164
mcm 2:e02c2a91d2ea 165 case HMC5883L_IDENTIFICATION_REGISTER_C:
mcm 2:e02c2a91d2ea 166 myID->IdentificationRegisterC = cmd;
mcm 2:e02c2a91d2ea 167 break;
mcm 2:e02c2a91d2ea 168
mcm 2:e02c2a91d2ea 169 default:
mcm 2:e02c2a91d2ea 170 return HMC5883L_FAILURE;
mcm 2:e02c2a91d2ea 171 }
mcm 2:e02c2a91d2ea 172
mcm 2:e02c2a91d2ea 173
mcm 2:e02c2a91d2ea 174
mcm 2:e02c2a91d2ea 175
mcm 2:e02c2a91d2ea 176 if ( aux == I2C_SUCCESS )
mcm 2:e02c2a91d2ea 177 return HMC5883L_SUCCESS;
mcm 2:e02c2a91d2ea 178 else
mcm 2:e02c2a91d2ea 179 return HMC5883L_FAILURE;
mcm 2:e02c2a91d2ea 180 }
mcm 2:e02c2a91d2ea 181
mcm 2:e02c2a91d2ea 182
mcm 2:e02c2a91d2ea 183
mcm 2:e02c2a91d2ea 184 /**
mcm 2:e02c2a91d2ea 185 * @brief HMC5883L_GetRawDataOutput ( HMC5883L_vector_data_t* )
mcm 2:e02c2a91d2ea 186 *
mcm 2:e02c2a91d2ea 187 * @details It gets X, Y and Z raw data output.
mcm 2:e02c2a91d2ea 188 *
mcm 2:e02c2a91d2ea 189 *
mcm 2:e02c2a91d2ea 190 * @param[out] myData: X, Y and Z raw data output.
mcm 2:e02c2a91d2ea 191 *
mcm 2:e02c2a91d2ea 192 *
mcm 2:e02c2a91d2ea 193 * @return Status of HMC5883L_GetRawDataOutput.
mcm 2:e02c2a91d2ea 194 *
mcm 2:e02c2a91d2ea 195 *
mcm 2:e02c2a91d2ea 196 * @author Manuel Caballero
mcm 2:e02c2a91d2ea 197 * @date 13/October/2017
mcm 2:e02c2a91d2ea 198 * @version 13/October/2017 The ORIGIN
mcm 2:e02c2a91d2ea 199 * @pre NaN
mcm 2:e02c2a91d2ea 200 * @warning NaN.
mcm 2:e02c2a91d2ea 201 */
mcm 2:e02c2a91d2ea 202 HMC5883L::HMC5883L_status_t HMC5883L::HMC5883L_GetRawDataOutput ( HMC5883L_vector_data_t* myData )
mcm 2:e02c2a91d2ea 203 {
mcm 2:e02c2a91d2ea 204 char cmd[] = { HMC5883L_DATA_OUTPUT_X_MSB, 0, 0, 0, 0, 0 };
mcm 2:e02c2a91d2ea 205 uint32_t aux = 0;
mcm 2:e02c2a91d2ea 206
mcm 2:e02c2a91d2ea 207
mcm 2:e02c2a91d2ea 208 // Write the command
mcm 2:e02c2a91d2ea 209 aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 1, true );
mcm 2:e02c2a91d2ea 210
mcm 2:e02c2a91d2ea 211 // Read all data
mcm 2:e02c2a91d2ea 212 aux = _i2c.read ( _HMC5883L_Addr, &cmd[0], 6 );
mcm 2:e02c2a91d2ea 213
mcm 2:e02c2a91d2ea 214
mcm 2:e02c2a91d2ea 215 // Parse the data
mcm 2:e02c2a91d2ea 216 myData->DataOutput_X = ( ( int16_t )( cmd[0] << 8 ) | ( int16_t )cmd[1] );
mcm 2:e02c2a91d2ea 217 myData->DataOutput_Y = ( ( int16_t )( cmd[2] << 8 ) | ( int16_t )cmd[3] );
mcm 2:e02c2a91d2ea 218 myData->DataOutput_Z = ( ( int16_t )( cmd[4] << 8 ) | ( int16_t )cmd[5] );
mcm 2:e02c2a91d2ea 219
mcm 2:e02c2a91d2ea 220
mcm 2:e02c2a91d2ea 221
mcm 2:e02c2a91d2ea 222
mcm 2:e02c2a91d2ea 223 if ( aux == I2C_SUCCESS )
mcm 2:e02c2a91d2ea 224 return HMC5883L_SUCCESS;
mcm 2:e02c2a91d2ea 225 else
mcm 2:e02c2a91d2ea 226 return HMC5883L_FAILURE;
mcm 2:e02c2a91d2ea 227 }
mcm 2:e02c2a91d2ea 228
mcm 2:e02c2a91d2ea 229
mcm 2:e02c2a91d2ea 230
mcm 2:e02c2a91d2ea 231 /**
mcm 2:e02c2a91d2ea 232 * @brief HMC5883L_GetCompensatedDataOutput ( HMC5883L_vector_data_t* , float , float , float )
mcm 2:e02c2a91d2ea 233 *
mcm 2:e02c2a91d2ea 234 * @details It gets X, Y and Z compensated data output.
mcm 2:e02c2a91d2ea 235 *
mcm 2:e02c2a91d2ea 236 * @param[in] myXOffset: X-axis Offset.
mcm 2:e02c2a91d2ea 237 * @param[in] myYOffset: Y-axis Offset.
mcm 2:e02c2a91d2ea 238 * @param[in] myZOffset: Z-axis Offset.
mcm 2:e02c2a91d2ea 239 *
mcm 2:e02c2a91d2ea 240 * @param[out] myData: X, Y and Z compensated data output.
mcm 2:e02c2a91d2ea 241 *
mcm 2:e02c2a91d2ea 242 *
mcm 2:e02c2a91d2ea 243 * @return Status of HMC5883L_GetCompensatedDataOutput.
mcm 2:e02c2a91d2ea 244 *
mcm 2:e02c2a91d2ea 245 *
mcm 2:e02c2a91d2ea 246 * @author Manuel Caballero
mcm 2:e02c2a91d2ea 247 * @date 13/October/2017
mcm 2:e02c2a91d2ea 248 * @version 13/October/2017 The ORIGIN
mcm 2:e02c2a91d2ea 249 * @pre The offset MUST be calculated previously, this driver does NOT support that functionality yet.
mcm 2:e02c2a91d2ea 250 * @warning NaN.
mcm 2:e02c2a91d2ea 251 */
mcm 2:e02c2a91d2ea 252 HMC5883L::HMC5883L_status_t HMC5883L::HMC5883L_GetCompensatedDataOutput ( HMC5883L_vector_data_t* myData, float myXOffset, float myYOffset, float myZOffset )
mcm 2:e02c2a91d2ea 253 {
mcm 2:e02c2a91d2ea 254 char cmd[] = { 0, 0, 0, 0, 0, 0 };
mcm 2:e02c2a91d2ea 255 uint32_t aux = 0;
mcm 2:e02c2a91d2ea 256 float myGain = 0.0;
mcm 2:e02c2a91d2ea 257
mcm 2:e02c2a91d2ea 258
mcm 2:e02c2a91d2ea 259
mcm 2:e02c2a91d2ea 260 // GET THE CURRENT GAIN
mcm 2:e02c2a91d2ea 261 cmd[0] = HMC5883L_CONFIGURATION_REGISTER_B;
mcm 2:e02c2a91d2ea 262
mcm 2:e02c2a91d2ea 263 // Write the command
mcm 2:e02c2a91d2ea 264 aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 1, true );
mcm 2:e02c2a91d2ea 265
mcm 2:e02c2a91d2ea 266 // Read the register
mcm 2:e02c2a91d2ea 267 aux = _i2c.read ( _HMC5883L_Addr, &cmd[0], 1 );
mcm 2:e02c2a91d2ea 268
mcm 2:e02c2a91d2ea 269
mcm 2:e02c2a91d2ea 270 // Check which gain is in use
mcm 2:e02c2a91d2ea 271 switch ( ( cmd[0] & CONF_REG_B_GAIN_MASK ) )
mcm 2:e02c2a91d2ea 272 {
mcm 2:e02c2a91d2ea 273 case CONF_REG_B_GAIN_0_88_GA:
mcm 2:e02c2a91d2ea 274 myGain = 0.73;
mcm 2:e02c2a91d2ea 275 break;
mcm 2:e02c2a91d2ea 276
mcm 2:e02c2a91d2ea 277 case CONF_REG_B_GAIN_1_3_GA:
mcm 2:e02c2a91d2ea 278 myGain = 0.92;
mcm 2:e02c2a91d2ea 279 break;
mcm 2:e02c2a91d2ea 280
mcm 2:e02c2a91d2ea 281 case CONF_REG_B_GAIN_1_9_GA:
mcm 2:e02c2a91d2ea 282 myGain = 1.22;
mcm 2:e02c2a91d2ea 283 break;
mcm 2:e02c2a91d2ea 284
mcm 2:e02c2a91d2ea 285 case CONF_REG_B_GAIN_2_5_GA:
mcm 2:e02c2a91d2ea 286 myGain = 1.52;
mcm 2:e02c2a91d2ea 287 break;
mcm 2:e02c2a91d2ea 288
mcm 2:e02c2a91d2ea 289 case CONF_REG_B_GAIN_4_0_GA:
mcm 2:e02c2a91d2ea 290 myGain = 2.27;
mcm 2:e02c2a91d2ea 291 break;
mcm 2:e02c2a91d2ea 292
mcm 2:e02c2a91d2ea 293 case CONF_REG_B_GAIN_4_7_GA:
mcm 2:e02c2a91d2ea 294 myGain = 2.56;
mcm 2:e02c2a91d2ea 295 break;
mcm 2:e02c2a91d2ea 296
mcm 2:e02c2a91d2ea 297 case CONF_REG_B_GAIN_5_6_GA:
mcm 2:e02c2a91d2ea 298 myGain = 3.03;
mcm 2:e02c2a91d2ea 299 break;
mcm 2:e02c2a91d2ea 300
mcm 2:e02c2a91d2ea 301 case CONF_REG_B_GAIN_8_1_GA:
mcm 2:e02c2a91d2ea 302 myGain = 4.35;
mcm 2:e02c2a91d2ea 303 break;
mcm 2:e02c2a91d2ea 304
mcm 2:e02c2a91d2ea 305 default:
mcm 2:e02c2a91d2ea 306 return HMC5883L_FAILURE;
mcm 2:e02c2a91d2ea 307 }
mcm 2:e02c2a91d2ea 308
mcm 2:e02c2a91d2ea 309
mcm 2:e02c2a91d2ea 310 // READ THE ACTUAL DATA OUTPUT
mcm 2:e02c2a91d2ea 311 cmd[0] = HMC5883L_DATA_OUTPUT_X_MSB;
mcm 2:e02c2a91d2ea 312
mcm 2:e02c2a91d2ea 313 // Write the command
mcm 2:e02c2a91d2ea 314 aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 1, true );
mcm 2:e02c2a91d2ea 315
mcm 2:e02c2a91d2ea 316 // Read all data
mcm 2:e02c2a91d2ea 317 aux = _i2c.read ( _HMC5883L_Addr, &cmd[0], 6 );
mcm 2:e02c2a91d2ea 318
mcm 2:e02c2a91d2ea 319
mcm 2:e02c2a91d2ea 320 // Parse the data
mcm 2:e02c2a91d2ea 321 myData->DataOutput_X = ( ( ( int16_t )( cmd[0] << 8 ) | ( int16_t )cmd[1] ) * myGain ) - myXOffset;
mcm 2:e02c2a91d2ea 322 myData->DataOutput_Y = ( ( ( int16_t )( cmd[2] << 8 ) | ( int16_t )cmd[3] ) * myGain ) - myYOffset;
mcm 2:e02c2a91d2ea 323 myData->DataOutput_Z = ( ( ( int16_t )( cmd[4] << 8 ) | ( int16_t )cmd[5] ) * myGain ) - myZOffset;
mcm 2:e02c2a91d2ea 324
mcm 2:e02c2a91d2ea 325
mcm 2:e02c2a91d2ea 326
mcm 2:e02c2a91d2ea 327
mcm 2:e02c2a91d2ea 328 if ( aux == I2C_SUCCESS )
mcm 2:e02c2a91d2ea 329 return HMC5883L_SUCCESS;
mcm 2:e02c2a91d2ea 330 else
mcm 2:e02c2a91d2ea 331 return HMC5883L_FAILURE;
mcm 2:e02c2a91d2ea 332 }
mcm 2:e02c2a91d2ea 333
mcm 2:e02c2a91d2ea 334
mcm 2:e02c2a91d2ea 335
mcm 2:e02c2a91d2ea 336 /**
mcm 2:e02c2a91d2ea 337 * @brief HMC5883L_GetStatus ( HMC5883L_vector_data_t* )
mcm 2:e02c2a91d2ea 338 *
mcm 2:e02c2a91d2ea 339 * @details It reads the status register.
mcm 2:e02c2a91d2ea 340 *
mcm 2:e02c2a91d2ea 341 * @param[in] NaN
mcm 2:e02c2a91d2ea 342 *
mcm 2:e02c2a91d2ea 343 * @param[out] myStatus: Current status of the device.
mcm 2:e02c2a91d2ea 344 *
mcm 2:e02c2a91d2ea 345 *
mcm 2:e02c2a91d2ea 346 * @return Status of HMC5883L_GetStatus.
mcm 2:e02c2a91d2ea 347 *
mcm 2:e02c2a91d2ea 348 *
mcm 2:e02c2a91d2ea 349 * @author Manuel Caballero
mcm 2:e02c2a91d2ea 350 * @date 13/October/2017
mcm 2:e02c2a91d2ea 351 * @version 13/October/2017 The ORIGIN
mcm 2:e02c2a91d2ea 352 * @pre NaN
mcm 2:e02c2a91d2ea 353 * @warning NaN.
mcm 2:e02c2a91d2ea 354 */
mcm 2:e02c2a91d2ea 355 HMC5883L::HMC5883L_status_t HMC5883L::HMC5883L_GetStatus ( HMC5883L_vector_data_t* myStatus )
mcm 2:e02c2a91d2ea 356 {
mcm 2:e02c2a91d2ea 357 char cmd = HMC5883L_STATUS_REGISTER;
mcm 2:e02c2a91d2ea 358 uint32_t aux = 0;
mcm 2:e02c2a91d2ea 359
mcm 2:e02c2a91d2ea 360
mcm 2:e02c2a91d2ea 361 // Write the command
mcm 2:e02c2a91d2ea 362 aux = _i2c.write ( _HMC5883L_Addr, &cmd, 1, true );
mcm 2:e02c2a91d2ea 363
mcm 2:e02c2a91d2ea 364 // Read the status register
mcm 2:e02c2a91d2ea 365 aux = _i2c.read ( _HMC5883L_Addr, &cmd, 1 );
mcm 2:e02c2a91d2ea 366
mcm 2:e02c2a91d2ea 367
mcm 2:e02c2a91d2ea 368 // Update the value
mcm 2:e02c2a91d2ea 369 myStatus->Status = cmd;
mcm 2:e02c2a91d2ea 370
mcm 2:e02c2a91d2ea 371
mcm 2:e02c2a91d2ea 372 if ( aux == I2C_SUCCESS )
mcm 2:e02c2a91d2ea 373 return HMC5883L_SUCCESS;
mcm 2:e02c2a91d2ea 374 else
mcm 2:e02c2a91d2ea 375 return HMC5883L_FAILURE;
mcm 2:e02c2a91d2ea 376 }
mcm 2:e02c2a91d2ea 377
mcm 2:e02c2a91d2ea 378
mcm 2:e02c2a91d2ea 379
mcm 2:e02c2a91d2ea 380 /**
mcm 2:e02c2a91d2ea 381 * @brief HMC5883L_ReadRegister ( HMC5883L_register_list_t , uint8_t* )
mcm 2:e02c2a91d2ea 382 *
mcm 2:e02c2a91d2ea 383 * @details It reads a register.
mcm 2:e02c2a91d2ea 384 *
mcm 2:e02c2a91d2ea 385 * @param[in] myRegister: The register to be read.
mcm 2:e02c2a91d2ea 386 *
mcm 2:e02c2a91d2ea 387 * @param[out] myRegisterData: The value of the register.
mcm 2:e02c2a91d2ea 388 *
mcm 2:e02c2a91d2ea 389 *
mcm 2:e02c2a91d2ea 390 * @return Status of HMC5883L_ReadRegister.
mcm 2:e02c2a91d2ea 391 *
mcm 2:e02c2a91d2ea 392 *
mcm 2:e02c2a91d2ea 393 * @author Manuel Caballero
mcm 2:e02c2a91d2ea 394 * @date 13/October/2017
mcm 2:e02c2a91d2ea 395 * @version 13/October/2017 The ORIGIN
mcm 2:e02c2a91d2ea 396 * @pre This function neither reads the OUTPUTs nor the Status register.
mcm 2:e02c2a91d2ea 397 * @warning NaN.
mcm 2:e02c2a91d2ea 398 */
mcm 2:e02c2a91d2ea 399 HMC5883L::HMC5883L_status_t HMC5883L::HMC5883L_ReadRegister ( HMC5883L_register_list_t myRegister, uint8_t* myRegisterData )
mcm 2:e02c2a91d2ea 400 {
mcm 2:e02c2a91d2ea 401 char cmd = 0;
mcm 2:e02c2a91d2ea 402 uint8_t aux = 0;
mcm 2:e02c2a91d2ea 403
mcm 2:e02c2a91d2ea 404
mcm 2:e02c2a91d2ea 405 // Only three register can be read: Configuration Register A, Configuration Register B and Mode Register
mcm 2:e02c2a91d2ea 406 // NOTE: This function neither reads the OUTPUTs nor the Status register
mcm 2:e02c2a91d2ea 407 if ( myRegister > HMC5883L_MODE_REGISTER )
mcm 2:e02c2a91d2ea 408 return HMC5883L_FAILURE;
mcm 2:e02c2a91d2ea 409
mcm 2:e02c2a91d2ea 410
mcm 2:e02c2a91d2ea 411 // Write the command
mcm 2:e02c2a91d2ea 412 cmd = *myRegisterData;
mcm 2:e02c2a91d2ea 413 aux = _i2c.write ( _HMC5883L_Addr, &cmd, 1, true );
mcm 2:e02c2a91d2ea 414
mcm 2:e02c2a91d2ea 415 // Read the register
mcm 2:e02c2a91d2ea 416 aux = _i2c.read ( _HMC5883L_Addr, &cmd, 1 );
mcm 2:e02c2a91d2ea 417
mcm 2:e02c2a91d2ea 418
mcm 2:e02c2a91d2ea 419 // Update the value
mcm 2:e02c2a91d2ea 420 *myRegisterData = cmd;
mcm 2:e02c2a91d2ea 421
mcm 2:e02c2a91d2ea 422
mcm 2:e02c2a91d2ea 423
mcm 2:e02c2a91d2ea 424 if ( aux == I2C_SUCCESS )
mcm 2:e02c2a91d2ea 425 return HMC5883L_SUCCESS;
mcm 2:e02c2a91d2ea 426 else
mcm 2:e02c2a91d2ea 427 return HMC5883L_FAILURE;
mcm 2:e02c2a91d2ea 428 }
mcm 2:e02c2a91d2ea 429
mcm 2:e02c2a91d2ea 430
mcm 2:e02c2a91d2ea 431
mcm 2:e02c2a91d2ea 432 /**
mcm 2:e02c2a91d2ea 433 * @brief HMC5883L_SetNumSample ( HMC5883L_conf_reg_a_samples_t )
mcm 2:e02c2a91d2ea 434 *
mcm 2:e02c2a91d2ea 435 * @details It configures the number of samples averaged.
mcm 2:e02c2a91d2ea 436 *
mcm 2:e02c2a91d2ea 437 * @param[in] mySamples: New Number of samples averaged.
mcm 2:e02c2a91d2ea 438 *
mcm 2:e02c2a91d2ea 439 * @param[out] NaN.
mcm 2:e02c2a91d2ea 440 *
mcm 2:e02c2a91d2ea 441 *
mcm 2:e02c2a91d2ea 442 * @return Status of HMC5883L_SetNumSample.
mcm 2:e02c2a91d2ea 443 *
mcm 2:e02c2a91d2ea 444 *
mcm 2:e02c2a91d2ea 445 * @author Manuel Caballero
mcm 2:e02c2a91d2ea 446 * @date 13/October/2017
mcm 2:e02c2a91d2ea 447 * @version 13/October/2017 The ORIGIN
mcm 2:e02c2a91d2ea 448 * @pre NaN.
mcm 2:e02c2a91d2ea 449 * @warning NaN.
mcm 2:e02c2a91d2ea 450 */
mcm 2:e02c2a91d2ea 451 HMC5883L::HMC5883L_status_t HMC5883L::HMC5883L_SetNumSample ( HMC5883L_conf_reg_a_samples_t mySamples )
mcm 2:e02c2a91d2ea 452 {
mcm 2:e02c2a91d2ea 453 char cmd[] = { HMC5883L_CONFIGURATION_REGISTER_A, 0 };
mcm 2:e02c2a91d2ea 454 uint32_t aux = 0;
mcm 2:e02c2a91d2ea 455
mcm 2:e02c2a91d2ea 456
mcm 2:e02c2a91d2ea 457
mcm 2:e02c2a91d2ea 458 // Write the command
mcm 2:e02c2a91d2ea 459 aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 1, true );
mcm 2:e02c2a91d2ea 460
mcm 2:e02c2a91d2ea 461 // Read the configuration register A
mcm 2:e02c2a91d2ea 462 aux = _i2c.read ( _HMC5883L_Addr, &cmd[1], 1 );
mcm 2:e02c2a91d2ea 463
mcm 2:e02c2a91d2ea 464
mcm 2:e02c2a91d2ea 465 // Check if they are different, if so, update the value
mcm 2:e02c2a91d2ea 466 if ( ( cmd[1] & CONF_REG_A_SAMPLE_MASK ) != mySamples )
mcm 2:e02c2a91d2ea 467 {
mcm 2:e02c2a91d2ea 468 cmd[0] = HMC5883L_CONFIGURATION_REGISTER_A;
mcm 2:e02c2a91d2ea 469
mcm 2:e02c2a91d2ea 470 // Mask [ MA1 to MA0 ] Number of Samples
mcm 2:e02c2a91d2ea 471 cmd[1] &= ~CONF_REG_A_SAMPLE_MASK;
mcm 2:e02c2a91d2ea 472
mcm 2:e02c2a91d2ea 473 // Update number of samples
mcm 2:e02c2a91d2ea 474 cmd[1] |= mySamples;
mcm 2:e02c2a91d2ea 475
mcm 2:e02c2a91d2ea 476 // Write the new value
mcm 2:e02c2a91d2ea 477 aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 2 );
mcm 2:e02c2a91d2ea 478 }
mcm 2:e02c2a91d2ea 479
mcm 2:e02c2a91d2ea 480
mcm 2:e02c2a91d2ea 481
mcm 2:e02c2a91d2ea 482
mcm 2:e02c2a91d2ea 483 if ( aux == I2C_SUCCESS )
mcm 2:e02c2a91d2ea 484 return HMC5883L_SUCCESS;
mcm 2:e02c2a91d2ea 485 else
mcm 2:e02c2a91d2ea 486 return HMC5883L_FAILURE;
mcm 2:e02c2a91d2ea 487 }
mcm 2:e02c2a91d2ea 488
mcm 2:e02c2a91d2ea 489
mcm 2:e02c2a91d2ea 490
mcm 2:e02c2a91d2ea 491 /**
mcm 2:e02c2a91d2ea 492 * @brief HMC5883L_SetDataRate ( HMC5883L_conf_reg_a_dor_t )
mcm 2:e02c2a91d2ea 493 *
mcm 2:e02c2a91d2ea 494 * @details It configures the data rate.
mcm 2:e02c2a91d2ea 495 *
mcm 2:e02c2a91d2ea 496 * @param[in] myDataRate: New data rate.
mcm 2:e02c2a91d2ea 497 *
mcm 2:e02c2a91d2ea 498 * @param[out] NaN.
mcm 2:e02c2a91d2ea 499 *
mcm 2:e02c2a91d2ea 500 *
mcm 2:e02c2a91d2ea 501 * @return Status of HMC5883L_SetDataRate.
mcm 2:e02c2a91d2ea 502 *
mcm 2:e02c2a91d2ea 503 *
mcm 2:e02c2a91d2ea 504 * @author Manuel Caballero
mcm 2:e02c2a91d2ea 505 * @date 13/October/2017
mcm 2:e02c2a91d2ea 506 * @version 13/October/2017 The ORIGIN
mcm 2:e02c2a91d2ea 507 * @pre NaN.
mcm 2:e02c2a91d2ea 508 * @warning NaN.
mcm 2:e02c2a91d2ea 509 */
mcm 2:e02c2a91d2ea 510 HMC5883L::HMC5883L_status_t HMC5883L::HMC5883L_SetDataRate ( HMC5883L_conf_reg_a_dor_t myDataRate )
mcm 2:e02c2a91d2ea 511 {
mcm 2:e02c2a91d2ea 512 char cmd[] = { HMC5883L_CONFIGURATION_REGISTER_A, 0 };
mcm 2:e02c2a91d2ea 513 uint32_t aux = 0;
mcm 2:e02c2a91d2ea 514
mcm 2:e02c2a91d2ea 515
mcm 2:e02c2a91d2ea 516
mcm 2:e02c2a91d2ea 517 // Write the command
mcm 2:e02c2a91d2ea 518 aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 1, true );
mcm 2:e02c2a91d2ea 519
mcm 2:e02c2a91d2ea 520 // Read the configuration register A
mcm 2:e02c2a91d2ea 521 aux = _i2c.read ( _HMC5883L_Addr, &cmd[1], 1 );
mcm 2:e02c2a91d2ea 522
mcm 2:e02c2a91d2ea 523
mcm 2:e02c2a91d2ea 524 // Check if they are different, if so, update the value
mcm 2:e02c2a91d2ea 525 if ( ( cmd[1] & CONF_REG_A_DATARATE_MASK ) != myDataRate )
mcm 2:e02c2a91d2ea 526 {
mcm 2:e02c2a91d2ea 527 cmd[0] = HMC5883L_CONFIGURATION_REGISTER_A;
mcm 2:e02c2a91d2ea 528
mcm 2:e02c2a91d2ea 529 // Mask [ DO2 to DO0 ] Data Output Rate Bits
mcm 2:e02c2a91d2ea 530 cmd[1] &= ~CONF_REG_A_DATARATE_MASK;
mcm 2:e02c2a91d2ea 531
mcm 2:e02c2a91d2ea 532 // Update Data Output Rate Bits
mcm 2:e02c2a91d2ea 533 cmd[1] |= myDataRate;
mcm 2:e02c2a91d2ea 534
mcm 2:e02c2a91d2ea 535 // Write the new value
mcm 2:e02c2a91d2ea 536 aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 2 );
mcm 2:e02c2a91d2ea 537 }
mcm 2:e02c2a91d2ea 538
mcm 2:e02c2a91d2ea 539
mcm 2:e02c2a91d2ea 540
mcm 2:e02c2a91d2ea 541
mcm 2:e02c2a91d2ea 542 if ( aux == I2C_SUCCESS )
mcm 2:e02c2a91d2ea 543 return HMC5883L_SUCCESS;
mcm 2:e02c2a91d2ea 544 else
mcm 2:e02c2a91d2ea 545 return HMC5883L_FAILURE;
mcm 2:e02c2a91d2ea 546 }
mcm 2:e02c2a91d2ea 547
mcm 2:e02c2a91d2ea 548
mcm 2:e02c2a91d2ea 549
mcm 2:e02c2a91d2ea 550 /**
mcm 2:e02c2a91d2ea 551 * @brief HMC5883L_SetMeasurementConf ( HMC5883L_conf_reg_a_measurement_mode_t )
mcm 2:e02c2a91d2ea 552 *
mcm 2:e02c2a91d2ea 553 * @details It configures the measurement configuration bits.
mcm 2:e02c2a91d2ea 554 *
mcm 2:e02c2a91d2ea 555 * @param[in] myMeasurementMode: New measurement mode.
mcm 2:e02c2a91d2ea 556 *
mcm 2:e02c2a91d2ea 557 * @param[out] NaN.
mcm 2:e02c2a91d2ea 558 *
mcm 2:e02c2a91d2ea 559 *
mcm 2:e02c2a91d2ea 560 * @return Status of HMC5883L_SetMeasurementConf.
mcm 2:e02c2a91d2ea 561 *
mcm 2:e02c2a91d2ea 562 *
mcm 2:e02c2a91d2ea 563 * @author Manuel Caballero
mcm 2:e02c2a91d2ea 564 * @date 13/October/2017
mcm 2:e02c2a91d2ea 565 * @version 13/October/2017 The ORIGIN
mcm 2:e02c2a91d2ea 566 * @pre NaN.
mcm 2:e02c2a91d2ea 567 * @warning NaN.
mcm 2:e02c2a91d2ea 568 */
mcm 2:e02c2a91d2ea 569 HMC5883L::HMC5883L_status_t HMC5883L::HMC5883L_SetMeasurementConf ( HMC5883L_conf_reg_a_measurement_mode_t myMeasurementMode )
mcm 2:e02c2a91d2ea 570 {
mcm 2:e02c2a91d2ea 571 char cmd[] = { HMC5883L_CONFIGURATION_REGISTER_A, 0 };
mcm 2:e02c2a91d2ea 572 uint32_t aux = 0;
mcm 2:e02c2a91d2ea 573
mcm 2:e02c2a91d2ea 574
mcm 2:e02c2a91d2ea 575
mcm 2:e02c2a91d2ea 576 // Write the command
mcm 2:e02c2a91d2ea 577 aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 1, true );
mcm 2:e02c2a91d2ea 578
mcm 2:e02c2a91d2ea 579 // Read the configuration register A
mcm 2:e02c2a91d2ea 580 aux = _i2c.read ( _HMC5883L_Addr, &cmd[1], 1 );
mcm 2:e02c2a91d2ea 581
mcm 2:e02c2a91d2ea 582
mcm 2:e02c2a91d2ea 583 // Check if they are different, if so, update the value
mcm 2:e02c2a91d2ea 584 if ( ( cmd[1] & CONF_REG_A_MODE_MASK ) != myMeasurementMode )
mcm 2:e02c2a91d2ea 585 {
mcm 2:e02c2a91d2ea 586 cmd[0] = HMC5883L_CONFIGURATION_REGISTER_A;
mcm 2:e02c2a91d2ea 587
mcm 2:e02c2a91d2ea 588 // Mask [ MS1 to MS0 ] Measurement Configuration Bits
mcm 2:e02c2a91d2ea 589 cmd[1] &= ~CONF_REG_A_MODE_MASK;
mcm 2:e02c2a91d2ea 590
mcm 2:e02c2a91d2ea 591 // Update Measurement Configuration Bits
mcm 2:e02c2a91d2ea 592 cmd[1] |= myMeasurementMode;
mcm 2:e02c2a91d2ea 593
mcm 2:e02c2a91d2ea 594 // Write the new value
mcm 2:e02c2a91d2ea 595 aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 2 );
mcm 2:e02c2a91d2ea 596 }
mcm 2:e02c2a91d2ea 597
mcm 2:e02c2a91d2ea 598
mcm 2:e02c2a91d2ea 599
mcm 2:e02c2a91d2ea 600
mcm 2:e02c2a91d2ea 601 if ( aux == I2C_SUCCESS )
mcm 2:e02c2a91d2ea 602 return HMC5883L_SUCCESS;
mcm 2:e02c2a91d2ea 603 else
mcm 2:e02c2a91d2ea 604 return HMC5883L_FAILURE;
mcm 2:e02c2a91d2ea 605 }
mcm 2:e02c2a91d2ea 606
mcm 2:e02c2a91d2ea 607
mcm 2:e02c2a91d2ea 608
mcm 2:e02c2a91d2ea 609 /**
mcm 2:e02c2a91d2ea 610 * @brief HMC5883L_SetGain ( HMC5883L_conf_reg_b_gain_t )
mcm 2:e02c2a91d2ea 611 *
mcm 2:e02c2a91d2ea 612 * @details It configures the gain/resolution.
mcm 2:e02c2a91d2ea 613 *
mcm 2:e02c2a91d2ea 614 * @param[in] myGain: New gain/resolution.
mcm 2:e02c2a91d2ea 615 *
mcm 2:e02c2a91d2ea 616 * @param[out] NaN.
mcm 2:e02c2a91d2ea 617 *
mcm 2:e02c2a91d2ea 618 *
mcm 2:e02c2a91d2ea 619 * @return Status of HMC5883L_SetGain.
mcm 2:e02c2a91d2ea 620 *
mcm 2:e02c2a91d2ea 621 *
mcm 2:e02c2a91d2ea 622 * @author Manuel Caballero
mcm 2:e02c2a91d2ea 623 * @date 13/October/2017
mcm 2:e02c2a91d2ea 624 * @version 13/October/2017 The ORIGIN
mcm 2:e02c2a91d2ea 625 * @pre NaN.
mcm 2:e02c2a91d2ea 626 * @warning NaN.
mcm 2:e02c2a91d2ea 627 */
mcm 2:e02c2a91d2ea 628 HMC5883L::HMC5883L_status_t HMC5883L::HMC5883L_SetGain ( HMC5883L_conf_reg_b_gain_t myGain )
mcm 2:e02c2a91d2ea 629 {
mcm 2:e02c2a91d2ea 630 char cmd[] = { HMC5883L_CONFIGURATION_REGISTER_B , 0 };
mcm 2:e02c2a91d2ea 631 uint32_t aux = 0;
mcm 2:e02c2a91d2ea 632
mcm 2:e02c2a91d2ea 633
mcm 2:e02c2a91d2ea 634
mcm 2:e02c2a91d2ea 635 // Write the command
mcm 2:e02c2a91d2ea 636 aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 1, true );
mcm 2:e02c2a91d2ea 637
mcm 2:e02c2a91d2ea 638 // Read the configuration register B
mcm 2:e02c2a91d2ea 639 aux = _i2c.read ( _HMC5883L_Addr, &cmd[1], 1 );
mcm 2:e02c2a91d2ea 640
mcm 2:e02c2a91d2ea 641
mcm 2:e02c2a91d2ea 642 // Check if they are different, if so, update the value
mcm 2:e02c2a91d2ea 643 if ( ( cmd[1] & CONF_REG_B_GAIN_MASK ) != myGain )
mcm 2:e02c2a91d2ea 644 {
mcm 2:e02c2a91d2ea 645 cmd[0] = HMC5883L_CONFIGURATION_REGISTER_B;
mcm 2:e02c2a91d2ea 646
mcm 2:e02c2a91d2ea 647 // Mask [ GN2 to GN0 ] Gain Configuration Bits
mcm 2:e02c2a91d2ea 648 cmd[1] &= ~CONF_REG_B_GAIN_MASK;
mcm 2:e02c2a91d2ea 649
mcm 2:e02c2a91d2ea 650 // Update Gain Configuration Bits
mcm 2:e02c2a91d2ea 651 cmd[1] |= myGain;
mcm 2:e02c2a91d2ea 652
mcm 2:e02c2a91d2ea 653 // Write the new value
mcm 2:e02c2a91d2ea 654 aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 2 );
mcm 2:e02c2a91d2ea 655 }
mcm 2:e02c2a91d2ea 656
mcm 2:e02c2a91d2ea 657
mcm 2:e02c2a91d2ea 658
mcm 2:e02c2a91d2ea 659
mcm 2:e02c2a91d2ea 660 if ( aux == I2C_SUCCESS )
mcm 2:e02c2a91d2ea 661 return HMC5883L_SUCCESS;
mcm 2:e02c2a91d2ea 662 else
mcm 2:e02c2a91d2ea 663 return HMC5883L_FAILURE;
mcm 2:e02c2a91d2ea 664 }
mcm 2:e02c2a91d2ea 665
mcm 2:e02c2a91d2ea 666
mcm 2:e02c2a91d2ea 667
mcm 2:e02c2a91d2ea 668 /**
mcm 2:e02c2a91d2ea 669 * @brief HMC5883L_SetMode ( HMC5883L_mode_register_operation_mode_t )
mcm 2:e02c2a91d2ea 670 *
mcm 2:e02c2a91d2ea 671 * @details It configures the operation mode.
mcm 2:e02c2a91d2ea 672 *
mcm 2:e02c2a91d2ea 673 * @param[in] myOperationMode: New operation mode.
mcm 2:e02c2a91d2ea 674 *
mcm 2:e02c2a91d2ea 675 * @param[out] NaN.
mcm 2:e02c2a91d2ea 676 *
mcm 2:e02c2a91d2ea 677 *
mcm 2:e02c2a91d2ea 678 * @return Status of HMC5883L_SetMode.
mcm 2:e02c2a91d2ea 679 *
mcm 2:e02c2a91d2ea 680 *
mcm 2:e02c2a91d2ea 681 * @author Manuel Caballero
mcm 2:e02c2a91d2ea 682 * @date 13/October/2017
mcm 2:e02c2a91d2ea 683 * @version 13/October/2017 The ORIGIN
mcm 2:e02c2a91d2ea 684 * @pre NaN.
mcm 2:e02c2a91d2ea 685 * @warning NaN.
mcm 2:e02c2a91d2ea 686 */
mcm 2:e02c2a91d2ea 687 HMC5883L::HMC5883L_status_t HMC5883L::HMC5883L_SetMode ( HMC5883L_mode_register_operation_mode_t myOperationMode )
mcm 2:e02c2a91d2ea 688 {
mcm 2:e02c2a91d2ea 689 char cmd[] = { HMC5883L_MODE_REGISTER, 0 };
mcm 2:e02c2a91d2ea 690 uint32_t aux = 0;
mcm 2:e02c2a91d2ea 691
mcm 2:e02c2a91d2ea 692
mcm 2:e02c2a91d2ea 693
mcm 2:e02c2a91d2ea 694 // Write the command
mcm 2:e02c2a91d2ea 695 aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 1, true );
mcm 2:e02c2a91d2ea 696
mcm 2:e02c2a91d2ea 697 // Read the Mode register bit
mcm 2:e02c2a91d2ea 698 aux = _i2c.read ( _HMC5883L_Addr, &cmd[1], 1 );
mcm 2:e02c2a91d2ea 699
mcm 2:e02c2a91d2ea 700
mcm 2:e02c2a91d2ea 701 // Check if they are different, if so, update the value
mcm 2:e02c2a91d2ea 702 if ( ( cmd[1] & MODE_REG_MODE_MASK ) != myOperationMode )
mcm 2:e02c2a91d2ea 703 {
mcm 2:e02c2a91d2ea 704 cmd[0] = HMC5883L_MODE_REGISTER;
mcm 2:e02c2a91d2ea 705
mcm 2:e02c2a91d2ea 706 // Mask [ MD1 to MD0 ] Mode Select Bits
mcm 2:e02c2a91d2ea 707 cmd[1] &= ~MODE_REG_MODE_MASK;
mcm 2:e02c2a91d2ea 708
mcm 2:e02c2a91d2ea 709 // Update Mode Select Bits
mcm 2:e02c2a91d2ea 710 cmd[1] |= myOperationMode;
mcm 2:e02c2a91d2ea 711
mcm 2:e02c2a91d2ea 712 // Write the new value
mcm 2:e02c2a91d2ea 713 aux = _i2c.write ( _HMC5883L_Addr, &cmd[0], 2 );
mcm 2:e02c2a91d2ea 714 }
mcm 2:e02c2a91d2ea 715
mcm 2:e02c2a91d2ea 716
mcm 2:e02c2a91d2ea 717
mcm 2:e02c2a91d2ea 718
mcm 2:e02c2a91d2ea 719 if ( aux == I2C_SUCCESS )
mcm 2:e02c2a91d2ea 720 return HMC5883L_SUCCESS;
mcm 2:e02c2a91d2ea 721 else
mcm 2:e02c2a91d2ea 722 return HMC5883L_FAILURE;
mcm 2:e02c2a91d2ea 723 }