3-Axis Digital Compass IC
HMC5883L.cpp@4:f95da142fd3a, 2017-10-13 (annotated)
- 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?
User | Revision | Line number | New 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 | } |